【问题标题】:JavaFX/Swing threading issues when typing in TextField after parent JFrame loses focus在父 JFrame 失去焦点后输入 TextField 时出现 JavaFX/Swing 线程问题
【发布时间】:2018-06-27 21:34:40
【问题描述】:

我有一个组合 Swing/JavaFX 应用程序,它使用 JDesktopPane 和 JInternalFrame for MDI 和 JFXPanel 将 JavaFX 字段嵌入到内部框架中。在 Java 8u161 之前,这一直运行良好。随着更新,当用户尝试输入文本字段时,会引发许多未捕获的异常,最明显的是在父 JFrame 失去焦点之后。任何解决方法的建议将不胜感激。

示例程序:

import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TextField;

public class SwingFXTest {

  public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> {
      new SwingFXTest().initAndShowGUI();
    });
  }

  private void initAndShowGUI() {
    JFrame frame = new JFrame("Test 8u161");
    JDesktopPane desktopPane = new JDesktopPane();
    JMenuBar menuBar = new JMenuBar();
    JMenu menu = new JMenu("Test Menu");
    menuBar.add(menu);
    JMenuItem menuItem = new JMenuItem("Test Item");
    menuItem.addActionListener(e -> {
      desktopPane.add(createInternalFrame());
    });
    menu.add(menuItem);
    frame.setJMenuBar(menuBar);
    frame.setContentPane(desktopPane);
    frame.setSize(600, 600);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }

  private JInternalFrame createInternalFrame() {
    JInternalFrame internalFrame = new JInternalFrame();
    internalFrame.setVisible(true);
    internalFrame.setResizable(true);
    internalFrame.setSize(200, 200);
    final JFXPanel fxPanel = new JFXPanel();
    internalFrame.setContentPane(fxPanel);
    Platform.runLater(() -> initFX(fxPanel));
    return internalFrame;
  }

  private void initFX(JFXPanel fxPanel) {
    TextField field = new TextField();
    Group root = new Group(field);
    Scene scene = new Scene(root);
    fxPanel.setScene(scene);
  }

}   

重现问题:

选择测试菜单 -> 测试项目
单击文本字段
在应用程序窗口外单击
再次单击文本字段
开始输入

有时文本会加倍(即输入“test”会导致“testtest”),最终我开始遇到一些异常。示例堆栈跟踪here

编辑:我正在运行 Windows 10。

【问题讨论】:

  • 无法复制。在 Mac OS X 上的 JDK 1.8.0_161 和 JDK 9 (build 9+181) 上测试。堆栈跟踪肯定表明存在线程问题,因为在 AWT 事件线程上报告了一些方法,这些方法只能在 FX 应用程序线程上调用.

标签: java swing javafx jfxpanel


【解决方案1】:

此问题在尚未发布的 JDK 8 早期访问版本 (8u172) 中无法重现。所以请稍等。 在JDK 9JDK 10 early-access build 中也无法重现。 此问题已报告,您可以在此处跟踪: https://bugs.openjdk.java.net/browse/JDK-8195739 谢谢

【讨论】:

    猜你喜欢
    • 2023-01-16
    • 2018-01-08
    • 2020-05-27
    • 1970-01-01
    • 2020-05-24
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    相关资源
    最近更新 更多