Проблемы с потоками JavaFX/Swing при вводе в TextField после того, как родительский JFrame теряет фокус

У меня есть комбинированное приложение Swing/JavaFX, использующее JDesktopPane и JInternalFrame для 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);
  }

}   

Чтобы воспроизвести проблему:

Выберите меню «Тест» -> «Тестовый элемент»
Нажмите на текстовое поле
Нажмите за пределами окна приложения
Нажмите на текстовое поле еще раз
Начните печатать

Иногда текст удваивается (т. е. ввод «тест» приводит к «тесттест»), и в конце концов я начинаю получать ряд исключений. Пример трассировки стека здесь.

Изменить: я использую Windows 10.


person ashhappens    schedule 18.01.2018    source источник
comment
Не могу воспроизвести. Протестировано на JDK 1.8.0_161 и JDK 9 (сборка 9+181) в Mac OS X. Однако трассировка стека определенно указывает на проблему с потоками, поскольку в потоке событий AWT сообщается о методах, которые следует вызывать только в потоке приложения FX. .   -  person James_D    schedule 18.01.2018


Ответы (1)


Эта проблема не воспроизводится в сборке раннего доступа JDK 8 (8u172), которая еще не выпущена. Так что, пожалуйста, дождитесь того же. Также не воспроизводится в JDK 9 и сборка раннего доступа JDK 10. Об этой проблеме уже сообщалось, и вы можете отслеживать ее здесь: https://bugs.openjdk.java.net/browse/JDK-8195739 Спасибо.

person Priyanka    schedule 19.01.2018