0

嘿伙计们,我遇到了 2 个问题,都与 Java Swing 相关。我正在用 Java 开发纸牌游戏。我使用数组类型列表来保存每张卡的值,并且我有一个主要的 Play() 方法,该方法使用 invokeLater 和对我的 GUI 类的 Singleton 方法调用对 GUI 的更新。

  1. 第一个问题相当简单。我像这样使用 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() 但一无所获。您可以在这里提供的任何帮助都将受到欢迎。

  1. 我的第二个问题是关于使用 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 呢?我被告知要使用摇摆工人,但如果有人能解释我如何在这种情况下实现它,那就太棒了。

先感谢您。

4

1 回答 1

0

对于您的第一个问题,您是否在重新绘制框架或卡片布局方面遇到问题?

如果是后者,那么您可能想看看Java Layout Managers,它描述了 JFrame 内的内容窗格如何组织添加到其中的组件。

如果这些都不适合您(而且我认为它们不会与您描述的一样),您可以使用setBounds方法手动对齐您的 JLabels。

于 2012-04-15T04:29:41.647 回答