Java 将JFrame用作自定义输入框

Java 将JFrame用作自定义输入框,java,swing,Java,Swing,我正在开发一个基于JavaSwing的应用程序,其中有两个JFrame:a是主窗口,B是在a上调用的 我需要做的是,在A中,调用B,从B获取用户输入,并以某种方式将该输入传递给A,然后处理它 我尝试过的一切都失败了,据我所知,Java不支持异步/等待 这是我最好的尝试 public void getInfoFromB { FormB b=新的FormB; whileb.isReady==false{ a、 setVisiblefalse; } a、 设置VisibleTrue; ArrayLis

我正在开发一个基于JavaSwing的应用程序,其中有两个JFrame:a是主窗口,B是在a上调用的

我需要做的是,在A中,调用B,从B获取用户输入,并以某种方式将该输入传递给A,然后处理它

我尝试过的一切都失败了,据我所知,Java不支持异步/等待

这是我最好的尝试

public void getInfoFromB { FormB b=新的FormB; whileb.isReady==false{ a、 setVisiblefalse; } a、 设置VisibleTrue; ArrayList b.getData; //... } 请注意,a和b对象都扩展了JFrame,FormB的isReady是一个方法,它返回用户填写的所有所需数据的天气,getData方法返回所述数据

这种尝试似乎不起作用,因为一旦代码进入while循环,其他一切都会冻结,因为java似乎在与并行操作斗争,您只需使用JOptionPane来提示输入

主框架将等待选项窗格关闭,以获取用户输入的文本


阅读Swing教程中的章节,了解更多信息和示例。

正如@TT所建议的,可以通过引用将A传递到B。显然,所有对象都是通过引用传递的,因此不需要使用指针。从那里,我可以处理来自A和B的数据

甲级

public void getDataFromBArrayList数据 { this.dataFromB=数据; } 公共无效开始格式MB { 此.setVisiblefalse; B formB=新的B此; } B类

//建造师 公共B格式a { this.mainForm=a; //... } public void setdatatoandexit { this.mainForm.getDataFromBthis.dataToA; //重新显示主窗口 this.mainForm.setVisibletrue; //关上这个窗户 this.dispatchEventnew WindowEventthis,WindowEvent.WINDOW\u关闭; }
准备好后,将B信号传递给A,传递A中所需的任何信息。这将涉及在创建表单B时传递对A的引用。还要注意,Swing中任何与GUI相关的都是单线程的。您的意思是将指向A的指针传递给B吗?这实际上是个好主意,我希望java支持指针java没有指针,但任何对象都被引用为引用。也就是说,如果您执行A=新建A,A将保留对您创建的对象的引用。例如,通过构造或方法将该引用传递给B实例。问题是我需要的数据类型不能从JoptionPane输入为什么不能?使用JOptionPane的方法有很多。您可以提供要添加到选项窗格的字符串/组件列表。您可以提供包含多个组件的自定义面板,您可以添加自己的PropertyChangeListener,以防止对话框关闭,除非在所有字段中输入了数据。阅读教程。即使您不想使用JOptionPane,也可以使用模态JDialog并将自定义面板添加到对话框中。不要试图创建自己的循环/轮询代码来等待用户输入数据。另请参见Dude,我需要显示3个文本框和一个完整的数据表,并在每次单击所述表或其中一个文本框的值更改时刷新包含其内容的标签。即使可以在JOptionPane中完成,辅助JFrame解决方案也可以正常工作。我的意思是,我不知道JDialog,它看起来很有趣,但最终我需要做的不仅仅是在新的JFrame中的用户输入,比如数据库操作。显而易见的答案是对单个数据段使用JOption窗格。或者,您甚至可以使用包含多个组件的面板的JOption窗格。这仍然比创建自己的窗口容易,因为所有处理OK Cancel按钮的代码都是内置的。或者,如果您不喜欢,那么可以创建一个自定义JDialog。一个应用程序应该只有一个JFrame。所有子窗口都应该是对话框。这是标准的秋千设计。既然您已经了解JDialog,就不要重新发明轮子!