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
}
}
}