У меня есть комбинированное приложение 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.