0

我正在使用套接字和其他东西实现 UNO 游戏。到目前为止,我一直在为每个客户端开发 GUI,当为每个玩家获得一组随机卡片和随机中央卡片时,我已经成功,但遇到了以下问题:我正在使用一个按钮来表示每张卡片一手牌,假设我想选择一张红牌(因为中央牌也是红牌) 我已经完成了所有允许您放置或不放置卡片的验证方法。但是中央按钮的图标没有改变(中央卡片变量发生变化,但代表它的按钮图标没有改变)。

我阅读了这个问题并尝试使用 SwingUtilities.invokeLater 但图标没有改变(动态更改 jButton 图标)。

这是我更改 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 的透明图像)

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

图形用户界面

4

3 回答 3

1

要检查的两件事:

  1. 确保您在setBtnIcon某种事件侦听器内部调用,以便它在您需要时触发。我无法从您最初的问题中判断“它只是在执行开始时设置图标”是否意味着该方法只被调用一次。
  2. 使用调试器(或添加一个或两个打印语句)运行您的代码,以确保getClass().getResource(...)is not的结果null。获取共同定位的资源可能是一件棘手的事情,尤其是当您在 JAR 文件中分发您的应用程序时。
于 2013-11-09T18:16:54.947 回答
0

您是否尝试过删除 JButton “final” 语句?

于 2013-11-09T18:02:54.077 回答
0

已解决:我没有在 Observer 的更新函数中调用上述函数,这很愚蠢,但确实如此;感谢您的帮助,您的一些回答很有帮助。客户端窗口是观察者,当centralCard改变时,我需要调用我上面写的函数。

于 2013-11-09T18:52:04.057 回答