слушатель действия JDialog для нажатой кнопки - PullRequest
7 голосов
/ 15 декабря 2011

У меня есть основное приложение, где есть таблица со значениями. Затем я нажимаю кнопку «Добавить», появляется новое ПОЛЬЗОВАТЕЛЬСКОЕ (я сделал это сам) всплывающее окно типа JDialog. Там я могу ввести значение, сделать несколько галочек и нажать «Подтвердить». Поэтому мне нужно прочитать этот ввод из диалога, чтобы я мог добавить это значение в таблицу в основном приложении. Как я могу слушать, когда нажата кнопка «Подтвердить», чтобы я мог прочитать это значение после этого?

addISDialog = new AddISDialog();
addISDialog.setVisible(true);
addISDialog.setLocationRelativeTo(null);
//somekind of listener...
//after "Confirm" button in dialog was pressed, get value
value = addISDialog.ISName;

Ответы [ 4 ]

13 голосов
/ 15 декабря 2011

Если диалоговое окно исчезнет после того, как пользователь нажмет подтверждение:

  • и вы хотите, чтобы диалог вел себя как модальный JDialog, тогда это просто, поскольку вы знаете, где в коде будет находиться ваша программа, как только пользователь завершит работу иметь дело с диалогом - это будет сразу после того, как вы вызовете setVisible(true) в диалоге. Таким образом, вы просто запрашиваете у объекта диалога его состояние в строках кода сразу после вызова setVisible(true) в диалоговом окне.
  • Если вам нужно иметь дело с немодальным диалогом, то вам нужно добавить WindowListener к диалогу, чтобы получать уведомления, когда окно диалога стало невидимым.

Если диалоговое окно остается открытым после того, как пользователь нажимает, подтвердите:

  • Тогда вам, вероятно, следует использовать PropertyChangeListener, как было предложено выше. Либо так, либо предоставьте объекту диалога открытый метод, который позволяет внешним классам добавлять ActionListener к кнопке подтверждения.

Для получения более подробной информации, пожалуйста, покажите нам соответствующие биты вашего кода или, что еще лучше, sscce .

Например, чтобы позволить классу JDialog принимать внешних слушателей, вы можете дать ему JTextField и JButton:

class MyDialog extends JDialog {
   private JTextField textfield = new JTextField(10);
   private JButton confirmBtn = new JButton("Confirm");

и метод, который позволяет внешним классам добавлять ActionListener к кнопке:

public void addConfirmListener(ActionListener listener) {
  confirmBtn.addActionListener(listener);
}

Тогда внешний класс может просто вызвать метод `addConfirmListener (...), чтобы добавить свой ActionListener в verifyBtn.

Например:

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

import javax.swing.*;

public class OutsideListener extends JFrame {
   private JTextField textField = new JTextField(10);
   private JButton showDialogBtn = new JButton("Show Dialog");
   private MyDialog myDialog = new MyDialog(this, "My Dialog");

   public OutsideListener(String title) {
      super(title);
      textField.setEditable(false);

      showDialogBtn.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent arg0) {
            if (!myDialog.isVisible()) {
               myDialog.setVisible(true);
            }
         }
      });

      // !! add a listener to the dialog's button
      myDialog.addConfirmListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            String text = myDialog.getTextFieldText();
            textField.setText(text);
         }
      });

      JPanel panel = new JPanel();
      panel.add(textField);
      panel.add(showDialogBtn);

      add(panel);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(400, 300);
   }

   private static void createAndShowGui() {
      JFrame frame = new OutsideListener("OutsideListener");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class MyDialog extends JDialog {
   private JTextField textfield = new JTextField(10);
   private JButton confirmBtn = new JButton("Confirm");

   public MyDialog(JFrame frame, String title) {
      super(frame, title, false);
      JPanel panel = new JPanel();
      panel.add(textfield);
      panel.add(confirmBtn);

      add(panel);
      pack();
      setLocationRelativeTo(frame);
   }

   public String getTextFieldText() {
      return textfield.getText();
   }

   public void addConfirmListener(ActionListener listener) {
      confirmBtn.addActionListener(listener);
   }
}

Предостережения: я не рекомендую создавать подклассы JFrame или JDialog без крайней необходимости. Это было сделано здесь просто ради краткости. Я также предпочитаю использовать модальное диалоговое окно для решения этой проблемы и просто заново открывать диалоговое окно, когда это необходимо.

Редактировать 2
Пример использования диалогового окна Modal :

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class OutsideListener2 extends JFrame {
   private JTextField textField = new JTextField(10);
   private JButton showDialogBtn = new JButton("Show Dialog");
   private MyDialog2 myDialog = new MyDialog2(this, "My Dialog");

   public OutsideListener2(String title) {
      super(title);
      textField.setEditable(false);

      showDialogBtn.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent arg0) {
            if (!myDialog.isVisible()) {
               myDialog.setVisible(true);

               textField.setText(myDialog.getTextFieldText());
            }
         }
      });

      JPanel panel = new JPanel();
      panel.add(textField);
      panel.add(showDialogBtn);

      add(panel);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(400, 300);
   }

   private static void createAndShowGui() {
      JFrame frame = new OutsideListener2("OutsideListener");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class MyDialog2 extends JDialog {
   private JTextField textfield = new JTextField(10);
   private JButton confirmBtn = new JButton("Confirm");

   public MyDialog2(JFrame frame, String title) {
      super(frame, title, true); // !!!!! made into a modal dialog
      JPanel panel = new JPanel();
      panel.add(new JLabel("Please enter a number between 1 and 100:"));
      panel.add(textfield);
      panel.add(confirmBtn);

      add(panel);
      pack();
      setLocationRelativeTo(frame);

      ActionListener confirmListener = new ConfirmListener();
      confirmBtn.addActionListener(confirmListener); // add listener
      textfield.addActionListener(confirmListener );
   }

   public String getTextFieldText() {
      return textfield.getText();
   }

   private class ConfirmListener implements ActionListener {
      public void actionPerformed(ActionEvent e) {
         String text = textfield.getText();
         if (isTextValid(text)) {
            MyDialog2.this.setVisible(false);
         } else {
            // show warning
            String warning = "Data entered, \"" + text + 
               "\", is invalid. Please enter a number between 1 and 100";
            JOptionPane.showMessageDialog(confirmBtn,
                  warning,
                  "Invalid Input", JOptionPane.ERROR_MESSAGE);
            textfield.setText("");
            textfield.requestFocusInWindow();
         }
      }
   }

   // true if data is a number between 1 and 100
   public boolean isTextValid(String text) {
      try {
         int number = Integer.parseInt(text);
         if (number > 0 && number <= 100) {
            return true;
         }
      } catch (NumberFormatException e) {
         // one of the few times it's OK to ignore an exception
      }
      return false;
   }

}
0 голосов
/ 26 октября 2016

Почему бы вам не проверить, виден ли ваш jDialog?

yourJD.setVisible(true);
while(yourJD.isVisible())try{Thread.sleep(50);}catch(InterruptedException e){}

это тоже работает.

0 голосов
/ 09 января 2015
//Why is this working so well even without the ActionListener interface, and all I'm
//getting is minor format errors at the end brackets? Know how to fix it? 



final JButton newButton = new JButton("Send");
            newButton.setActionCommand("Send");
            textPane.add(newButton);
            newButton.setEnabled(true);
            newButton.addActionListener(new ActionListener();


                  public void actionPerformed(ActionEvent e){

                    // display/center the jdialog when the button is pressed
                    JDialog digFree = new JDialog(digFree, "Hello", true);
                    digFree.setLocationRelativeTo(newButton);
                    digFree.setFocusable(true);
                    digFree.setVisible(true);
                    digFree.setBounds(20, 20, 100, 120);
                  }
0 голосов
/ 17 сентября 2013
import javax.swing.JOptionPane;

или, если вы уже качаетесь,

import javax.swing.*;

защитит вас.

После условного запуска JOptionPane для отправки вашего предупреждения или любого другого модального сообщения:

    JOptionPane.showMessageDialog(
            null,
            "Your warning String: I can't do that John",
            "Window Title",
            JOptionPane.ERROR_MESSAGE);

проверьте параметры JOptionPane. *, Чтобы определить тип сообщения.

...