Java JButton的图标不变(UNO纸牌游戏)

Java JButton的图标不变(UNO纸牌游戏),java,swing,sockets,icons,jbutton,Java,Swing,Sockets,Icons,Jbutton,我正在用套接字之类的东西实现一个UNO游戏。到目前为止,我一直在为每个客户端开发GUI,我成功地为每个玩家获得了一组随机的卡和一张随机的中央卡,但在以下方面遇到了困难: 我用一个按钮来表示一手牌的每张牌,比如我想选择一张红牌,因为中央牌也是红色的。我已经做了所有的验证方法,允许你放置或不放置你的牌。但是中央按钮的图标没有改变中央卡变量的改变,但代表它的按钮图标没有改变 我读了这个问题,并尝试使用SwingUtilities.invokeLater,但图标没有改变 下面是我更改JButton图标的

我正在用套接字之类的东西实现一个UNO游戏。到目前为止,我一直在为每个客户端开发GUI,我成功地为每个玩家获得了一组随机的卡和一张随机的中央卡,但在以下方面遇到了困难: 我用一个按钮来表示一手牌的每张牌,比如我想选择一张红牌,因为中央牌也是红色的。我已经做了所有的验证方法,允许你放置或不放置你的牌。但是中央按钮的图标没有改变中央卡变量的改变,但代表它的按钮图标没有改变

我读了这个问题,并尝试使用SwingUtilities.invokeLater,但图标没有改变

下面是我更改JButton图标的代码:

public void setBtnIcon( final javax.swing.JButton btn,  final modelo.Card c) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            btn.updateUI();
            Color color = c.getColor();
            btn.setBackground(color);
            if (c instanceof modelo.NumberCard) {
                short value = ((modelo.NumberCard) c).getValue();


                String str = Short.toString(value);
                btn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jugadoruno/vista/" + str + ".png")));

            } else if (c instanceof modelo.ActionCard) {
                modelo.ActionType t = ((modelo.ActionCard) c).getActionType();
                String str = t.toString();

                btn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jugadoruno/vista/" + str + ".png")));

            }

        }
    });
}
它接收一张卡以获取其颜色、值/动作类型,它将JButton的背景更改为相同的颜色,并搜索正确的图标如果一张卡为红色且值为1,它将将按钮的背景更改为红色,并搜索1.png,该图像是数字为1的透明图像

如果有更好的方法,我很高兴知道。现在它只是在执行开始时设置图标。 谢谢你的时间


您是否尝试删除JButton最终语句?

需要检查两件事:

确保在某种类型的事件侦听器中调用setBtnIcon,以便在需要时触发它。我无法从您最初的问题判断它是否只是在执行开始时设置图标,这意味着该方法只被调用一次。 使用调试器运行代码,或添加一两条打印语句,以确保getClass.getResource的结果。。。不是空的。获取同一位置的资源可能是一件棘手的事情,特别是如果您在JAR文件中分发应用程序。
已解决:我没有在观测者的更新函数中调用上述函数,这很愚蠢,但却是真的;谢谢你的帮助,你的一些回答很有帮助。
客户端窗口是观察者,当centralCard被更改时,我需要调用我上面写的函数。

这根本不是答案。您可以将其作为注释添加到OP的问题部分,但不能在invokeLater->run中使用非最终变量;是否有一种解决方案可以在不确定的情况下改变它们?我知道最终你不可能改变btn变量本身的内容,所以不要担心这个建议。更改保存在最终变量中的对象的属性是可以的。Pardòn,我不知道我必须在评论中这样说:对不起,你很可能不必要地调用了updateUI。除非外观和感觉发生变化,否则您不应该需要它。您是否尝试将调试输出添加到以检查您希望调用的代码和正确加载的图标是否正确?这是我使用的顺序:单击按钮->单击时调用sendCard方法将卡发送到服务器->服务器验证是否可以放置并回答->是否可以放置,服务器将发送回该卡->客户端接收卡并更改实际发生的centralCard变量->但是在更新centralCard时应该更改的按钮并没有更改其图标。在这种情况下,我们需要查看在更新centralCard时负责调用setBtnIcon的代码。听起来应该在某个地方设置一个变更监听器来处理这个问题。听起来就像我建议的那样-在这种情况下,不是试图唠叨,而是接受一个答案会给回答者和提问者一个小小的提升:。