我正在使用套接字和东西实现UNO游戏。到目前为止,我一直在为每个客户端开发GUI,在为每个玩家和随机中心卡获取一组随机卡片时,我已经成功了,但是卡在了以下内容上: 我用一个按钮来代表一张牌的每张牌,说我想选择一张红牌(因为中央牌也是红牌)我已经完成了所有的验证方法,允许你放置或不放置你的牌。但是中央按钮的图标没有改变(中央卡变量改变了,但没有改变代表它的按钮图标)。
我读了这个问题并试图使用SwingUtilities.invokeLater,但图标没有改变(Dynamically change jButton icon)。
以下是我更改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")));
}
}
});
}
它接收一张卡片(获取它的颜色,值/ actionType),它将JButton的背景更改为相同的颜色,并搜索正确的图标(如果卡片为红色且值为1则会更改按钮的背景为红色并搜索1.png,这是一个透明图像,编号为1)
如果有更好的方法,我会很高兴知道这一点。现在它只是在执行开始时设置图标。 谢谢你的时间!
答案 0 :(得分:1)
要检查两件事:
setBtnIcon
,以便在您需要时触发它。我无法从你原来的问题中看出“它只是在执行开始时设置了图标”意味着该方法只被调用一次。getClass().getResource(...)
的结果不是null
。获取共存资源可能是一件棘手的事情,特别是如果您将应用程序分发到JAR文件中。答案 1 :(得分:0)
您是否尝试删除JButton“最终”声明?
答案 2 :(得分:0)
解决:我没有在Observer的update函数中调用上面的函数,傻事却是真的;感谢您的帮助,您的一些答案很有帮助。 客户端窗口是观察者,当更改centralCard时,我需要调用我上面写的函数。