将jbuttons放在堆上



我正在制作一个统计保留程序,以在Java练习我的GUI技能。

我有一个程序,可以以他们的名字击中篮球运动员的统计数据。然后,它将统计数据添加到运行总计并更新记分牌。

我已经该创建一个撤消按钮了。

因此,每次执行操作时,我都会将源按钮添加到一堆jbuttons中。涉及一些铸件,因此最终是这样的:

JButton source = (JButton) e.getSource();
theStack.push(source);

稍后,在actionPerformed方法中,我尝试通过撤消功能来调用:

if(source.getText().equals("Undo")){
    System.out.println("Undo");
    JButton last = this.theStack.pop();
    System.out.println(last.getText()); //Works fine.
    System.out.println(last.getName()); //Produces a null value.
    int player = Integer.parseInt(last.getName().trim());
    undo(player, last.getText(), activePlayers);
}

为什么我要为这个名字命名。Eclipse试图将名称转换为int时,它会引发异常,因为它正在转换为空值。我在actionPerformed的其他部分中使用.getName(),但不在此处?

我的名字设置代码,在循环中多次完成。

output[i][j] = new JButton("Make Two Points");
output[i][j].setName(i + "");

最简单形式的问题。

public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        ArrayList<Integer> activePlayers = new ArrayList<Integer>();
        activePlayers.add(player0Select.getSelectedIndex());
        activePlayers.add(player1Select.getSelectedIndex());
        activePlayers.add(player2Select.getSelectedIndex());
        activePlayers.add(player3Select.getSelectedIndex());
        activePlayers.add(player4Select.getSelectedIndex());
        JButton source = (JButton) e.getSource();
        theStack.push(source);
        if(source.getText().equals("Make Two Points")){
            this.makeTwoPoints(source.getName(), activePlayers); //source.getName() works here.
            System.out.println("Two Points");
        }
        if(source.getText().equals("Undo")){
            System.out.println("Undo");
            JButton last = this.theStack.pop();
            System.out.println(last.getText());
            System.out.println(last.getName()); //last.getName() produces null here.
            int player = Integer.parseInt(last.getName().trim());
            undo(player, last.getText(), activePlayers);
        }
}

因为您从未设置 jbutton的名称,也不应该。每个组件都有一个可以通过setName(...)方法设置的名称属性,如果从未调用Setter方法,则该名称为null。但是,该物业的意义是什么?这里不多。

如果这是我的项目,我不会堆叠jbuttons,而是堆叠模型对象或控制(操作)。让我们不要将模型与观点混合。


编辑

关于我的意思的简单示例

public enum StatAction {
   MAKE_2_PTS("Make Two Points"), MISS_2_PTS("Miss Two Points"), 
   MAKE_3_PTS("Make Three Points");
   private String text;
   private StatAction(String text) {
      this.text = text;
   }
   @Override
   public String toString() {
     return text;
   }
   public String getText() {
      return text;
   }
}

,您可以拥有一个可以包括名称字段以及List<StatAction>的玩家类,例如,它可以...

public class Player {
   private String name;
   private List<StatAction> statActionList = new ArrayList<>();
   // ....
   public String getName() {
      return name;
   }
   public void addStatAction(StatAction statAction) {
      statActionList.add(statAction);
   }
   public void removeStatAction(StatAction statAction) {
      statActionList.remove(statAction);
   }
   public void removeLastStatAction() {
      if (statActionList.size() > 0) {
         statActionList.remove(statActionList.size() - 1);
      }
   }
   //.....
}

然后撤消可以从玩家列表中删除最后一个统计。然后,统计数据的显示可以通过听众飞行。

相关内容

  • 没有找到相关文章

最新更新