考虑以下情况:
我有一个JFrame“ Main ”,它有一个jButton“ caravanDataButton ”,它会打开另一个JFrame“ CaravanData ”。
CaravanData 有几个JTextField。其目的是在用户完成后询问用户问题并将答案转回 Main 。
我的问题:将数据从子JFrame传输到调用父JFrame的最有效方法是什么(或者从CaravanData回到Main的这个示例)
理想情况下,我想做以下事项:
class Main
{
public Main
{
CustomVariable data = new CaravanData();
}
}
但是,构造函数没有返回类型。但这是最好的方法,因为在 CaravanData 类完成其业务之前,变量“data”不会被赋值。
我的另一种解决方案是使用getter和setter。但是我必须等到用户完成表单才能检索数据。我用了一个while循环:
class Main
{
public Main
{
CaravanData caravanData = new CaravanData();
while (caravanData.isUserFinished == false)
{//...Do nothing}
// Once the user has finished - collect the data:
CustomVariable data = caravanData.getRelevantData();
}
}
class CaravanData
{
...
public boolean isUserFinished()
{return ifUserHasCompletedForm;}
public CustomerVariable getRelevantData()
{
...
return data;
}
}
我认为这种方法根本不高效。有更好的技术吗?我有几个JFrame,因为有很多问题要问。我不知道怎么说这个在网上找到答案。我确实想过使用线程?停止一个进程直到另一个进程完成。但是我的印象是,当一项任务从EDT耗费大量时间时,你只使用线程?
答案 0 :(得分:1)
尝试使用JDialog作为您的子窗口。 JDialog的setVisible(true)
方法阻塞,直到对话框被释放(通常通过从对话框内调用setVisible(false)
)
之后,您可以按getRelevantData()
方法加载所有数据。
class Main
{
public Main
{
CaravanData caravanData = new CaravanData();
// Show the dialog - setVisible(true) blocks till ok is pressed
caravanData.setVisible(true);
// Once the user has finished - collect the data:
CustomVariable data = caravanData.getRelevantData();
}
}
class CaravanData extends JDialog
{
...
// Called by an ActionListener for the OK Button
private void okButtonPressed(){
setVisible(false);
}
public CustomerVariable getRelevantData()
{
...
return data;
}
}