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内容修正了该问题对于这个简单的代码,但不是我的较大项目。所以我猜测这是内存泄漏,但我无法从我的机器上知道。
有人可以测试此代码,看看他们是否得到类似的结果?
编辑:感谢您的快速反馈,请不要关注按钮,因为它们只是一个工具来展示我的问题。奇怪的功能与其他对象的操作方式相同,而不是按钮。
我没有与它(jre1.8.0_91)任何麻烦
但摆有在for循环
产生Jbuttons中的错误我会建议你使用JavaFX的按钮,而不是旧的秋千
“在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);
}
}
使用此方法,该按钮再次出现黑色。不过,我不应该在点击窗口时点击该按钮。点击另一个按钮也可以看到它。虽然不完美,但我认为这可以奏效。 – 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组件。
即使通过@James_D复制Javadocs示例,问题仍然存在。还有其他想法吗?这个bug在U40显然是固定的,它能否再次被破坏? – Lost
我仍然在Windows 7的最新8u121中看到这个问题,使用invokeLater()或invokeAndWait() – Adam