我试图这样做,当点击一个按钮时,我可以更改其中一个属性。
class Tile extends Button{
public int position[];
public Tile(){
super();
position = 0;
}
}
初始化时:
{
Tile tiles [][] = new Tile[10][10];
for(int i=0; i<10; i ++){
for(int j =0; j<10; j++){
tiles[i][j].position = i*10+j;
tiles[i][j].addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent e) {
System.out.println(((Tile)(e.getSource())).position[1]); //this results in a null pointer
}
});
}
}
}
我希望程序在单击时打印出tile中的位置值。有没有办法访问事件所指的对象? 我真的只需要知道点击了阵列中的哪个磁贴。 编辑: 当我尝试使用e.getSource()时,我得到一个NullPointerException
答案 0 :(得分:2)
该位置被声明为一个数组,但您使用它是一个Int。
将其更改为简单的int可以解决您的问题。
class Tile extends Button{
public int position;
public Tile(){
super();
position = 0;
}
}
初始化方法:
{
Tile tiles [][] = new Tile[10][10];
for(int i=0; i<10; i ++){
for(int j =0; j<10; j++){
tiles[i][j].position = i*10+j;
tiles[i][j].addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent e) {
System.out.println(((Tile)(e.getSource())).position);
}
});
}
}
}
答案 1 :(得分:2)
如用户PeekaySwitch所述,您可以获得按钮触发事件的来源,在这种情况下,它是按钮。您所要做的就是应用强制转换来获得所需对象的正确类型:
@Override public void handle(ActionEvent e)
{
Button button = (Button) e.getSource();
}
执行此操作后,您只需获取对象属性并按您希望的方式处理它们。不要忘记JavaFX中的types of events都是Java standard library的一部分。
关于它的异常空值,你犯了语言的基本错误。下一个代码片段开始引用对象数组:
Tile tiles [][] = new Tile[10][10];
但是,您没有在向量中启动对象。尝试通过执行以下操作来启动每个Tile对象:
tiles[i][j] = new Tile();
将此代码放在嵌套循环中,并在使用每个Tile对象之前。
希望这会对你有所帮助。祝你好运。