Java Swing:Swing Worker,invokeAndWait和Overlapping JLabel

时间:2012-04-15 04:10:16

标签: java jlabel swingworker invokeandwait

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

  1. 第一个问题很简单。我使用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();
    
  2. 我遇到的问题是,当人手超过7张牌时,它会创建一个更大的面板区域并在下方开始新的一排牌。我想要做的是,当手达到一定大小时,卡片开始相互重叠(就像你手里拿着卡片一样)。我用.validate()搞砸了但是无处可去。我们非常欢迎您提供任何帮助。

    1. 我的第二个问题是关于使用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?我被告知要使用摇摆工作者,但是如果有人可以解释我在这种情况下如何能够实现这一点,那将是非常棒的。

    2. 提前谢谢你。

1 个答案:

答案 0 :(得分:0)

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

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

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