Диалог Java - выяснить, нажата ли кнопка OK? - PullRequest
5 голосов
/ 21 декабря 2011

У меня есть диалог для клиентского графического интерфейса, который запрашивает 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

Я знаю, что код неправильный, но я хочу, чтобы, когда пользователь нажимал «ОК» в диалоговом окне, я мог запустить некоторый код. Спасибо!

Ответы [ 4 ]

10 голосов
/ 21 декабря 2011

Я бы предложил использовать 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..
6 голосов
/ 21 декабря 2011

Я бы предложил создать 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 так же, как и для любой другой рамы.

5 голосов
/ 21 декабря 2011

Пожалуйста, поймите, что вторым параметром в JOptionPane, параметром объекта, может быть любой компонент Swing, включая JPanel, который содержит простой или сложный графический интерфейс.

Рассмотрите возможность создания JPanel с размещением в нем нескольких компонентов.включая JLabels и два JTextFields, одно для IP, одно для порта, а затем отображает этот JPanel в JOptionPane.Затем вы можете легко проверить, была ли нажата кнопка 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());
      }

   }
}
0 голосов
/ 07 ноября 2016

Хорошие решения. Если вы не хотите использовать что-то еще, это рабочий пример: 1) установите DO_NOTHING_ON_CLOSE, чтобы убедиться, что пользователь ДОЛЖЕН нажать ОК 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){}

Это может быть решением, если вы хотите реализовать немодальное диалоговое окно.

...