以下程序在标签中显示按钮和标签。该按钮专注于启动。如果单击内容区域中除按钮外的任何位置,该按钮将失去焦点,并且选项卡将获得焦点。
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;
public class FocusTest extends Application {
@Override
public void start(Stage stage) throws Exception {
TabPane tabPane = new TabPane();
tabPane.setFocusTraversable(false);
Scene scene = new Scene(tabPane, 500, 500);
stage.setScene(scene);
Tab tab = new Tab("Tab 1");
FlowPane contentPane = new FlowPane();
/*contentPane.setOnMousePressed(MouseEvent::consume);*/
tab.setContent(contentPane);
tabPane.getTabs().addAll(tab, new Tab("Tab 2"));
Button button = new Button("Button");
Label label = new Label("Label");
contentPane.getChildren().addAll(button, label);
stage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}
点击选项卡的内容区域时,我不认为该按钮会失去焦点。我仍然希望能够通过单击选项卡的名称/文本位来关注选项卡,并使用快捷键更改选项卡。
我无法使用Tab或TabPane找到一种方法,但是如果我在内容窗格上添加一个鼠标按下的监听器(请参阅上面注释掉的代码),我确实得到了我需要的行为,但感觉不到像一个黑客。我必须在选项卡窗格中的每个项目上设置一个监听器。
所以我想我的问题是,有更好的方法吗?
我提出了一个问题:
https://javafx-jira.kenai.com/browse/RT-37941
由于
答案 0 :(得分:1)
当点击contentPane(FlowPane)时,您可以向Button请求焦点是代码的修改版本:
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;
public class FocusTest extends Application {
@Override
public void start(Stage stage) throws Exception {
TabPane tabPane = new TabPane();
tabPane.setFocusTraversable(false);
Scene scene = new Scene(tabPane, 500, 500);
stage.setScene(scene);
final Button button = new Button("Button");// I moved this here and added final
Tab tab = new Tab("Tab 1");
FlowPane contentPane = new FlowPane();
contentPane.setOnMouseClicked(new EventHandler<MouseEvent>() {//I think this is what you are looking for
public void handle(MouseEvent event) {
button.requestFocus();
}
});
tab.setContent(contentPane);
tabPane.getTabs().addAll(tab, new Tab("Tab 2"));
Label label = new Label("Label");
contentPane.getChildren().addAll(button, label);
stage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}
如果您有任何疑问或想知道如何使用多个按钮或其他对象评论来做同样的事情 我希望这会对你有帮助!