在新闻界停止JButton突出显示

时间:2014-03-20 19:50:25

标签: java swing user-interface jbutton

任何按下的JButton在按下时都会“突出显示”自身:

Pressed button

我似乎无法找到任何禁用此功能的方法。

4 个答案:

答案 0 :(得分:3)

您可以扩展JButton类并设计自己的外观,或者只是覆盖默认的行为,如下所示:

public class MyButton extends JButton {
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (isSelected()) {
            setBorder(BorderFactory.createEmptyBorder());
        } else {
            setBorder(BorderFactory.createLoweredBevelBorder());
        }
    }
}

答案 1 :(得分:3)

我总是致电setFocusPainted(boolean b)

btn.setFocusPainted(false);

答案 2 :(得分:3)

按下时绘制背景是一种UI实现,因此您需要更改UI。

更简单的方法是创建要添加到按钮的特定颜色的图标。类似的东西:

public class ColorIcon implements Icon
{
    private Color color;
    private int width;
    private int height;

    public ColorIcon(Color color, int width, int height)
    {
        this.color = color;
        this.width = width;
        this.height = height;
    }

    public int getIconWidth()
    {
        return width;
    }

    public int getIconHeight()
    {
        return height;
    }

    public void paintIcon(Component c, Graphics g, int x, int y)
    {
        g.setColor(color);
        g.fillRect(x, y, width, height);
    }
}

然后,您可以使用以下方式在图标顶部显示文本:

JButton button = new JButton("1");
button.setIcon( new ColorIcon(Color.RED, 32, 32) );
button.setHorizontalTextPosition(JButton.CENTER);
button.setVerticalTextPosition(JButton.CENTER);
button.setMargin( new Insets(0, 0, 0, 0) );

答案 3 :(得分:3)

您可以通过多种方式实现这一目标......

你可以......

覆盖paintComponent并实现自己的绘制逻辑。这有点危险,现在意味着对于要修改的每个状态更改,要么需要新的基于JButton的类,要么实现其他一些严重的标志。这也可能会影响其他外观......

你可以......

创建自己的ButtonUI,这通常是首选方式,但这并不是一项微不足道的工作量,而且您需要为每个支持的平台提供一个

你可以......

使用按钮的icon属性“模拟”按钮边界。这是首选的解决方案(超过定制绘画过程),因为它易于应用,并且不需要专门的按钮来实现。它还克服了一些关于如何在不同平台上绘制按钮的问题(因为并非所有按钮都使用background颜色属性相同)

你可以......

定义您自己的ButtonModel,它可以忽略某些状态更改(例如按下或翻转)。

这是一个首选解决方案,因为它与当前外观相关,可以达到您的效果。

FixState

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.DefaultButtonModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestButton {

    public static void main(String[] args) {
        new TestButton();
    }

    public TestButton() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            JButton normal = createButton("Normal", Color.RED);
            JButton fixed = createButton("Fixed", Color.BLUE);
            fixed.setModel(new FixedStateButtonModel());
            setLayout(new GridLayout(1, 0));
            add(normal);
            add(fixed);
        }

        protected JButton createButton(String text, Color background) {
            JButton btn = new JButton(text);
            btn.setFocusPainted(false);
            btn.setBackground(background);
            btn.setForeground(Color.WHITE);
            return btn;
        }

    }

    public class FixedStateButtonModel extends DefaultButtonModel    {

        @Override
        public boolean isPressed() {
            return false;
        }

        @Override
        public boolean isRollover() {
            return false;
        }

        @Override
        public void setRollover(boolean b) {
            //NOOP
        }

    }

}