嘿伙计们我遇到了两个问题,两者都与Java Swing有关。我正在用Java开发一款纸牌游戏。我使用arreays类型列表来保存每张卡的值,我有一个主要的Play()方法,它使用invokeLater和我的GUI类的Singleton方法调用GUI的更新。
第一个问题很简单。我使用JLabel在GUI上创建卡片;附上相关的听众并将其添加到适当的面板,在本例中为“人手面板”:
for (int i = 0; i < (HumanHand.size()); i++)
{
Card card = HumanHand.get(i);
BufferedImage cardImage = null;
try {
cardImage = ImageIO.read(new File("card/" + card + ".jpg"));
} catch (IOException e) {
e.printStackTrace();
}
JLabel picLabel = new JLabel(new ImageIcon( cardImage ));
picLabel.addMouseListener((MouseListener) me);
HumanHandDisplay.add(picLabel);
}
//HumanHandDisplay.validate();
HumanHandDisplay.updateUI();
我遇到的问题是,当人手超过7张牌时,它会创建一个更大的面板区域并在下方开始新的一排牌。我想要做的是,当手达到一定大小时,卡片开始相互重叠(就像你手里拿着卡片一样)。我用.validate()搞砸了但是无处可去。我们非常欢迎您提供任何帮助。
我的第二个问题是关于使用Swing Worker来返回人类玩家的牌选择。我已经阅读了一些关于Swing worker的内容,但我不确定在我自己的游戏中实现一个的最佳方法。目前,使用控制台我有一个扫描仪,而不是输入一个int作为选择(ArrayList中特定卡的位置)。我希望通过点击玩家手中的牌来选择这个int。目前我使用:
String name = "" + i;
picLabel.setName(name);
将Card JLabels的名称设置为创建它们的for循环中的int(如图所示^^),并使用:
public void mouseClicked(MouseEvent e) {
String name = ((JLabel)e.getSource()).getName();
System.out.println("Working " + name);
selection = Integer.parseInt(name);
}
单击其中一张卡时返回该int。以下是我用来从Play()调用GUI方法的方法:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
GUI.getInstance().UpdateHand();
}
});
我的问题是,如何让Play方法调用GUI类中的方法,该方法使用适当的侦听器设置手(暂时将其称为GUIPlayerSelection())然后等待播放器单击卡,然后将int返回到我的主类中的Play()方法,该方法代表所选的卡。我不确定如何使用invoke和wait,如果我使用invoke并等待,它是否只是等待设置卡,还是等待mouseClicked()方法完成?或者我是否必须做其他事情以确保在手动设置后等待鼠标点击?然后我将如何返回该int?我被告知要使用摇摆工作者,但是如果有人可以解释我在这种情况下如何能够实现这一点,那将是非常棒的。
提前谢谢你。
答案 0 :(得分:0)
对于您的第一个问题,您是否在重新绘制框架或使用卡片布局时遇到问题?
如果是后者,那么您可能需要查看Java Layout Managers,它描述了JFrame中的内容窗格如何组织添加到其中的组件。
如果这些都不适合你(并且我认为它们不会与你描述的那样),你可以使用setBounds方法手动对齐你的JLabel。