【问题标题】:Java Dialog - Find out if OK is clicked?Java 对话框 - 确定是否单击了确定?
【发布时间】:2012-01-24 20:19:57
【问题描述】:

我有一个用于客户端 GUI 的对话框,询问想要连接的服务器的 IP 和端口。我拥有其他一切,但是我将如何做到这一点,以便当用户在我的对话框上单击“确定”时,它会运行一些东西?到目前为止,这是我所拥有的:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JTextField;


public class ClientDialog {
    JTextField ip = new JTextField(20);
    JTextField port = new JTextField(20);
    GUI gui = new GUI();
    Client client = new Client();
    JOptionPane optionPane;

    public void CreateDialog(){

        Object msg[] = {"IP: ", ip, "\nPort: ", port};

        optionPane = new JOptionPane();
        optionPane.setMessage(msg);
        optionPane.setMessageType(JOptionPane.INFORMATION_MESSAGE);
        JDialog dialog = optionPane.createDialog(null, "Connect to a server");
        dialog.setVisible(true);

        if(dialog == JOptionPane.OK_OPTION){
            System.out.println(ip);

            String ipMsg = ip.getText();
            int portMsg = Integer.parseInt(port.getText());

            gui.CreateConsole(client, ipMsg, portMsg);
        }

    }

}   //End class

我知道代码不正确,但我想要的是当用户在对话框中点击“确定”时,我可以运行一些代码。谢谢!

【问题讨论】:

  • 为什么要从 JOptionPane 对象创建 JDialog 而不是更简单地显示 JOptionPane?我想你想要一个模态对话框,所以 JOptionPane 应该可以自己正常工作。

标签: java swing user-interface jdialog joptionpane


【解决方案1】:

我建议改用showConfirmDialog

int result = JOptionPane.showConfirmDialog(myParent, "Narrative", 
       "Title", JOptionPane.INFORMATION_MESSAGE);

你可以在那里测试来自JDialog/JOptionPane的各种返回值

if (result == JOptionPane.OK_OPTION, 
              JOptionPane.CANCEL_OPTION, 
              JOptionPane.CLOSED_OPTION, etc..

【讨论】:

    【解决方案2】:

    我建议创建一个JPanel 并使用JOptionpane.showConfirmDialog()(甚至JOptionPane.showOptionDialog() 来显示对话框并检索选项。以下是您的代码的修改示例:

    import java.awt.*;
    import javax.swing.*;
    
    class ClientDialog {
        private JTextField ip = new JTextField(20);
        private JTextField port = new JTextField(20);
        private JOptionPane optionPane;
        private JPanel panel;
    
        public void CreateDialog(){
    
            panel = new JPanel(new GridLayout(2, 2));
    
            panel.add(new JLabel("IP"));
            panel.add(ip);
            panel.add(new JLabel("Port"));
            panel.add(port);
    
            int option = JOptionPane.showConfirmDialog(null, panel, "Client Dialog", JOptionPane.DEFAULT_OPTION);
    
            if (option == JOptionPane.OK_OPTION) {
                System.out.println("OK!"); // do something
            }
        }
    
    }
    
    public class Test {
    
       public static void main(String args[])
       {
          ClientDialog c = new ClientDialog();
          c.CreateDialog();
       }
    
    }
    

    该死,发帖时间太长了。无论如何,只需像设计任何其他类型的框架一样设计JPanel 的布局。

    【讨论】:

      【解决方案3】:

      请理解,JOptionPane 中的第二个参数,即对象参数,可以是任何 Swing 组件,包括拥有简单或复杂 GUI 的 JPanel。

      考虑创建一个 JPanel,在其中放置一些组件,包括 JLabels 和两个 JTextField,一个用于 IP,一个用于端口,然后在 JOptionPane 中显示此 JPanel。然后您可以轻松检查是否已按下 OK 并采取相应措施。

      import javax.swing.*;
      
      public class OptionEg {
         public static void main(String[] args) {
            final JTextField ipField = new JTextField(10);
            final JTextField portField = new JTextField(10);
            JPanel panel = new JPanel();
            panel.add(new JLabel("IP:"));
            panel.add(ipField);
      
            panel.add(Box.createHorizontalStrut(15));
            panel.add(new JLabel("Port:"));
            panel.add(portField);
      
            int result = JOptionPane.showConfirmDialog(null, panel,
                  "Enter Information", JOptionPane.OK_CANCEL_OPTION);
      
            if (result == JOptionPane.OK_OPTION) {
               System.out.println("IP: " + ipField.getText());
               System.out.println("Port: " + portField.getText());
            }
      
         }
      }
      

      【讨论】:

        【解决方案4】:

        很好的解决方案。 如果您不想使用其他东西,这是一个工作示例: 1) 设置 DO_NOTHING_ON_CLOSE 以确保用户必须按 OK 2) 验证 JDialog 是否仍然可见。

        dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
        dialog.setModal(false);
        dialog.setVisible(true);
        dialog.setAlwaysOnTop(true);
        while(dialog.isVisible())try{Thread.sleep(50);}
        catch(InterruptedException e){}
        

        如果你想实现一个非模态对话框,这可能是一个解决方案。

        【讨论】:

          猜你喜欢
          • 2021-12-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-19
          • 2017-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多