【问题标题】:Swing/AWT/JavaFX GUI Freezing/NullPointerExceptionSwing/AWT/JavaFX GUI 冻结/NullPointerException
【发布时间】:2021-11-09 10:19:30
【问题描述】:

我有一个扩展应用程序的类:

public class IO extends Application {
    private static JFrame frame = new JFrame("Shapes");;
    private final JPanel content = new JPanel();
    private final JPanel drawingArea = new JPanel();

我的主要/启动方法:

public static void main(String[] args) {
    Application.launch(args);
}

public void start(Stage primaryStage) throws Exception {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new JFXPanel(); // initializes JavaFX environment
            createGUI();
        }
    });
}

我这样做是为了解决每个 this question 的 swing/JavaFX 组件之间的任何问题。但是,当我单击将 JFXPanel 或 JFXPanel 添加到另一个 JPanel 的按钮时,如果它是 JFXPanel,它将执行一次就好了,但此后我尝试再次生成 JFXPanel 时它将失败,给出“线程“AWT-EventQueue-0”java.lang.NullPointerException”中的异常(但实际上出现此错误总共需要 3 次 - 第二次它会冻结,如果没有,它什么也不做)。这是按钮的相关代码:

JButton go = new JButton("Go");
go.addActionListener(new ActionListener() {
    // irrelevant code
        System.out.println("Shape set parameters: " + selectedShape.setParameters(shapeParams));
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new JFXPanel(); // initializes JavaFX environment
                Component shapePanel = (Component) new PaintedShape(selectedShape).getPanel();
                drawingArea.add(shapePanel);
                // drawingArea.add(new JLabel("Test"));
                // drawingArea.repaint();
                shapePanel.repaint();
                shapePanel.validate();
                drawingArea.repaint();
                drawingArea.validate();
                frame.pack();
                frame.setSize(new Dimension((int) (frame.getSize().getWidth() + PaintedShape.size.getWidth()),
                        (int) (frame.getSize().getHeight() + PaintedShape.size.getHeight())));
                frame.setLocationRelativeTo(null);
            }
        });
    }
});
params.add(go);
content.validate();

我多次调用validate(),因为它有时无法添加形状,而其中一组调用最初修复了该错误。如果您解释哪个面板更适合我调用它,则可以加分。 如果您觉得需要其余代码,我创建了一个 github 存储库here

编辑: 完整的堆栈跟踪 -

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at com.sun.javafx.tk.quantum.QuantumToolkit.isSupported(QuantumToolkit.java:1153)
    at com.sun.javafx.application.PlatformImpl.isSupportedImpl(PlatformImpl.java:809)
    at com.sun.javafx.application.PlatformImpl.isSupported(PlatformImpl.java:482)
    at javafx.application.Platform.isSupported(Platform.java:168)
    at javafx.scene.shape.Shape3D.<init>(Shape3D.java:74)
    at javafx.scene.shape.Cylinder.<init>(Cylinder.java:89)
    at shapes.PaintedShape.painted3DShapePanel(PaintedShape.java:96)
    at shapes.PaintedShape.<init>(PaintedShape.java:51)
    at shapes.IO$1$1$1.run(IO.java:215)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

编辑: 调试进一步使我发现不可能在 PaintedShape.java 中实例化任何新的 3D javafx 形状(参见堆栈跟踪的第 6 行 - at javafx.scene.shape.Shape3D.&lt;init&gt;(Shape3D.java:74)),可能是由于线程安全。我的一些修复包含在下面的答案中,但我没有提到,尽管我的代码被包装在 Runnable()s “稍后调用”中,但我也将特定的 JFXPanel 生成代码冗余嵌套在相同的可运行结构中。这可能有所帮助,但我不确定如何。

Platform.runLater(() -> {
    try {
        SwingUtilities.invokeLater(() -> {
            drawingPanel.add(shapePanel);
            frame.pack();
        });

    } catch (Exception e) {
        e.printStackTrace();
    }

});

【问题讨论】:

标签: java swing javafx nullpointerexception awt


【解决方案1】:

修复它。我相信错误可能是,从JPanel drawingArea 中删除所有元素后,它不是立即validate()d,因此不支持向其中添加元素。我还确保 JFXPanel 是这样输入的,而不是被强制转换为组件。我还确保每次通过 JPanel drawing 按下按钮时都会创建它添加到的 JPanel,以防它在以前的方法范围内由于某种原因很重要。见:

go.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    final JPanel drawing = new JPanel();
        // irrelevant
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new JFXPanel(); // initializes JavaFX environment
                if (selectedShape.getClass().getSuperclass().getSimpleName()
                        .equals("TwoDimensionalShape")) {
                    Component shapePanel = (Component) new PaintedShape(selectedShape).getPanel();
                    drawing.add(shapePanel);
                } else {
                    JFXPanel shapePanel = (JFXPanel) new PaintedShape(selectedShape).getPanel();
                    Platform.runLater(() -> {
                        try {
                            SwingUtilities.invokeLater(() -> {
                                drawing.add(shapePanel);
                                frame.pack();
                            });

                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                    });
                }
                drawingArea.removeAll();
                drawingArea.validate();
                drawingArea.add(drawing);
                drawingArea.repaint();
                frame.pack();
                frame.setSize(new Dimension((int) (frame.getSize().getWidth()),
                        (int) (frame.getSize().getHeight() + PaintedShape.size.getHeight())));
                frame.setLocationRelativeTo(null);
            }
        });
    }
});

完整的代码以及更改推送到 git repo 以及更多好奇。

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 2013-11-05
    • 2018-05-25
    • 1970-01-01
    相关资源
    最近更新 更多