【问题标题】:Java JButton stylingJava JButton 样式
【发布时间】:2012-02-15 23:43:36
【问题描述】:

有没有人尝试将 JButton 设置为看起来像 NetBeans 工具栏按钮?那将只显示一张图片,当您将鼠标悬停在它上面时,会显示一个 1px 圆形灰色边框,并且按钮顶部和底部的背景不同......似乎无法设置 JButton 那样的样式.... 有什么建议么?谢谢!


左:正常
中间:悬停
右:焦点

我什至不需要半个背景,只是无法在悬停时绘制边框......

【问题讨论】:

  • "有什么建议吗?" 发布屏幕截图(裁剪到一两个按钮,而不是高分辨率屏幕上的整个编辑器大小)。
  • 这是一个给netbeans开发人员的问题,因此他们可以看到工具栏按钮在那里的样子。我没有按钮的屏幕截图,因为我无法接近这些按钮的样式...
  • 如果您可以将 Netbeans 带到屏幕上,请获取其按钮的屏幕截图!
  • 你去...不要伤害你自己的头撞在桌子上... ;)
  • 他们在使用键盘集中注意力时也会这样吗?

标签: java swing netbeans


【解决方案1】:
JButton.setRolloverEnabled(true);

应该做你想做的。

如果您想要一个不同的“翻转”图标,您可以使用setRolloverIcon()setRolloverSelectedIcon() 方法分配它。

【讨论】:

    【解决方案2】:

    这个实现怎么样?我引用了另一个 question 并添加了一个名为 netbeans.png 的小绿色三角形,我从谷歌中找到了该三角形。但是,有一个小的 TODO 部分适合您;-) 一旦按钮获得焦点,在哪里绘制具有不同背景的边框。我希望你喜欢这个答案。

    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.Shape;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.geom.Area;
    import java.awt.geom.RoundRectangle2D;
    import java.net.URL;
    
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    public class StylistButton extends JButton implements MouseListener
    {
        boolean mouseIn = false;
    
        public StylistButton(String s)
        {
            addMouseListener(this);
            setBorderPainted(false);
            setContentAreaFilled(false);        
        }
    
        protected static ImageIcon createImageIcon(String path)
        {
            URL imgURL = TextSamplerDemo.class.getResource(path);
            if (imgURL != null)
            {
                return new ImageIcon(imgURL);
            }
            else
            {
                System.err.println("Couldn't find file: " + path);
                return null;
            }
        }   
    
    
        protected void paintComponent(Graphics g)
        {
            // set button big enough so we can see the rounding curve.
            setSize(60, 40);
            ImageIcon netbeans = createImageIcon("netbeans.png");
    
            if (netbeans != null)
            {
                setIcon(netbeans);
            }
    
            setIcon(netbeans);
            Color[] gradients;
            Graphics2D g2 = (Graphics2D) g;
            super.paintComponent(g2);
    
            if(getModel().isRollover())
            {
                g2.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));
                Shape firstClip = g.getClip();
                RoundRectangle2D rect = new RoundRectangle2D.Double();
                double arc = Math.ceil(getSize().getHeight() / 3);
                rect.setRoundRect(0, 0, Math.ceil(getSize().getWidth()), Math.ceil(getSize().getHeight()), arc, arc);
                Area secondClip = new Area(getBounds());
                secondClip.subtract(new Area(rect));
                Area finalClip = new Area(firstClip);
                finalClip.subtract(secondClip);
                g2.setClip(finalClip);
                super.paintComponent(g2);           
    
                gradients = new Color[] { new Color(184, 207, 229), new Color(122, 138, 153), new Color(184, 207, 229) };
    
                for(int i = 0; i < gradients.length; i++)
                {
                    arc -= 2;
                    g2.setColor(gradients[i]);          
                    g2.drawRoundRect(i+1, i+1, (int)Math.ceil(getSize().getWidth()-2)-(i*2), (int)Math.ceil(getSize().getHeight()-2)-(i*2), (int)arc, (int)arc);
                }
            }
            else if (getModel().isSelected())
            {
                // TODO, leave a permanent focus mark here.
            }
        }
    
        public static void main(String[] args)
        {
            JFrame frame = new JFrame();
            frame.getContentPane().setLayout(new FlowLayout());
    
            StylistButton sButton = new StylistButton("stylistButton");
    
            frame.getContentPane().add(sButton);
    
            frame.setSize(250, 250);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    
    
        @Override
        public void mouseClicked(MouseEvent e)
        {
    
        }
    
        @Override
        public void mousePressed(MouseEvent e)
        {
    
        }
    
        @Override
        public void mouseReleased(MouseEvent e)
        {
    
        }
    
        @Override
        public void mouseEntered(MouseEvent e)
        {
    
        }
    
        @Override
        public void mouseExited(MouseEvent e)
        {
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2012-01-30
      • 2011-05-21
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多