【问题标题】:Thread.exit() line:not available error in integrating javafx into swing using jfxpanelThread.exit() 行:使用 jfxpanel 将 javafx 集成到 swing 时出现不可用错误
【发布时间】:2014-09-14 11:27:32
【问题描述】:

我正在尝试在 swing 应用程序中使用 fxml。我现在面临的问题是 jframe 出现了,但 javafx 组件却看不到。没有给出错误,但在调试时会给出“Thread.exist() line: not available”错误。我这里有完整的代码:-

package nonResponsiveButtons;

import java.awt.Color;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import javafx.application.Platform;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class NonResponsiveButtons extends JFrame {

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

    public NonResponsiveButtons(){

        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                try{
                new JFXPanel();
                BottomPanel bottomPanel = new BottomPanel();
                add(bottomPanel);
                }
                catch(Exception e){
                    System.out.println("Error in swing utilities thread :" + e.getMessage());
                }

            }
        });

        this.setSize(600, 600);
        getContentPane().setLayout(null);
        add(jPanel());      


        setVisible(true);
    }

    private JPanel jPanel(){
        JPanel panel = new JPanel();
        panel.setSize(600,500);
        panel.setBackground(Color.blue);
        return panel;
    }

    private class BottomPanel extends JPanel{
        private JFXPanel jfxPanel;
        private Pane scenePane;
        private Button btn1;
        private Button btn2;
        private Button btn3;

        private BottomPanel(){
            setSize(600, 100);
            setLocation(0, 500);
            setLayout(null);



            Platform.runLater(new Runnable(){
                @Override
                public void run(){
                    getScenePane().getChildren().addAll(getBtn1(),getBtn2(),getBtn3());
                    getjfxPanel().setScene(new Scene(getScenePane()));

                }

            });
        }

        private JFXPanel getjfxPanel(){
            if(jfxPanel == null){
                jfxPanel = new JFXPanel();
                jfxPanel.setSize(600,200);
            }
            return jfxPanel;
        }

        private Pane getScenePane(){
            if(scenePane == null){
                scenePane = new Pane();
                scenePane.setStyle("-fx-background-color:#666666");
            }
            return scenePane;
        }

        /*
         * using getters will avoid :-
         * 1. null pointer exceptions
         * 2. standard coding format
         * 3. makex programming felxible
         */
        private Button getBtn1(){
            if(btn1 == null){
                btn1 = new Button();
                btn1.setPrefSize(100, 50);
                btn1.setLayoutX(80);
            }
            return btn1;
        }
        private Button getBtn2(){
            if(btn2 == null){
                btn2 = new Button();
                btn2.setPrefSize(100, 50);
                btn2.setLayoutX(80);
            }
            return btn2;
        }
        private Button getBtn3(){
            if(btn3 == null){
                btn3 = new Button();
                btn3.setPrefSize(100, 50);
                btn3.setLayoutX(80);
            }
            return btn3;
        }
    }


}

【问题讨论】:

    标签: java multithreading swing javafx jframe


    【解决方案1】:

    您看不到JFXPanel,因为您尚未将JFXPanel 添加到BottomPanel。在BottomPanel的构造函数里面,加上add(getjfxPanel());

    您的构造函数将如下所示:

    private BottomPanel(){
        setSize(600, 100);
        setLocation(0, 500);
        setLayout(null);
    
        Platform.runLater(new Runnable(){
           @Override
           public void run(){
               getScenePane().getChildren().addAll(getBtn1(),getBtn2(),getBtn3());
               getjfxPanel().setScene(new Scene(getScenePane()));
           }
        });
        add(getjfxPanel());
    }
    

    注意:添加后您将只能看到一个Button。代码没有问题,您将按钮添加到Pane,这就是它们相互重叠的原因。只需将您的Pane 替换为HBox,您将能够看到所有按钮,因为HBox 按水平顺序对齐控件,这正是您想要的(可能是;))

    【讨论】:

    • 谢谢@ItachiUchiha 现在我的代码可以正常工作了。现在我想在单击 btn1 时从 Hbox(变量名:scenePane)中删除所有组件。我使用getScenePane().getChildren().removeAll(); 删除了 Hbox 的所有组件,但它不起作用,因为 btn1 在 scenePane 内。但是当我删除其他一些组件时,例如 btn2 getScenePane().getChildren().remove(getbtn2); 然后 btn2 被删除。如何使用自己的孩子的动作侦听器删除scenePane的所有组件
    • @Viper 每当您有其他问题(与当前问题无关)时,您都应该添加一个新问题,而不是评论旧问题。
    • 如果getScenePane() 正在返回添加了ButtonHBox 引用,getScenePane().getChildren().removeAll(); 应该可以工作!
    猜你喜欢
    • 2013-05-27
    • 1970-01-01
    • 2021-12-19
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多