JavaFx SwingNode - 随机显示黑色,背景或组件

问题描述:

我在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

我没有与它(jre1.8.0_91)任何麻烦

但摆有在for循环

产生Jbuttons中的错误我会建议你使用JavaFX的按钮,而不是旧的秋千

+1

“在swing中,有一个在for循环中生成jbutton的bug”。你能更具体一点,并参考错误报告? –

必须在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

有关于这一点,类似的问题,这是理应解决的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组件。