使用JavaSwing应用程序,如何将值从对话框面板获取到主应用程序中?
在我的Swing应用程序中,用户可以单击一个按钮打开一个对话框面板并输入一些值,然后他们可以单击该面板上的“确定”将其关闭并返回主程序,但是我如何将他们输入的值传递到主程序而不先保存到文件中呢?您可以做以下几件事:使用JavaSwing应用程序,如何将值从对话框面板获取到主应用程序中?,java,swing,dialog,panel,Java,Swing,Dialog,Panel,在我的Swing应用程序中,用户可以单击一个按钮打开一个对话框面板并输入一些值,然后他们可以单击该面板上的“确定”将其关闭并返回主程序,但是我如何将他们输入的值传递到主程序而不先保存到文件中呢?您可以做以下几件事: 您可以在应用程序和对话框之间创建观察者/可观察者关系,并在对话框关闭时使用事件中的值使对话框发布事件 您可以在应用程序中维护对话框的句柄,当您在dialog上调用setVisible(false)时,您可以查询对话框中的数据 用户界面通常应在底层应用程序上分层。(依我看,用户界面本
- 您可以在应用程序和对话框之间创建观察者/可观察者关系,并在对话框关闭时使用事件中的值使对话框发布事件
- 您可以在应用程序中维护对话框的句柄,当您在dialog上调用
时,您可以查询对话框中的数据李>setVisible(false)
Observable
/Observator
API,不如让您看看“事件总线”,它应该特别适合您的情况
事件总线的两种实现:
- 非常普遍的事件总线, 可以在任何情况下使用
- 特定于Guice依赖项注入库
其中一个应该可以帮助您解决当前的问题。可能是您想尝试以下解决方案: 类MyDialog{
private static String[] returnValues = new String[10]
private static MyDialog dialog;
private MyDialog() {
initDialog()
}
private void closeDialog()
{
dispose();
}
private initDialog()
{
//....
btnOk = new JButton("OK");
jTextField1 = new JTextField();
...
jTextField10 = new JTextField();
...
ActionListener btnOK_click = new ActionListener() {
public void actionPerformed(ActionEvent e)
{
returnValues[0] = jTextField1.getText();
...
returnValues[9] = jTextField10.getText();
closeDialog();
}
}
btnOk.addActionListener(btnOk_click);
}
public static String[] showMyDialog() {
dialog = new MyDialog();
dialog.setVisible(true);
return returnValues;
}
}只需在对话框类中定义一个带有单个方法的接口(如:“returnToCaller(returntype rt)”) 对话框的构造函数将此接口的一个实例作为输入,并使用它在退出/确定时返回结果 main模块(窗口或其他什么)只是实例化了对话框,因此对接口进行了无意义的使用,定义了返回方法,有点像委托(c#) 当时的呼吁是:
MyDialog md = new MyDialog(new MyDialog.ReturnToCaller() {
public void returnToCaller(ReturnValues rv) {
// Handle the values here
}
});
md.setModal(true);
md.setVisible(true);
实现对话框面板的类必须有一个到主程序的链接,并且主程序必须提供一个带有参数的方法,这些参数将是要传输的值 然后你的对话框面板类听Ok按钮,点击按钮,它检索这些值并与前面提到的方法一起使用
class Main {
//...
private Dialog myDialog ;
public Main(){
//...
myDialog = new Dialog(this);
//...
}
//...
public void onDialogOk(String valueA, int valueB)
{
//...
}
}
class Dialog implement ActionListener{
//...
private Main myMain ;
public setMain(Main main){
myMain = main;
}
public Dialog(Main main){
//...
setMain(main) ;
//...
JButton ok = new JButton("ok") ;
ok.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
// retrieve form values
String valueA = ... ;
int valueB = Integer.parse(...);
myMain.onDialogOK(valueA, valueB) ; //DONE
}
}
+1@Frank:这里讨论的是一个
可观察的委托,在扩展JDialog
时很有用。我想到了一种方法,使用主类的静态字段来保存值,因此在对话框中设置值,当对话框关闭时,我可以在主类中访问这些字段的值。对不起。。。但这是非常错误的。如果您能够创建自定义的“MyDialog”类,为什么不在其中为您的域类创建getter和setter呢?返回字符串数组是讨厌的。我完全赞同尤格纳的评论。此外,在这里使用静态是绝对可怕的。对于这个问题,基本上有两种有效的解决方案(据我所知):MVC或事件总线。任何其他解决方案通常都是一种代码气味。