首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaFX 8 swing兼容性

JavaFX 8 swing兼容性
EN

Stack Overflow用户
提问于 2014-04-02 10:14:16
回答 3查看 3.9K关注 0票数 14

目前,我正在评估使用JavaFX将当前的Swing应用程序转换为SwingNode 8是否可行,然后慢慢地将所有内容更改为JavaFX组件。我遇到了两个问题,这可能是JavaFX 8中挥之不去的错误,但我不能肯定。

  1. 在将内容添加到SwingNode之后,Javafx菜单没有被正确绘制(大多数情况下),导致出现一个黑条
  2. 使JScrollBars不透明似乎不起作用 进口java.awt.Color;进口java.awt.GridLayout;进口javafx.application.Application;进口javafx.embed.swing.SwingNode;进口javafx.scene.Scene;进口javafx.scene.control.Menu;进口javafx.scene.control.MenuBar;进口javafx.scene.layout.StackPane;进口javafx.scene.layout.VBox;进口javafx.stage.Stage;进口javax.swing.JPanel;进口javax.swing.JScrollPane;公共类测试扩展应用程序{@覆盖公共无效启动(阶段)抛出异常{stage.setMaximized(真);vbox VBox =新VBox();menuBar MenuBar =新MenuBar();menuBar.getMenus().add(新菜单(“bla”));vbox.getChildren().add(menuBar);StackPane mainPane =新StackPane();mainPane.setPrefSize(9999,9999);//确保使用所有空间的更好方法?vbox.getChildren().add(mainPane);vbox.setVisible(真);场景=新场景(vbox,9999,9999);//确保所有空间使用的更好方法?Stage.setScene(场景);swingNode SwingNode =新SwingNode();mainPane.getChildren().add(swingNode);jPanel JPanel =新JPanel();swingNode.setContent( JPanel );//似乎干扰了菜单jPanel.setBackground(Color.WHITE);jPanel.setLayout(new GridLayout(2,1));jPanel.add(new JPanel());jPanel.add= new ();NonOpaquePanel.setOpaque(假);JScrollPane scrollPane =新JScrollPane(nonOpaquePanel);scrollPane.setOpaque(false);scrollPane.getViewport().setOpaque(false);//黑背景-> Bug?启动应用程序的jPanel.add(scrollPane);stage.show();} /** * Main方法。*/公共静态空主(String[] args) { static (Args);}} 可执行jar

编辑:我编辑了我的示例以使用EDT创建Swing组件。这并没有改变什么。还是我做错什么了?

代码语言:javascript
运行
复制
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.embed.swing.SwingNode;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;


public class Test extends Application {
    private JPanel jPanel = null;

    @Override
    public void start(Stage stage) throws Exception {
        if (Platform.isFxApplicationThread()) { // all of this happens on the fx application thread
            stage.setMaximized(true);

            VBox vbox = new VBox();
            MenuBar menuBar = new MenuBar();
            menuBar.getMenus().add(new Menu("bla"));
            vbox.getChildren().add(menuBar);

            StackPane mainPane = new StackPane();        
            mainPane.setPrefSize(9999, 9999); //Better way to ensure all space used?
            vbox.getChildren().add(mainPane);
            vbox.setVisible(true);

            Scene scene = new Scene(vbox, 9999, 9999); //Better way to ensure all space used?
            stage.setScene(scene);

            SwingNode swingNode = new SwingNode();
            mainPane.getChildren().add(swingNode);                    

            SwingUtilities.invokeLater(new Runnable() { //Use EDT to build swing components              
                @Override
                public void run() {
                    jPanel = new JPanel();

                    jPanel.setBackground(Color.WHITE);
                    jPanel.setLayout(new GridLayout(2, 1));
                    jPanel.add(new JPanel());

                    JLabel nonOpaquePanel = new JLabel("Bla");
                    nonOpaquePanel.setPreferredSize(new Dimension(5000, 5000));
                    nonOpaquePanel.setOpaque(false);
                    JScrollPane scrollPane = new JScrollPane(nonOpaquePanel);
                    scrollPane.setOpaque(false);
                    scrollPane.getViewport().setOpaque(false); //Black background -> Bug?
                    jPanel.add(scrollPane);
                }
            });

            Thread.sleep(1000); //terrible way to wait for the EDT, I know
            swingNode.setContent(jPanel); //Seems to interfere with painting of menu            
            stage.show();

            SwingUtilities.invokeLater(new Runnable() { //I am pretty sure this isn't necessary, but whatever                       
                @Override
                public void run() {
                    jPanel.repaint();    
                }
            });
        }
    }

    /**
     * Main method launching the application.
     */
    public static void main(String[] args) {
        launch(args);
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-27 23:10:54

一定是JavaFX中的一个bug,这个例子现在很好用。

票数 1
EN

Stack Overflow用户

发布于 2014-05-15 14:29:14

当您进行更新调用时,请尝试将您的更新代码包装在此。这段代码以前在其他项目上帮助过我。

代码语言:javascript
运行
复制
Platform.runLater(new Runnable() {
            @Override
            public void run() {
                // Update the text node with calculated results
            }
       });

来源

票数 4
EN

Stack Overflow用户

发布于 2015-04-29 11:41:28

您可以使用-Djavafx.embed.singleThread=true,这样就不必自己进行事件分派了。

JavaFx APIDesign

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22808223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档