JavaFX : フォーカス トラバーサル ポリシーを変更するには? Alexander Kirov が、JavaFX アプリケーションのフォーカストラバーサルポリシーをカスタマイズする方法を示しています。正常に動作しますが、TitledPane
s では動作しません。のノードにTitledPane
フォーカスがある場合、settedTraversalEngine
は呼び出されません。
この現象を示す完全な例を次に示します。
package org.example;
import com.sun.javafx.scene.traversal.Direction;
import com.sun.javafx.scene.traversal.TraversalEngine;
import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TitledPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class FocusTest extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
// Create UI
final VBox root = new VBox();
final Button foo = new Button("foo");
foo.setId("foo");
root.getChildren().add(foo);
final Button bar = new Button("bar");
bar.setId("bar");
final Pane content = new Pane();
content.getChildren().add(bar);
final TitledPane tp = new TitledPane("tp", content);
root.getChildren().add(tp);
// Set TraversalEngine
final TraversalEngine te = new TraversalEngine(root, false) {
@Override
public void trav(Node owner, Direction direction) {
System.out.printf("trav owner: %s, direction: %s%n",
owner.getId(), direction);
switch (direction) {
case DOWN:
case RIGHT:
case NEXT:
if (owner == foo) {
bar.requestFocus();
} else if (owner == bar) {
foo.requestFocus();
}
break;
case LEFT:
case PREVIOUS:
case UP:
if (owner == foo) {
bar.requestFocus();
} else if (owner == bar) {
foo.requestFocus();
}
break;
}
}
};
root.setImpl_traversalEngine(te);
// Show Scene
final Scene scene = new Scene(root);
primaryStage.setHeight(200);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
シーンのルートは でVBox
、カスタムTraversalEngine
はそれに設定されています。ボタンfoo
にフォーカスがあり、[Tab] を押すte.trav
と、 が呼び出され、フォーカスが に設定されbar
ます。それが私が期待した方法です。しかしbar
、フォーカスがあるときはte.trav
呼び出されません。bar
の子ですTitledPane
。この動作は1に示されています。
これに対する解決策はありますか?