如何解决带有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:
第二次调用JFrame:
再次感谢...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。