2012-10-05 7 views

cevap

37

initialize() denetimleri henüz odağı işlemek için hazır değil.

sonraki hile deneyebilirsiniz:

private void repeatFocus(Node node) { 
    Platform.runLater(() -> { 
     if (!node.isFocused()) { 
      node.requestFocus(); 
      repeatFocus(node); 
     } 
    }); 
} 
: zor, karmaşık uygulamalar için

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    Platform.runLater(new Runnable() { 
     @Override 
     public void run() { 
      tf.requestFocus(); 
     } 
    }); 
} 

(Pavel_K yorumlarda var gibi) Bu rutin birkaç kez ve çağrı yöntemi hattını tekrarlamak isteyebilirsiniz biri gelecek

Bu, belgelenmemiş bir yaklaşımdır ve gelecekteki Java sürümlerinde bir şey değiştiğinde veya bozulduğunda sonsuz döngüden kaçınmak için tekrarlama sınırı eklemek akıllıca olabilir. Tüm uygulamadan daha iyi odak kaybetmek. :)

+0

, teşekkürler! – Adil

+0

Biraz ilgili bir sorun yaşadım, 'TextArea', Sahne Alanı görünür ve etkin olsa bile programlı olarak odaklamayı reddetti ** ve ** geçerli çalışan iş parçacığı JavaFX Uygulama iş parçacığıydı. Ama eğer örneği takip ettiysem ve yeni bir 'Runnable'ı sıraya koyarsam işe yaradı. Gerçekten garip, bunun için hiçbir sözüm yok. –

+0

Bu artık JavaFX 8 ile çalışmıyor gibi görünüyor. 'Tf == null',' initialize' çalıştırıldığı sırada hala geçerlidir. – skiwi

7

Eğer istersenizFocus(); Sahneyi başlattıktan sonra, işe yarayacak! Bunun gibi

:

Stage stage = new Stage(); 
GridPane grid = new GridPane(); 
//... add buttons&stuff to pane 

Scene scene = new Scene(grid, 800, 600); 

TEXTFIELD.requestFocus(); 

stage.setScene(scene); 
stage.show(); 

umarım bu yardımcı olur.

5

@Sergey Grinev ile tam olarak aynı cevap. Java sürümünüzün güncel olduğundan emin olun (JDK 1.8 veya üstü).

bu benim için çalışıyor
Platform.runLater(()->myTextField.requestFocus());