单击Javafx2修改按钮

时间:2014-01-22 16:28:36

标签: java button javafx event-listener

我试图这样做,当点击一个按钮时,我可以更改其中一个属性。

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

2 个答案:

答案 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对象之前。

希望这会对你有所帮助。祝你好运。