2016-08-17 97 views
1

我在JavaFx的SwingNode中顯示Java 1.8.0_102-b14中包含的組件時出現問題。我不確定這個問題是否是由於我的Java版本老舊,當前(如果我的是最新版本)Java版本或某個SwingNode進程錯誤的。我知道這個問題已在JavaFX and SwingNode - partial black Window之前報告過,所以我真的在尋找關於我的Java版本的反饋。JavaFx SwingNode - 隨機顯示黑色,背景或組件

這段代碼通常會顯示「button1」錯誤,如黑色或背景顏色,直到鼠標懸停在它上面或被點擊。這對我來說不是一個理想的解決方法,因爲我的項目在Fx項目中使用更復雜的擺動面板,不幸的是,純Fx不是一種選擇。

import javafx.application.Application; 
import javafx.embed.swing.SwingNode; 
import javafx.scene.Scene; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

import javax.swing.JButton; 

public class Test extends Application { 

    @Override 
    public void start(Stage stage) { 
     final SwingNode swingNode1 = new SwingNode(); 
     final SwingNode swingNode2 = new SwingNode(); 

     swingNode2.setContent(new JButton("Click me!"+2)); 
     swingNode1.setContent(new JButton("Click me!"+1)); 

     BorderPane pane = new BorderPane(); 
     pane.setLeft(swingNode1); 
     pane.setRight(swingNode2); 

     stage.setScene(new Scene(pane, 200, 50)); 
     stage.show(); 
    } 

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

在創建這個sssce我發現,設置在右側SwingNode內容之前設置在左側SwingNode內容修正了該問題對於這個簡單的代碼,但不是我的較大項目。所以我猜測這是內存泄漏,但我無法從我的機器上知道。

有人可以測試此代碼,看看他們是否得到類似的結果?

編輯:感謝您的快速反饋,請不要關注按鈕,因爲它們只是一個工具來展示我的問題。奇怪的功能與其他對象的操作方式相同,而不是按鈕。

+0

即使通過@James_D複製Javadocs示例,問題仍然存在。還有其他想法嗎?這個bug在U40顯然是固定的,它能否再次被破壞? – Lost

+0

我仍然在Windows 7的最新8u121中看到這個問題,使用invokeLater()或invokeAndWait() – Adam

回答

-1

我沒有與它(jre1.8.0_91)任何麻煩

但擺有在for循環

產生Jbuttons中的錯誤我會建議你使用JavaFX的按鈕,而不是舊的鞦韆

+1

「在swing中,有一個在for循環中生成jbutton的bug」。你能更具體一點,並參考錯誤報告? –

2

必須在AWT Event Dispatch線程上創建並顯示Swing組件(請參閱Swing's threading policy)。 Application.start()方法是invoked on the FX Application Thread

因此你需要

public class Test extends Application { 

    @Override 
    public void start(Stage stage) { 
     final SwingNode swingNode1 = new SwingNode(); 
     final SwingNode swingNode2 = new SwingNode(); 

     SwingUtilities.invokeLater(() -> { 
      swingNode2.setContent(new JButton("Click me!"+2)); 
      swingNode1.setContent(new JButton("Click me!"+1)); 
     }); 

     BorderPane pane = new BorderPane(); 
     pane.setLeft(swingNode1); 
     pane.setRight(swingNode2); 

     stage.setScene(new Scene(pane, 200, 50)); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

使用此方法,該按鈕再次出現黑色。不過,我不應該在點擊窗口時點擊該按鈕。點擊另一個按鈕也可以看到它。雖然不完美,但我認爲這可以奏效。 – Lost

1

有關於這一點,類似的問題,這是理應解決的bug report,但顯然它不是完全固定的,因爲我仍然在啓動時看到黑色方塊代替按鈕(1.8.0_91-B15)。

發生這種情況是因爲您的JavaFX組件是在您的Swing組件之前創建的。您可以通過在每個組件的調用requestFocus(),以確保他們得到適當的渲染解決這個問題:

SwingUtilities.invokeLater(() -> { 
    swingNode1.setContent(new JButton("Click me!"+1)); 
    swingNode1.requestFocus(); 
    swingNode2.setContent(new JButton("Click me!"+2)); 
    swingNode2.requestFocus(); 
}); 

或使用invokeAndWait(),讓您的應用程序等待直到創建您的Swing組件已經完成。

SwingUtilities.invokeAndWait(() -> { 
    swingNode1.setContent(new JButton("Click me!"+1)); 
    swingNode2.setContent(new JButton("Click me!"+2)); 
}); 

而且,James_D在他answer提到,不要忘記,你必須創建EDT Swing組件。