JavaSwing:模型和按钮颜色更改

JavaSwing:模型和按钮颜色更改,java,swing,model,jbutton,Java,Swing,Model,Jbutton,我对模型在JavaSwing中应该做什么感到非常困惑。目前,我基本上是在尝试为JButton创建一个模型,以检测它是否为pressed();我对该模型的基本目标是这样做: if(myButton.isPressed() ) { myButton.setBackground(Color.RED); } else{//when any other button is pressed? myButton.setBackground(Color.WHITE); } number

我对模型在JavaSwing中应该做什么感到非常困惑。目前,我基本上是在尝试为JButton创建一个模型,以检测它是否为pressed();我对该模型的基本目标是这样做:

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);
           }
        }
    });
目前我的代码是这样的:

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);
           }
        }
    });
我知道这是完全错误的,但我不知道在哪里,我还没有找到一个教程来真正解释我做错了什么,或者为什么我需要一个模型


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

我想你想要的是用按钮注册一个
ActionListener
Action
,以处理按键操作,对吗


编辑:重读你的答案,似乎你想突出显示正在按下的按钮,对吗?在这种情况下,尝试使用您自己的按钮ui(将您正在使用的外观和感觉中的一个子类化)
BasicButtonUI
有一个方法
protected void paintButtonPressed(图形g,抽象按钮b)
,当按钮被按下时,您可以覆盖该方法以应用高亮显示。

我一直认为按钮模型是有意的(大部分)供UI类使用,以其按下/未按下/防护/选定/的状态呈现按钮。。。状态并跟踪对该状态的更改

如果你只是想在按下按钮时把它涂成红色(这是你想要的吗?),我觉得你的解决方案很好

如果您有一个切换按钮(在单击该按钮以指示“已选择”状态后仍处于按下状态),则可能需要使用ItemListener并检查

ItemEvent.ITEM_STATE_CHANGED == ItemEvent.SELECTED // paint red
ItemEvent.ITEM_STATE_CHANGED == ItemEvent.DESELECTED // paint white

如果要在单击按钮时执行应用程序逻辑,请使用ActionListener。

使用按钮组中的单选按钮

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

导入java.awt.image.buffereImage;
导入java.awt.*;
导入javax.swing.*;
导入java.net.URL;
导入javax.imageio.imageio;
红白相间{
公共静态图像GetColoreImage(颜色、整数大小){
BuffereImage bi=新的BuffereImage(
大小,
大小,
BuffereImage.TYPE_INT_RGB);
Graphics g=bi.getGraphics();
g、 设置颜色(颜色);
g、 fillRect(0,0,大小,大小);
g、 处置();
返回bi;
}
公共静态void main(字符串[]args)引发异常{
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
图像红色=GetColoreImage(Color.red,32);
图像白色=GetColoreImage(Color.white,32);
JPanel p=新JPanel(新网格布局(1,0,5,5));
ButtonGroup bg=新建ButtonGroup();

对于(intii=0;ii,有以下几种方法可以使

1) 最好的方法是只从鼠标事件中绘制边框

2) 凌驾于整个

3) 在那里放置
图标
,并在jbuttonapi中实现

4) 最好的办法就是实施


5) 基于
JLabel/JComponent

创建
Custom JComponent
,如果您只需通过
getModel()
获取按钮的模型并将ChangeListener添加到模型中会怎么样?这是什么
doColorChange(…)
你提到的方法?DoColorChange方法完全是空的,因为我想不出从它自己的模型内部获取按钮参数的方法…无论如何,这可能是完全错误的方法。为了更快地获得更好的帮助,请发布一个.afaics,唯一完全错误的是调用setBounds:-)监听虽然LAF可能对与状态相关的视觉效果有自己的想法,但从技术上来说,对模型来说是不错的。注意:所有非标准的“装饰”可能会让你的用户感到困惑