在按下时停止 JButton 突出显示

Fra*_*ice 5 java user-interface swing jbutton

按下时,任何按下的 JButton 似乎都会“突出显示”自身,如下所示:

按下按钮

我似乎找不到任何方法来禁用它。

Mad*_*mer 7

有多种方法可以实现这一目标......

你可以...

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

你可以...

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

你可以...

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

你可以...

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

这是首选的解决方案,因为它与当前的外观和感觉一起工作以实现您的结果。

修复状态

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
        }

    }

}
Run Code Online (Sandbox Code Playgroud)


Mac*_*ski 5

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

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