2013-12-15 26 views
2

我想将焦点设置为Tab中内容的特定节点。我加了的ChangeListener将selectedItem特性如下(假设类包含一个名为secondNode型节点场):如何在JavaFX中选定选项卡更改时聚焦特定节点?

tabPane.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Tab>() { 
    @Override 
    public void changed(ObservableValue<? extends Tab> observable, Tab oldValue, Tab newValue) { 
     if (newValue != null) { 
      Platform.runLater(new Runnable() { 
       @Override 
       public void run() { 
        secondNode.requestFocus(); 
       } 
      }); 
     } 
    } 
}); 

但是,这是行不通的。我认为这是因为TabPane执行了一些额外的操作,这些操作会影响焦点,在选中新选项卡后(但是,通过TabPane source code查看,我无法弄清楚)。如果我在调试器中单步执行此代码,它将按预期工作,因此它似乎是竞争条件。如果是这样,这怎么解决?

回答

0

你可以尝试用任务代替了Runnable:

 new Thread(new Task<Void>() 
     { 
      @Override 
      public Void call() throws Exception // This is NOT on FX thread 
      { 
       Thread.sleep(100); 
       return null; 
      } 

      @Override 
      public void succeeded() // This is called on FX thread. 
      { 
       secondNode.requestFocus(); 
      } 

     }).start(); 
+0

嗯,这会工作,毫无疑问,但它取决于线程处于睡眠状态的时间。如果你的价值太低,你仍然可能有竞争条件,如果价值太高,那么焦点就会有明显的转变。所以这是一种骇人听闻的解决方案。不过,这是一个解决方案,所以我会接受它。 –

+0

我同意它的黑客,但不幸的是,我不得不多次使用这种技术来处理FX的其他方面。我希望在FX 8中更好。 – Jurgen

相关问题