gpt4 book ai didi

java - 多个 SwingNode 导致极度性能下降

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:56:33 25 4
gpt4 key购买 nike

当我在面板(JFXPanel 中的 GridPane)中有多个 SwingNode 时,我注意到性能极度下降。如果只有一个 SwingNode,这似乎不会发生。

我意识到混合使用 Swing 和 JavaFX 时会出现一些预期的性能下降,但这会使应用程序几乎无法使用(而且我无法真正改变我的行业环境;遗留代码仍在 Swing 中,但我们确实需要新的JavaFX 图形实用程序)。

这是在 Java 8u60 上的 Windows 7 上运行。

MCVE:

import javax.swing.*;

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.embed.swing.SwingNode;
import javafx.scene.Scene;
import javafx.scene.control.ToggleButton;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;

public class SwingNodeTest {
private static Scene createScene(JComponent button1, JComponent button2) {
GridPane pane = new GridPane();
pane.getColumnConstraints().add(new ColumnConstraints(100));
pane.getColumnConstraints().add(new ColumnConstraints(200));

SwingNode node1 = new SwingNode();
// Best practice to call SwingNode->setContent(...) on the EDT, but doesn't make
// a difference for the test.
node1.setContent(button1);
pane.add(node1, 0, 0);

ToggleButton node2 = new ToggleButton("2");
// Commenting out the above line and uncommenting the below lines cause EXTREME
// Performance degradation.
// SwingNode node2 = new SwingNode();
// node2.setContent(button2);
pane.add(node2, 1, 0);

return new Scene(pane);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
JFXPanel panel = new JFXPanel();
frame.setSize(800, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(panel);
frame.setVisible(true);

JButton button1 = new JButton("1");
JToggleButton button2 = new JToggleButton("2");

Platform.runLater(new Runnable() {
@Override
public void run() {
final Scene scene = createScene(button1, button2);
panel.setScene(scene);
}
});
}
});
}
}

编辑:让这个 MCVE 运行几分钟后才意识到,我得到了 OutOfMemoryErrors(超出了 GC 开销限制)。

最佳答案

我将此作为错误提交。截至撰写本文时,它目前处于开放状态并在 JDK 待办事项列表中:

https://bugs.openjdk.java.net/browse/JDK-8144504

不幸的是,虽然这个错误是开放的,但唯一的解决方法似乎是限制您的 Swing 到 JavaFX 到 Swing 的集成。我们最终在 JavaFX 中重新制作了在 JavaFX 面板中使用的所有 Swing 小部件,这是一次相当大的改革。

为了给在这里徘徊寻找这个问题的解决方案的任何人提供引用,我还将发布这个 JDK 错误,它在撰写本文时也是公开的:

https://bugs.openjdk.java.net/browse/JDK-8136530

该错误指出,即使您在 JFXPanel 的 JavaFX Pane 中只有一个 SwingNode,您的 CPU 使用率也会急剧增加(但不会发生多个节点的卡住)。在我们认为我们通过限制 JavaFX Pane 中的 SwingNode 实例的数量巧妙地解决了这个问题之后,这最终给我们带来了麻烦。希望这个提醒将有助于防止其他人像我们一样面对它。

编辑(2017 年 9 月 21 日):卡住错误现在已在 Java 10 的修复版本中列为已修复。CPU 使用率增加错误仍处于开放状态。

关于java - 多个 SwingNode 导致极度性能下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33948883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com