我想在Window2关闭JAVAFX后立即在window1上创建一个事件(添加了更多细节)
我有两扇窗户。 Window1通过单击按钮启动Window2。 我想在Windows 2关闭后立即更改窗口1中文本字段的文本 有没有办法在窗口2关闭后立即在窗口1中创建事件 我使用fxml,所以每个窗口都有不同的控制器和fxml文件 第一个窗口主要是一个表视图和一些文本字段,用来填充由mysql数据库连接的数据。下面是代码我想在Window2关闭JAVAFX后立即在window1上创建一个事件(添加了更多细节),java,javafx,javafx-2,javafx-8,Java,Javafx,Javafx 2,Javafx 8,我有两扇窗户。 Window1通过单击按钮启动Window2。 我想在Windows 2关闭后立即更改窗口1中文本字段的文本 有没有办法在窗口2关闭后立即在窗口1中创建事件 我使用fxml,所以每个窗口都有不同的控制器和fxml文件 第一个窗口主要是一个表视图和一些文本字段,用来填充由mysql数据库连接的数据。下面是代码 package sample; import javafx.collections.FXCollections; import javafx.col
package sample;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.collections.transformation.SortedList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javax.print.attribute.standard.MediaSize;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.ResourceBundle;
public class TableData implements Initializable {
@FXML
private TableColumn<Data, String> COMPANYCOL;
@FXML
private TableColumn<Data, ?> DATECOL;
@FXML
private TextArea AddressField;
@FXML
private TableColumn<Data, Integer> IDCOL;
@FXML
TextField RefernceField;
@FXML
private Label searchLabel;
@FXML
private MenuItem FilterMenuItem;
@FXML
private Label FilterLabel;
@FXML
private TextField FilterField;
@FXML
private TableView<Data> TABLEVIEWID;
@FXML
private TableColumn<Data, Double> PHONENOCOL;
@FXML
private TextField SearchField;
Stage stage;
@FXML
private TableColumn<Data, String> ADDRESSCOL;
@FXML
private TextField PhoneNoField;
@FXML
private TextField NameField;
@FXML
private Button AddButton;
@FXML
private TableColumn<Data, String> NAMECOL;
@FXML
private TableColumn<Data, String> REFRENCECOL;
@FXML
private TextField CompanyField;
Stage primaryStage= new Stage();
private Config config = new Config();
ObservableList<Data> Mainlist = FXCollections.observableArrayList();
Connection drdoConnection = DatabaseConnection.getConnectionDrdo();
Connection MydatabaseConnection = DatabaseConnection.getConnectionOwn();
public TableData() throws Exception {
}
int q;
RefrenceController refrenceController= new RefrenceController();
int icno=0;
@Override
public void initialize(URL location, ResourceBundle resources) {
if(drdoConnection!=null&&MydatabaseConnection!=null) {
RefernceField.setEditable(false);
config.factory(IDCOL, "id");
config.factory(NAMECOL, "name");
config.factory(COMPANYCOL, "company");
config.factory(ADDRESSCOL, "address");
config.factory(PHONENOCOL,"phoneno");
config.factory(REFRENCECOL, "refrence");
try {
Statement statement= drdoConnection.createStatement();
ResultSet resultSet= statement.executeQuery("SELECT * FROM drdomy");
while (resultSet.next()){
q= resultSet.getInt("id");
Mainlist.addAll(new Data(q,resultSet.getString("name"),resultSet.getString("company"),
resultSet.getString("address"),resultSet.getDouble("phoneno"),resultSet.getString("Refrence")));
}
TABLEVIEWID.getItems().addAll(Mainlist);
Parent root = FXMLLoader.load(getClass().getResource("Ref.fxml"));
primaryStage.setTitle("Ref Window");
primaryStage.initModality(Modality.APPLICATION_MODAL);
primaryStage.setScene(new Scene(root));
//this is the code that is giving that nullPointerException
//I have tried Every Possible Step But Coudn't resolve it
primaryStage.setOnCloseRequest(e->{
RefernceField.setText(String.valueOf(refrenceController.OnSubmitButtonClicked()));
});
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
else {
config.alert(Alert.AlertType.ERROR, "Database Server May be Down Check Logs");
}
}
@FXML
void TableAddButtonAction(ActionEvent event) throws SQLException {
String query= "INSERT INTO drdomy (id,name,company,address,phoneno,Refrence) VALUES (?,?,?,?,?,?)";
PreparedStatement statement = drdoConnection.prepareStatement(query);
statement.setInt(1,++q);
statement.setString(2,NameField.getText());
statement.setString(3,CompanyField.getText());
statement.setString(4,AddressField.getText());
statement.setDouble(5,Double.parseDouble(PhoneNoField.getText()));
statement.setString(6,RefernceField.getText());
statement.execute();
TABLEVIEWID.getItems().clear();
Mainlist.addAll(new Data(q,NameField.getText(),CompanyField.getText(),AddressField.getText(),Double.parseDouble(String.valueOf(PhoneNoField.getText())),RefernceField.getText()));
TABLEVIEWID.getItems().addAll(Mainlist);
NameField.clear();
CompanyField.clear();
AddressField.clear();
PhoneNoField.clear();
RefernceField.clear();
statement.close();
stage = (Stage) AddButton.getScene().getWindow();
stage.setOnCloseRequest(e->{
try {
drdoConnection.close();
} catch (SQLException e1) {
e1.printStackTrace();
}
});
}
@FXML
void FilterActionMenuItem(ActionEvent event) {
FilterField.setScaleY(1);
FilterField.setScaleX(1);
FilterField.setScaleZ(1);
FilterLabel.setScaleX(1);
FilterLabel.setScaleY(1);
FilterLabel.setScaleZ(1);
}
@FXML
void KeyRealesedFilterField() {
FilteredList<Data> dataFilteredList = new FilteredList<Data>(Mainlist,p-> true);
FilterField.textProperty().addListener((observable ,oldValue,newValue )->{
dataFilteredList.setPredicate(data -> {
if (newValue== null|| newValue.isEmpty())
return true;
String lowercase= newValue.toLowerCase();
int p=data.getId();
if (data.getAddress().toLowerCase().contains(lowercase)){
return true;
}
else if(String.valueOf(p).contains(newValue)){
return true;
}
else if(String.valueOf(data.getPhoneno()).contains(newValue))
return true;
else if (data.getRefrence().toLowerCase().contains(lowercase)){
return true;
}
else if(data.getName().toLowerCase().contains(lowercase)){
return true;
}
else if (data.getCompany().toLowerCase().contains(lowercase)){
return true;
}
return false;
});
SortedList<Data> dataSortedList = new SortedList<Data>(dataFilteredList);
dataSortedList.comparatorProperty().bind(TABLEVIEWID.comparatorProperty());
TABLEVIEWID.setItems(dataSortedList);
});
}
@FXML
void OnRefAction() throws IOException {
primaryStage.showAndWait();
}
}
在关闭请求、隐藏或隐藏时设置
EventHandler
。选择您需要的:
Stage secondaryStage = new Stage();
secondaryStage.setOnCloseRequest(ev -> {
//change text in TextField
});
secondaryStage.setOnHidden(ev -> {
//or change text in TextField
});
secondaryStage.setOnHiding(ev -> {
//or change text in TextField
});
在关闭请求、隐藏或隐藏时设置
EventHandler
。选择您需要的:
Stage secondaryStage = new Stage();
secondaryStage.setOnCloseRequest(ev -> {
//change text in TextField
});
secondaryStage.setOnHidden(ev -> {
//or change text in TextField
});
secondaryStage.setOnHiding(ev -> {
//or change text in TextField
});
如果要在窗口关闭后立即创建事件
使用即将关闭的窗口阶段使用setOnCloseRequest。如果希望在窗口关闭后立即创建事件
使用即将关闭的窗口阶段使用setOnCloseRequest。我的问题得到了一个-ve点为什么?我的问题有问题吗?如果是,请评论。也许我会向你解释。在你启动第二个窗口的按钮处理程序中,你的最后一段代码应该显示并等待。在这个show-and-wait方法的正下方是您应该在TextField中放置“//change text”的地方。我的问题有一个-ve点为什么?我的问题有问题吗?如果是,请评论。也许我会向你解释。在你启动第二个窗口的按钮处理程序中,你的最后一段代码应该显示并等待。在这个show and wait方法的正下方是您应该在TextField中放置“//change text”的地方。两个窗口都有不同的控制器。如何处理控制器之间的数据交换取决于您自己。关于这个问题,在SO上有很多帖子。嘿,谢谢,现在它可以工作了,但只有当我点击右上角的红十字,而不是按primaryStage.setOnCloseRequest(e->{referencefield.setText(“Man”);}按钮还用于关闭窗口2控制器中的场景。两个窗口都有不同的控制器。如何处理控制器之间的数据交换,取决于您。关于这个问题,有很多关于SO的帖子。嘿,谢谢,现在它可以工作了,但只有当我单击右上角的红十字时,它才起作用,但不是通过按钮primaryStage。setOnCloseRequest(e->{referencefield.setText(“Man”);}按钮也用于关闭窗口2控制器中的场景
Stage secondaryStage = new Stage();
secondaryStage.setOnCloseRequest(ev -> {
//change text in TextField
});
secondaryStage.setOnHidden(ev -> {
//or change text in TextField
});
secondaryStage.setOnHiding(ev -> {
//or change text in TextField
});