gpt4 book ai didi

java - TitledPane 中的焦点遍历策略

转载 作者:行者123 更新时间:2023-11-30 11:34:54 28 4
gpt4 key购买 nike

关于 JavaFX: How to change the focus traversal policy? Alexander Kirov 展示了如何为 JavaFX 应用程序自定义焦点遍历策略。它工作正常,但不适用于 TitledPane。如果 TitledPane 中的节点具有焦点,则不会调用设置的 TraversalEngine

下面是一个展示这种现象的完整例子:

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.travbarTitledPane 的子项。此行为显示在 1 中.

有人解决这个问题吗?

Focus Traversal in TitledPane

最佳答案

这是一个处理 TitledPane 的棘手解决方案:

@SuppressWarnings("deprecation")
private static void registerTraversalEngine(final Parent parent,
final TraversalEngine te) {
parent.setImpl_traversalEngine(te);
for (Node child : parent.getChildrenUnmodifiable()) {
if (child instanceof Parent) {
registerTraversalEngine((Parent) child, te);
}
}
if (parent instanceof TitledPane) {
final TitledPane tp = (TitledPane) parent;
if (tp.getContent() instanceof Parent) {
registerTraversalEngine((Parent) tp.getContent(), te);
}
}
}

我认为 TitltedPane 的问题在于,内容不在子集中:

TitledPane.getChildrenUnmodifiable().contains(TitledPane.getContent()) is always false

关于java - TitledPane 中的焦点遍历策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15385708/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com