我有一個擴展Application的類:
我有一個擴展Application的類。
public class IO extends Application {
private static JFrame frame = new JFrame("Shapes"/span>)。 ;
private final JP面板 content = new JPanel() 。
private final JP面板 drawingArea = new JPanel()。
我的main/start方法:
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(); //initizes JavaFX environment
createGUI()。
}
});
}
我這樣做的目的是希望能夠按照這個問題解決擺動/JavaFX組件之間的任何麻煩。然而,當我點擊一個按鈕,將一個Jpanel或一個JFXPanel添加到另一個Jpanel時,如果是JFXPanel,它將正常執行一次,但此后任何時候我試圖再次生成一個JFXPanel時都會失敗,給出一個 "Exception in thread "AWT-EventQueue-0" java. lang.NullPointerException"(但實際上這個錯誤總共要出現3次--第二次會凍結,如果不凍結,就什么都不做)。以下是該按鈕的相關代碼:
JButton go = new JButton("Go") 。
go.addActionListener(new ActionListener() {
//無關代碼
System.out.println("Shape set parameters: " selectedShape.setParameters(shapeParams))。
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new JFXPanel(); //初始化JavaFX環境。
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 repo 這里.
編輯。 完整的堆疊跟蹤 -
執行緒"AWT-EventQueue-0"java.lang.NullPointerException中出現例外。
在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.pained3DShapePanel(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中無法實體化任何新的三維javafx形狀(見堆疊跟蹤的第6行--at javafx.scene.shape3D.<init>(Shape3D.java:74)),可能是因為執行緒安全問題。我的一些修復措施包括在我下面的答案中,但我沒有提到,盡管我的代碼被包裹在Runnable()s "稍后呼叫 "中,我也冗余地將具體的JFXPanel生成代碼嵌套在同一runnable結構中。這可能有所幫助,盡管我并不確切地知道是怎樣的。
Platform.runLater(() -> {
try {
SwingUtilities.invokeLater(() -> {
drawingPanel.add(shapePanel);
frame.pack();
});
} catch (Exception e) {
e.printStackTrace()。
}
});
uj5u.com熱心網友回復:
修復了它。我相信錯誤可能是,在從JPNEL drawingArea中移除所有元素后,它沒有立即validate()d,因此不支持向它添加元素。我還確保了JFXPanel的型別是這樣的,而不是被轉換為一個Component。我還確保在每次通過Jpanel drawing按下按鈕時,它被添加到的Jpanel被創建,以防它在之前的方法的范圍內因某種原因而變得重要。請看:
go.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final JP面板 drawing = new JPanel()。
//無關
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new JFXPanel(); //初始化JavaFX環境。
if (selectedShape.getClass().getSuperclass().getSimpleName()
.equals("TwoDimensionalShape")) {
Component shapePanel = (Component) new PaintedShape(選定形狀)。 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,供更多的人好奇。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/332757.html
標籤:
