2012-04-16 40 views
0

我有一个纸牌游戏,它建立在使用ArrayList将人员存储在人手中。我有一个主要的方法,通过游戏进行游戏并使用主类中的InvokeLater线程更新GUI类Java Swing:等待鼠标在返回一个Int之前点击事件

当前我正在控制台上玩游戏,并将其输入到扫描仪中以使从玩家手中选择牌。我想要做的是运行一个线程,可能带有调用和等待,当玩家需要做出选择时运行。然后等待玩家在GUI中点击相应的卡并返回该卡位置的合适的int。这个选择然后由我的游戏处理。

我现在如何更新我的GUI。

 public static void Play(ArrayList<Card> ...){ 
     UpdateHand(player1, deck, deckused); 

     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       GUI.getInstance().UpdateHand(); 

      } 
     }); 

将听众附加到卡片上并将他们的名字设置为手中相应位置的int。

public void PlayerSelection() 
    { 
     selection = -1; 
     Information = new JLabel("Please Select Your Card"); 
     ButtonDisplay.add(Information); 
     ButtonDisplay.updateUI(); 
     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) { 
      // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        JLabel picLabel = new JLabel(new ImageIcon(cardImage)); 
        String name = "" + i; 
        picLabel.setName(name); 
        picLabel.addMouseListener((MouseListener) this); 
        HumanHandDisplay.add(picLabel); 
      } 
    } 

在单击鼠标时存储用于选择的int。

public void mouseClicked(MouseEvent e) { 
     String name = ((JLabel)e.getSource()).getName(); 
     System.out.println("Working " + name); 
     selection = Integer.parseInt(name);   
    } 

我想将此int返回到我的主类Play()方法中,以用于其余的计算。我无法解决如何做到这一点,特别是要等待选择。我听说这可以完成,但我不确定如何在我的工作中实现这一点。如果任何人都可以提供帮助,那会很棒。

+0

请学习java命名约定并坚持使用它们。 – kleopatra 2012-04-16 08:18:06

回答

2

不,您不想暂停线程或任何此类排序。相反,您将根据用户所在的程序中的哪个位置来更改程序的状态,并根据他的响应以及程序的行为取决于该状态。

例如,如果用户需要等待用户播放一张卡片,则应给主要类别一个currentPlayer变量,并在轮到他时将其分配给用户。然后对程序进行编码,使其不会响应任何用户输入,除了适合轮到他的有效输入。

然后GameEngine的主类会将currentPlayer变量推进到下一个玩家并等待他们的回应。

编辑1
幽州:

我不知道我真的能理解。我已经实现了游戏以及所有规则和人工智能玩家的对战,我现在在控制台上进行操作。我只需要使用扫描仪向GUI进行选择以等待鼠标点击事件。

请理解,你正在做一个大的转变,从一个基于控制台线性规划移动到GUI 事件基于程序,关键是这个新程序是基于事件的。如果您的当前代码是使用行为良好的符合OOP的类编写的,并且使用最少的静态变量和方法以及具有良好定义的状态的类,那么过渡应该顺利进行。另一方面,如果您当前的代码库只有少数几个类,大部分都以线性控制台用户界面为中心,则可能需要从头开始重新编写代码。

您可能希望向我们展示一些当前的代码并描述其设计。

接下来声明:

我怎么会去makeing确保该程序并不比int以外的任何回应?

请澄清你的意思是让程序只响应int。一个int在哪里?在JTextField中?别的地方?我想这可能需要某种类型的输入验证。

+0

我不确定我是否真的明白。我已经实现了游戏以及所有规则和人工智能玩家的对战,我现在在控制台上进行操作。我只需要使用扫描仪向GUI进行选择以等待鼠标点击事件。 我该怎么做才能确保程序不响应int以外的任何内容? – Sean 2012-04-16 01:57:14

+0

@Sean:请参阅**编辑1 **。 – 2012-04-16 02:02:23

0

你想要的是自定义组件上的模态,这在Swing中是不可能的(至少不是没有实现你自己的模态的很多努力)。你的程序应该有状态并且是基于事件的,就像@ Hovercraft的答案一样。