嘿伙计们,我遇到了 2 个问题,都与 Java Swing 相关。我正在用 Java 开发纸牌游戏。我使用数组类型列表来保存每张卡的值,并且我有一个主要的 Play() 方法,该方法使用 invokeLater 和对我的 GUI 类的 Singleton 方法调用对 GUI 的更新。
第一个问题相当简单。我像这样使用 JLabels 在 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 工作者的文章,但我不确定在我自己的游戏中实现一个的最佳方式。目前,使用控制台我有一个扫描仪,而不是选择一个 int 的输入(特定卡在 ArrayList 中的位置)。我希望通过点击玩家手中的牌来选择这个int。目前我使用:
String name = "" + i; picLabel.setName(name);
将卡片 JLabels 的名称设置为创建它们的 for 循环中的 int(如图所示^^),我使用:
public void mouseClicked(MouseEvent e) { String name = ((JLabel)e.getSource()).getName(); System.out.println("Working " + name); selection = Integer.parseInt(name); }
单击其中一张卡片时返回该整数。这也是我用来从 Play() 调用 GUI 方法的方法:
SwingUtilities.invokeLater(new Runnable() { public void run() { GUI.getInstance().UpdateHand(); } });
我的问题是,如何让 Play 方法调用 GUI 类中的方法,该方法使用适当的侦听器设置手牌(现在我们称之为 GUIPlayerSelection())然后等待玩家点击一张卡片,这然后将 int 返回到代表所选卡片的主类中的 Play() 方法。我不确定如何使用调用和等待,例如,如果我使用调用和等待,它会等待卡片设置好,还是等待 mouseClicked() 方法完成?还是我必须做其他事情来确保它在手动设置后等待鼠标点击?那么我将如何返回该 int 呢?我被告知要使用摇摆工人,但如果有人能解释我如何在这种情况下实现它,那就太棒了。
先感谢您。