Fra*_*ice 5 java user-interface swing jbutton
按下时,任何按下的 JButton 似乎都会“突出显示”自身,如下所示:

我似乎找不到任何方法来禁用它。
有多种方法可以实现这一目标......
覆盖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)
您可以扩展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)
| 归档时间: |
|
| 查看次数: |
4980 次 |
| 最近记录: |