我正在制作一个统计学程序来练习我的Java GUI技能。
我有一个程序,通过在他们的名字下击中JButton来记录篮球运动员的统计数据。然后它将stat添加到运行总计并更新记分板。
现在是我创建撤消按钮的时候了。
因此,每次执行一个动作时,我都会将源按钮添加到一堆JButton中。有一些涉及的铸造,所以它最终是这样的:
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);
}
为什么我为名称获取null。 Eclipse在尝试将名称转换为int
时抛出异常,因为它正在转换空值。我在.getName()
的其他部分使用actionPerformed
,但不是在这里?
我的名字设定代码,在for循环中多次完成。
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);
}
}
答案 0 :(得分:1)
因为您从未设置 JButton的名称,也不应该。每个Component都有一个name属性,可以通过setName(...)
方法设置,如果从不调用setter方法,那么该名称为null。但是这个房产有什么意义呢?这里不多。
如果这是我的项目,我不会堆叠JButton,而是堆叠模型对象,或者可能是控件(Actions)。我们不要将我们的模型与我们的观点混合在一起。
修改
关于我的意思的一个简单例子,
您可以拥有一个包含三个(或更多统计信息操作)的StatAction枚举,例如,
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>
的Player类,例如它可以包含......
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);
}
}
//.....
}
然后撤消可以从播放器列表中删除最后一个StatAction。然后,统计数据的显示可以通过听众随时改变。