带有JavaFX Scence窗口的JFrame无法正确显示

问题描述

我创建了一个嵌入JavaFX的小型JFrame以显示DatePicker。首先从主应用程序界面调用此窗口,效果很好,但随后不再起作用。第二次调用它,但JFrame出现了,但没有我的任何JavaFX组件。也许我没有正确关闭JFrame?

如果您能帮助我了解发生了什么,我将不胜感激。这是我的代码

package com.myco.panels;

import com.myco.swingworkers.AddPOSwingWorker;
import java.awt.Dimension;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.layout.VBox;
import javafx.scene.layout.HBox;
import javafx.scene.layout.GridPane;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Tooltip;
import javafx.scene.control.DatePicker;
import javafx.scene.control.DateCell;
import javafx.scene.control.Label;
import javafx.scene.control.Alert;
import javafx.scene.control.ComboBox;
import javafx.util.Callback;
import javax.swing.JFrame;
import java.time.LocalDate;
import javafx.event.Event;
import javafx.scene.control.SelectionModel;
import javafx.scene.control.TextField;



/**
 *
 * @author fabio
 */
public class AddNewPOJFXPanel {
    
    private JFrame parentJFrame;
    private JFrame addNewJFrame;
    private DatePicker creationDatePicker;
    private static final String pattern = "dd-MMM-yy";
    private ComboBox poMethodComboBox;
    private ComboBox poLeaseDurationYearsComboBox;
    private ComboBox poERPComboBox;
    private TextField poNumberTextField;

    enum DateParameterType {
        CREATION_DATE
    };
    
    public AddNewPOJFXPanel(JFrame parentJFrame) {
        this.parentJFrame = parentJFrame;
    }
    
    
    public void initAndShowGUI() {
        // This method is invoked on the EDT thread
        addNewJFrame = new JFrame("Add new PO");
        addNewJFrame.setAlwaysOnTop(true);
        addNewJFrame.setLocationRelativeto(null);
        final JFXPanel addNewJFXPanel = new JFXPanel();
        addNewJFrame.add(addNewJFXPanel);
        addNewJFrame.setSize(350,300);
        addNewJFrame.setVisible(true);
        addNewJFrame.setDefaultCloSEOperation(JFrame.disPOSE_ON_CLOSE);
        
        Platform.runLater(() -> {
            addNewJFXPanel.setScene(createScene());
        });

        addNewJFrame.requestFocus();
    }
    
    
    
    private Scene createScene() {
        GridPane grid = new GridPane();
        grid.setAlignment(Pos.CENTER);
        grid.setHgap(10);
        grid.setVgap(10);

        // Datepicker
        Label pickLabel1 = new Label("PO Creation:");
        creationDatePicker = new DatePicker();
        creationDatePicker.setEditable(false);
        
        // PO details
        Label poERPLabel = new Label("PO ERP:");
        poERPComboBox = new ComboBox();
        poERPComboBox.getItems().addAll("Oracle","SAP");
        GridPane.setFillWidth(poERPComboBox,true);
        GridPane.setFillHeight(poERPComboBox,true);
        poERPComboBox.setMaxSize(Double.MAX_VALUE,Double.MAX_VALUE);
        
        Label poMethodLabel = new Label("PO Method:");
        poMethodComboBox = new ComboBox();
        poMethodComboBox.setonAction((e) -> {
            this.poMethodComboBoxEventListener(e);
        });
        poMethodComboBox.getItems().addAll("BUY","LEASE");
        GridPane.setFillWidth(poMethodComboBox,true);
        GridPane.setFillHeight(poMethodComboBox,true);
        poMethodComboBox.setMaxSize(Double.MAX_VALUE,Double.MAX_VALUE);
        
        Label poLeaseDurationYearsLabel = new Label("Lease Duration:");
        poLeaseDurationYearsLabel.setTooltip(new Tooltip("Years"));
        poLeaseDurationYearsComboBox = new ComboBox();
        poLeaseDurationYearsComboBox.setdisable(true);
        poLeaseDurationYearsComboBox.getItems().addAll("1","2","3","4","5");
        GridPane.setFillWidth(poLeaseDurationYearsComboBox,true);
        GridPane.setFillHeight(poLeaseDurationYearsComboBox,true);
        poLeaseDurationYearsComboBox.setMaxSize(Double.MAX_VALUE,Double.MAX_VALUE);
        
        Label poNumberLabel = new Label("PO Number:");
        poNumberTextField = new TextField();
        
        grid.add(pickLabel1,1);
        grid.add(creationDatePicker,1,1);
        grid.add(poERPLabel,2);
        grid.add(poERPComboBox,2);
        grid.add(poMethodLabel,3);
        grid.add(poMethodComboBox,3);
        grid.add(poLeaseDurationYearsLabel,4);
        grid.add(poLeaseDurationYearsComboBox,4);
        grid.add(poNumberLabel,5);
        grid.add(poNumberTextField,5);
        

        // Cell factory for picker date validation
        //poDatePicker.setDayCellFactory(getCustomDateCellFactory(DateParameterType.TO_DATE));

        // Button
        Button btn = new Button("Create");
        btn.setTooltip(new Tooltip("Creates new PO"));
        btn.setonAction(event -> {
            buttonActionListenerRoutine();
        });
        HBox btnHb = new HBox();
        btnHb.setAlignment(Pos.CENTER);
        btnHb.getChildren().add(btn);

        // VBox and scene
        VBox vBox = new VBox(20);
        vBox.setPadding(new Insets(15,15,15));
        vBox.getChildren().addAll(grid,btnHb);

        return new Scene(vBox);

    }
    
    private void poMethodComboBoxEventListener(Event e) {
        
        SelectionModel s = poMethodComboBox.getSelectionModel();
        
        if (!s.isEmpty()) {
            if (s.getSelectedItem().equals("LEASE")) {
                poLeaseDurationYearsComboBox.setdisable(false);
            } else {
                poLeaseDurationYearsComboBox.setdisable(true);
                poLeaseDurationYearsComboBox.valueproperty().set(null);
            }
        }
    }

    private void buttonActionListenerRoutine() {
        
        //this.setEnabled(false);
        JFrame loadingJFrame = new JFrame();
        LoadingJPanel loadingJPanel = new LoadingJPanel();

        Dimension d1 = new Dimension();
        d1.setSize(500,205);
        loadingJFrame.setResizable(false);
        loadingJFrame.setMinimumSize(d1);
        loadingJFrame.setTitle("Loading...");
        loadingJFrame.setLocationRelativeto(null);
        loadingJFrame.setDefaultCloSEOperation(JFrame.disPOSE_ON_CLOSE);
        loadingJFrame.setAlwaysOnTop(true);
        loadingJFrame.setVisible(true);
        loadingJFrame.add(loadingJPanel);

        loadingJPanel.updateStatus("Starting");

        AddPOSwingWorker worker = new AddPOSwingWorker(loadingJFrame,loadingJPanel,parentJFrame,addNewJFrame,creationDatePicker.getValue(),poMethodComboBox.getSelectionModel().getSelectedItem().toString(),poERPComboBox.getSelectionModel().getSelectedItem().toString(),poLeaseDurationYearsComboBox,poNumberTextField.getText());
        worker.execute();
        
    }
    
    
    
}

第一次调用JFrame:

First time JFrame is called

第二次调用JFrame:

Second time JFrame is called

再次感谢...

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)