【问题标题】:What is the equivalent of the DialogResult property from WindowsForms in Java SWING's JFrames?Java SWING 的 JFrames 中的 WindowsForms 的 DialogResult 属性的等价物是什么?
【发布时间】:2017-12-21 16:15:56
【问题描述】:

我正在使用 Java Swing 库在 Java 中编写应用程序,并且正在寻找与使用 WindowsForms 的 C# 中的这些代码行等效的功能:

 MyDialog form = new MyDialog();
 form.showDialog();

 if (form.DialogResult == DialogResult.OK)
      doSomething();

我无法在 Java 中找到与 JFrame 等效的功能。

我正在处理的代码如下:

 LoginFrame loginFrame = new LoginFrame(CONTROLLER);
 loginFrame.setVisible(true);

前两行代码启动了一个登录窗口,用户可以在其中输入他的电子邮件和密码。所述窗口显示2个按钮:OK和CANCEL。窗口关闭后,我想知道用户按下了 2 个按钮中的哪一个。

在 Java Swing 中使用 JFrame 执行此操作的标准方法是什么?

【问题讨论】:

  • 可能是JOptionPane.showConfirmDialog(..);
  • 我最初的结论是我为对话框选择的 JFrame 对象是错误的……你能确认一下吗?我应该改用 JDialogs 吗?谢谢!
  • “我应该改用 JDialogs 吗?” 绝对可以,为此,可以使用模态 JDialogJOptionPane(默认为模态)。有关使用 JOptionPane 登录的自包含示例,请参阅 this answer。另见The Use of Multiple JFrames, Good/Bad Practice?(通常只有主应用程序。应基于JFrame。)

标签: java swing dialog jframe


【解决方案1】:

您可以将ActionListener 设置为您的按钮。有很多方法。

匿名动作监听器

button1.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent actionEvent) {
        if(e.getSource() == button1) {
            //if clicks the first button
        } else if (e.getSource() == button2) {
            //if clicks the second button
        }
    }
});

实现动作监听器的类(维护问题的最佳选择)

class CheckButtonActionListener implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent actionEvent) {
        if(e.getSource() == button1) {
            //if clicks the first button
        } else if (e.getSource() == button2) {
            //if clicks the second button
        }
    }

}

并且,将类设置为您的 JButton:

CheckButtonActionListener checker = new CheckButtonActionListener();
button.addActionListener(checker);

或:

button1.addActionListener(new CheckButtonActionListener();

【讨论】:

    【解决方案2】:

    应用程序将有一个 JFrame 作为主窗口。

    如果您需要子窗口,您可以使用 JDialog。 JDialog 类似于 JFrame。你需要自己编写所有逻辑并处理所有按钮事件

    JOptionPane 是一个预打包的JDialog,它为您提供一些默认功能。

    您可以使用以下代码创建一个包含多个输入字段的简单 JOptionPane:

    JTextField firstName = new JTextField(10);
    //firstName.addAncestorListener( new RequestFocusListener() );
    JTextField lastName = new JTextField(10);
    Object[] msg = {"First Name:", firstName, "Last Name:", lastName};
    
    
    int result = JOptionPane.showConfirmDialog(
        frame,
        msg,
        "Enter Name",
        JOptionPane.OK_CANCEL_OPTION,
        JOptionPane.PLAIN_MESSAGE);
    
    if (result == JOptionPane.YES_OPTION)
    {
        System.out.println(firstName.getText() + " : " + lastName.getText());
    }
    else
    {
        System.out.println("Canceled");
    }
    

    上面的一个问题是焦点将集中在按钮上,而不是文本字段上。您可以使用Request Focus Listener 解决此问题

    如果您不喜欢选项窗格中组件的布局,那么您需要使用您的组件创建一个自定义面板并将该面板添加到选项窗格中。

    您还应该查看 Making Dialogs 上的 Swing 教程部分。本节和本教程是通用的,将为您提供从 C# 过渡的 Swing 基础知识。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-03
      • 2011-01-31
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 2010-12-07
      相关资源
      最近更新 更多