我对java swing中应该做的确切模型非常困惑。目前我基本上试图为JButton创建一个模型来检测它是否是压缩();我的模型的基本目标是做这样的事情:
if(myButton.isPressed() ) {
myButton.setBackground(Color.RED);
}
else{//when any other button is pressed?
myButton.setBackground(Color.WHITE);
}
目前我的代码是这样的:
numberButton = new JButton("Num");
numberButton.setBounds(20,40,80,30);
numberButton.addChangeListener(new ChangeListener() {
public void stateChanged (ChangeEvent e){
if (model.isPressed() ){
doColorChange(model);
}
}
});
我明白这是完全错误的,但我不知道在哪里,而且我还没有找到真正解释我做错了什么的教程,或者为什么我需要一个模型呢。
请帮我恢复理智!非常感谢!
答案 0 :(得分:4)
使用按钮组中的单选按钮。
import java.awt.image.BufferedImage;
import java.awt.*;
import javax.swing.*;
import java.net.URL;
import javax.imageio.ImageIO;
class RedAndWhite {
public static Image getColoredImage(Color color, int size) {
BufferedImage bi = new BufferedImage(
size,
size,
BufferedImage.TYPE_INT_RGB);
Graphics g = bi.getGraphics();
g.setColor(color);
g.fillRect(0,0,size,size);
g.dispose();
return bi;
}
public static void main(String[] args) throws Exception {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Image red = getColoredImage(Color.RED, 32);
Image white = getColoredImage(Color.WHITE, 32);
JPanel p = new JPanel(new GridLayout(1,0,5,5));
ButtonGroup bg = new ButtonGroup();
for (int ii=0; ii<6; ii++) {
JRadioButton b = new JRadioButton();
b.setSelectedIcon(new ImageIcon(red));
b.setIcon(new ImageIcon(white));
b.setContentAreaFilled(true);
bg.add(b);
p.add(b);
}
JOptionPane.showMessageDialog(null, p);
}
});
}
}
答案 1 :(得分:2)
我认为您想要的是使用按钮注册ActionListener
或Action
以处理按钮,对吧?
编辑:重读你的答案,似乎你想突出显示正在按下的按钮,对吗?在这种情况下,尝试使用您自己的按钮ui(子类是您正在使用的外观和感觉之一)。 BasicButtonUI
有一个方法protected void paintButtonPressed(Graphics g, AbstractButton b)
,您可以覆盖该方法以在按下按钮时应用突出显示。
答案 2 :(得分:1)
有以下方法如何使JButton更好
1)最好的方法是在鼠标事件上仅绘制来自ButtonModel的边框
2)覆盖整个BasicButtonUI with all rellevant Look and Feels
3)在JButton API中实现了Icons
和override all possible methods
4)最好的是实施Custom Look and Feel
5)根据Custom JComponent
JLabel/JComponent
答案 3 :(得分:0)
我总是认为ButtonModel(大多数情况下)是由UI类用来在按下/未按下/已设置/选中/ ...状态下呈现按钮并跟踪对该状态的更改。
如果您只是想按下红色按钮(那是你想要的?),按下它时你的解决方案似乎很好。
如果您有一个切换按钮(在单击它以指示“已选择”状态后仍保持按下状态,您可能需要使用ItemListener并检查
ItemEvent.ITEM_STATE_CHANGED == ItemEvent.SELECTED // paint red
ItemEvent.ITEM_STATE_CHANGED == ItemEvent.DESELECTED // paint white
如果要在单击按钮时执行应用程序逻辑,请使用ActionListener。