无法将焦点设置在 JavaFX SwingNode 内的 JTextPane 上

我正在尝试将焦点设置在 JTextPane 上,以便在窗口打开时可以立即使用键盘进行编辑。但是,我所做的一切似乎都没有让 JTextPane 专注于启动。这只是将 JavaFX 与 Swing 结合使用的问题吗?


import javafx.collections.FXCollections;

import javafx.collections.ObservableList;

import javafx.embed.swing.SwingNode;

import javafx.event.ActionEvent;

import javafx.fxml.FXML;

import javafx.scene.control.ListView;


import javax.swing.*;


public class TestDialog {


    @FXML

    private ListView listView;

    @FXML

    private SwingNode node;


    private ObservableList<Integer> obsList;


    @FXML

    public void initialize(){

        JTextPane pane = new JTextPane();

        SwingUtilities.invokeLater(() -> pane.requestFocusInWindow());

        pane.setText("This issue is not reproducible in JDK 8 early-access build (8u172) which is yet to be released.");


        node.setContent(pane);

         obsList = FXCollections.observableArrayList();

        for(int x = 0; x < 12; x++){

            obsList.add(x);

        }

        listView.setItems(obsList);


        node.setFocusTraversable(true);

        node.requestFocus();

        pane.requestFocus();

        pane.grabFocus();

    }


    @FXML

    private void removeItem(ActionEvent event) {

        obsList.remove(0);

    }

}


缥缈止盈
浏览 164回答 2
2回答

jeck猫

我不知道这是否有帮助,但下面是我根据示例代码制作的演示程序,出于某种原因,它对我有用:import javafx.application.Application;import javafx.application.Platform;import javafx.collections.FXCollections;import javafx.collections.ObservableList;import javafx.embed.swing.SwingNode;import javafx.event.ActionEvent;import javafx.fxml.FXML;import javafx.scene.Scene;import javafx.scene.control.ListView;import javafx.scene.layout.StackPane;import javafx.stage.Stage;import javax.swing.*;&nbsp; &nbsp;public class Test extends Application {&nbsp; &nbsp; @FXML&nbsp; &nbsp; private ListView listView;&nbsp; &nbsp; @FXML&nbsp; &nbsp; private SwingNode node;&nbsp; &nbsp; private ObservableList<Integer> obsList;&nbsp; &nbsp; public static void main(String[] args) {&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; launch(args);&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public void start(Stage arg0) throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; initialize(arg0);&nbsp; &nbsp; }&nbsp; &nbsp; @FXML&nbsp; &nbsp; public void initialize(Stage stage){&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; JTextPane pane = new JTextPane();&nbsp; &nbsp; &nbsp; &nbsp; // The program runs the same no matter if one of the below two lines are used or if neither are used&nbsp; &nbsp; &nbsp; &nbsp; //SwingUtilities.invokeLater(() -> pane.requestFocusInWindow());&nbsp; &nbsp; &nbsp; &nbsp; //Platform.runLater(() -> {node.requestFocus();});&nbsp; &nbsp; &nbsp; &nbsp; pane.setText("This issue is not reproducible in JDK 8 early-access build (8u172) which is yet to be released.");&nbsp; &nbsp; &nbsp; &nbsp; node = new SwingNode();&nbsp; &nbsp; &nbsp; &nbsp; node.setContent(pane);&nbsp; &nbsp; &nbsp; &nbsp; obsList = FXCollections.observableArrayList();&nbsp; &nbsp; &nbsp; &nbsp; for(int x = 0; x < 12; x++){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obsList.add(x);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; listView = new ListView();&nbsp; &nbsp; &nbsp; &nbsp; listView.setItems(obsList);&nbsp; &nbsp; &nbsp; &nbsp; node.setFocusTraversable(true);&nbsp; &nbsp; &nbsp; &nbsp; node.requestFocus();&nbsp; &nbsp; &nbsp; &nbsp; pane.requestFocus();&nbsp; &nbsp; &nbsp; &nbsp; pane.grabFocus();&nbsp; &nbsp; &nbsp; &nbsp; StackPane root = new StackPane();&nbsp; &nbsp; &nbsp; &nbsp; root.getChildren().add(node);&nbsp; &nbsp; &nbsp; &nbsp; Scene scene = new Scene(root, 500, 500);&nbsp; &nbsp; &nbsp; &nbsp; stage.setTitle("Test");&nbsp; &nbsp; &nbsp; &nbsp; stage.setScene(scene);&nbsp; &nbsp; &nbsp; &nbsp; stage.show();&nbsp; &nbsp; }&nbsp; &nbsp; @FXML&nbsp; &nbsp; private void removeItem(ActionEvent event) {&nbsp; &nbsp; &nbsp; &nbsp; obsList.remove(0);&nbsp; &nbsp; }}

弑天下

由于BWC_semaJ的解决方案,它现在可以工作了。而不是使用:SwingUtilities.invokeLater(()&nbsp;->&nbsp;pane.requestFocusInWindow());我应该使用:Platform.runLater(()&nbsp;->&nbsp;{swingNode.requestFocus();});&nbsp;//Use&nbsp;this&nbsp;instead
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java