Java swing:模型和Button颜色的变化

时间:2012-02-08 23:32:34

标签: java swing model jbutton

我对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);
           }
        }
    });

我明白这是完全错误的,但我不知道在哪里,而且我还没有找到真正解释我做错了什么的教程,或者为什么我需要一个模型呢。

请帮我恢复理智!非常感谢!

4 个答案:

答案 0 :(得分:4)

使用按钮组中的单选按钮。

RedAndWhite

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)

我认为您想要的是使用按钮注册ActionListenerAction以处理按钮,对吧?

编辑:重读你的答案,似乎你想突出显示正在按下的按钮,对吗?在这种情况下,尝试使用您自己的按钮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中实现了Iconsoverride 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。