![](/img/trans.png)
[英]How to resize Swing control which is inside SwingNode in JavaFX8?
[英]Can't set focus on JTextPane inside JavaFX SwingNode
我試圖將焦點設置在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);
}
}
由於BWC_semaJ的解決方案,它現在可以正常工作。 而不是使用:
SwingUtilities.invokeLater(() -> pane.requestFocusInWindow());
我應該使用:
Platform.runLater(() -> {swingNode.requestFocus();}); //Use this instead
我不知道這是否有幫助,但是下面是我根據示例代碼制作的演示程序,由於某種原因它對我有用:
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.*;
public class Test extends Application {
@FXML
private ListView listView;
@FXML
private SwingNode node;
private ObservableList<Integer> obsList;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage arg0) throws Exception {
initialize(arg0);
}
@FXML
public void initialize(Stage stage){
JTextPane pane = new JTextPane();
// The program runs the same no matter if one of the below two lines are used or if neither are used
//SwingUtilities.invokeLater(() -> pane.requestFocusInWindow());
//Platform.runLater(() -> {node.requestFocus();});
pane.setText("This issue is not reproducible in JDK 8 early-access build (8u172) which is yet to be released.");
node = new SwingNode();
node.setContent(pane);
obsList = FXCollections.observableArrayList();
for(int x = 0; x < 12; x++){
obsList.add(x);
}
listView = new ListView();
listView.setItems(obsList);
node.setFocusTraversable(true);
node.requestFocus();
pane.requestFocus();
pane.grabFocus();
StackPane root = new StackPane();
root.getChildren().add(node);
Scene scene = new Scene(root, 500, 500);
stage.setTitle("Test");
stage.setScene(scene);
stage.show();
}
@FXML
private void removeItem(ActionEvent event) {
obsList.remove(0);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.