2013-12-15 29 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

相關問題