任何按下的JButton在按下时都会“突出显示”自身:
我似乎无法找到任何禁用此功能的方法。
答案 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
,它可以忽略某些状态更改(例如按下或翻转)。
这是一个首选解决方案,因为它与当前外观相关,可以达到您的效果。
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
}
}
}