Java 如何更改动态生成的JButton的图标

Java 如何更改动态生成的JButton的图标,java,swing,Java,Swing,我有一个javaswing程序,我想知道如何创建一个按钮,点击它就会清除文本区域&改变这个人的图标,让他们放下手 按钮是使用for循环动态生成的 还有这个 //创建按钮的步骤 for(int i=0;i { 字符串s=pa.toString()+questionPane.getText(); 最终ImageIcon raise=resizeIcon(新ImageIcon(“src/raise.png”),30,30; b、 设置图标(上升); showMessageDialog(null,s,“

我有一个javaswing程序,我想知道如何创建一个按钮,点击它就会清除文本区域&改变这个人的图标,让他们放下手

按钮是使用for循环动态生成的 还有这个

//创建按钮的步骤
for(int i=0;i
{
字符串s=pa.toString()+questionPane.getText();
最终ImageIcon raise=resizeIcon(新ImageIcon(“src/raise.png”),30,30;
b、 设置图标(上升);
showMessageDialog(null,s,“欢迎来到聊天室”,JOptionPane.INFORMATION_MESSAGE,pa.getImage());
});
p、 添加(b);
}
//清除按钮逻辑
clearButton.addActionListener(e->{
问题窗格。设置文本(“”);
hostPane.setText(“”);
});

好的,这会很有趣

下面的示例将大部分概念解耦,并使用基本的“观察者模式”通知相关方状态已更改(即聊天已被清除)

这是一个基本概念,通过此概念,您可以将“什么”与“如何”分离开来,即“您想要做什么”(更新模型)与“如何做”(即按下按钮)分离开来。这使得它更容易适应更复杂的系统

该示例包含一个
ChatService
,它有一个侦听器,在本例中,它简单地告诉相关方聊天已被清除

更复杂的解决方案可能是
ChatService
在用户“举手”时生成事件,这允许相关方以任何与他们相关的方式处理事件

该示例使用
操作
API将每个操作执行的工作与UI本身分离。这有助于创建单个工作单元,在拥有动态数据集时更易于处理

导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Random;
导入javax.swing.AbstractAction;
导入javax.swing.Action;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
公开课考试{
公共静态void main(字符串[]args){
新测试();
}
公开考试(){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame=新JFrame();
frame.add(newtestpane());
frame.pack();
frame.setVisible(true);
}
});
}
公共类TestPane扩展了JPanel{
公共测试窗格(){
ChatService ChatService=新建ChatService();
JPanel面板=新的JPanel();
字符串[]名称=新字符串[]{“Bryan”、“Alan”、“George”、“Henry”};
列表操作=新的ArrayList(names.length);
for(字符串名称:名称){
PeopleAction=新PeopleAction(聊天服务,名称,false);
动作。添加(动作);
}
随机rnd=新随机();
actions.get(rnd.nextInt(names.length)).setrised(true);
for(操作:操作){
JButton btn=新JButton(动作);
面板。添加(btn);
}
setLayout(新的GridLayout(2,1));
添加(面板);
JPanel hostPane=新的JPanel();
jbuttonclearbutton=newjbutton(newclearaction(chatService));
添加(clearButton);
添加(主机窗格);
}
}
公共类聊天室服务{
私有列表侦听器=新的ArrayList(25);
public void addchatListener(ChatListener侦听器){
添加(侦听器);
}
public void removeChatListener(ChatListener侦听器){
删除(侦听器);
}
受保护的无效fireChatCleared(){
if(listeners.isEmpty()){
返回;
}
for(聊天侦听器:侦听器){
listener.chatCleared();
}
}
公共空间清除(){
//按要求去做
firechatclear();
}
}
公共接口聊天侦听器{
公共空间已清除();
}
公共类PeopleAction扩展了AbstractAction实现了ChatListener{
私有字符串名称;
私有布尔函数;
PublicPeopleAction(ChatService ChatService,字符串名称,布尔值){
//您可以使用大图标键或小图标来设置图标
this.name=名称;
如果(提出){
putValue(名称,“*”+名称);
}否则{
putValue(名称、名称);
}
addChatListeners(这个);
}
public void setRaised(布尔提升){
如果(提出){
putValue(名称,“*”+名称);
}否则{
putValue(名称、名称);
}
}
公共布尔值isRaised(){
提高回报率;
}
@凌驾
已执行的公共无效操作(操作事件evt){
//做任何需要做的事
setRaised(!isRaised());
}
@凌驾
公众假期{
设定值(假);
}
}
公共类ClearAction扩展了AbstractAction{
私人聊天服务;
公共ClearAction(聊天服务聊天服务){
this.chatService=chatService;
putValue(名称“Clear”);
}
@凌驾
       // To create buttons
       for(int i=0 ; i < list.length; i++){
            Participant pa = list[i];
            JButton b = new JButton(pa.getNameButton(),participant);

            b.addActionListener(e ->
            {
                String s = pa.toString() + questionPane.getText();
                final ImageIcon raise = resizeIcon(new ImageIcon("src/raise.png"),30,30);
                b.setIcon(raise);
                JOptionPane.showMessageDialog(null,s,"Welcome to Chat Room",JOptionPane.INFORMATION_MESSAGE,pa.getImage());
            });
            p.add(b);
           }


        // Clear button logic
        clearButton.addActionListener(e ->{
            questionPane.setText("");
            hostPane.setText("");
        });
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            ChatService chatService = new ChatService();

            JPanel panel = new JPanel();
            String[] names = new String[] {"Bryan", "Alan", "George", "Henry"};
            List<PeopleAction> actions = new ArrayList<>(names.length);
            for (String name : names) {
                PeopleAction action = new PeopleAction(chatService, name, false);
                actions.add(action);
            }

            Random rnd = new Random();
            actions.get(rnd.nextInt(names.length)).setRaised(true);

            for (Action action : actions) {
                JButton btn = new JButton(action);
                panel.add(btn);
            }

            setLayout(new GridLayout(2, 1));
            add(panel);

            JPanel hostPane = new JPanel();
            JButton clearButton = new JButton(new ClearAction(chatService));
            hostPane.add(clearButton);
            add(hostPane);
        }

    }

    public class ChatService {
        private List<ChatListener> listeners = new ArrayList<>(25);

        public void addChatListeners(ChatListener listener) {
            listeners.add(listener);
        }

        public void removeChatListener(ChatListener listener) {
            listeners.remove(listener);
        }

        protected void fireChatCleared() {
            if (listeners.isEmpty()) {
                return;
            }

            for (ChatListener listener : listeners) {
                listener.chatCleared();
            }
        }

        public void clear() {
            // Do what's required
            fireChatCleared();
        }
    }

    public interface ChatListener {
        public void chatCleared();
    }

    public class PeopleAction extends AbstractAction implements ChatListener {

        private String name;
        private boolean raised;

        public PeopleAction(ChatService chatService, String name, boolean raised) {
            // You can use either LARGE_ICON_KEY or SMALL_ICON to set the icon
            this.name = name;
            if (raised) {
                putValue(NAME, "* " + name);
            } else {
                putValue(NAME, name);
            }

            chatService.addChatListeners(this);
        }

        public void setRaised(boolean raised) {
            if (raised) {
                putValue(NAME, "* " + name);
            } else {
                putValue(NAME, name);
            }
        }

        public boolean isRaised() {
            return raised;
        }

        @Override
        public void actionPerformed(ActionEvent evt) {
            // Do what ever needs to be done
            setRaised(!isRaised());
        }

        @Override
        public void chatCleared() {
            setRaised(false);
        }

    }

    public class ClearAction extends AbstractAction {

        private ChatService chatService;

        public ClearAction(ChatService chatService) {
            this.chatService = chatService;
            putValue(NAME, "Clear");
        }

        @Override
        public void actionPerformed(ActionEvent evt) {
            chatService.clear();
        }

    }
}