Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按下按钮时停止JButton高亮显示_Java_Swing_User Interface_Jbutton - Fatal编程技术网

Java 按下按钮时停止JButton高亮显示

Java 按下按钮时停止JButton高亮显示,java,swing,user-interface,jbutton,Java,Swing,User Interface,Jbutton,按下的任何按钮在按下时都会显示为“突出显示”: 我似乎找不到任何方法来禁用此功能。您可以扩展JButton类并设计自己的外观,或者只需覆盖默认的行为,如以下示例代码所示: public class MyButton extends JButton { @Override public void paintComponent(Graphics g) { super.paintComponent(g); if (isSelected()) {

按下的任何按钮在按下时都会显示为“突出显示”:


我似乎找不到任何方法来禁用此功能。

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

public class MyButton extends JButton {
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (isSelected()) {
            setBorder(BorderFactory.createEmptyBorder());
        } else {
            setBorder(BorderFactory.createLoweredBevelBorder());
        }
    }
}
我总是打电话:


按下时绘制背景是一个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) );

有很多方法可以实现这一点

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

你可以。。。 创建您自己的
按钮ui
,这通常是首选方式,但这不是一项微不足道的工作,您需要为您想要支持的每个平台创建一个按钮

你可以。。。 使用按钮的
图标
属性“模拟”按钮边界。这是首选解决方案(而不是定制喷漆过程),因为它易于应用,不需要专门的按钮即可实现。它还克服了在不同平台上如何绘制按钮的一些问题(因为并非所有按钮都使用相同的
background
color属性)

你可以。。。 定义自己的
按钮模型
,它可以忽略某些状态更改(如按下或滚动)

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

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
        }

    }

}


你必须把它应用到所有的按钮上。是的,我知道。对于自定义ButtonModel,同样的问题仍然存在+1,但是重写setPressed()方法会导致ActionListener无法工作。似乎您所需要的只是重写getPressed()方法以返回false,以防止背景发生变化。@camickr认为,没有测试它,不确定属性的变化会发生什么,我想这是一个……很好的解决方案。你用什么程序来创建gif?@nespowerglood,免费,多平台…@FraserPrice,我不确定我是否理解这个解决方案。如果不想更改边框,只需设置自己的边框即可。您不应该重写paintComponent()方法来执行此操作。您的问题似乎表明您不喜欢按下按钮时背景颜色的变化。我不确定边界与此有什么关系。如果组件(或任何其他组件)在任何绘制方法中处于fom状态,则永远不应更改te状态,这将设置一系列重新绘制事件,这些事件将消耗CPU
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
        }

    }

}