Java对话框 - 查看是否单击了确定?

时间:2011-12-20 22:22:27

标签: java swing user-interface jdialog joptionpane

我有一个客户端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

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

4 个答案:

答案 0 :(得分:10)

我建议使用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..

答案 1 :(得分:6)

我建议创建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的布局,就像设置任何其他类型的框架一样。

答案 2 :(得分:5)

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

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

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());
      }

   }
}

答案 3 :(得分:0)

好的解决方案。 如果你不想使用别的东西,这是一个有效的例子: 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){}

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

相关问题