当前位置: 首页 > 面试题库 >

JDialog的动作侦听器,用于单击按钮

双弘益
2023-03-14
问题内容

我有主要的应用程序在哪里与值表。然后,我单击“添加”按钮,新的CUSTOM(我自己创建)出现了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;

问题答案:

如果在用户按下后对话框消失,请确认:

  • 你希望有对话的行为如同一个 模态 的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添加到ConfirmBtn中。

例如:

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
使用“ 模态” 对话框的示例

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

}


 类似资料:
  • @override public void actionPerformed(ActionEvent e){ }

  • 我想根据单选按钮的选择设置文本框的可编辑选项?如何对单选按钮上的动作监听器进行编码?

  • 问题内容: 我有一个带有许多按钮的程序,所有这些按钮都将执行相同的功能。我想知道是否有一种方法可以将单个侦听器附加到程序中所有现有的JButton。 问题答案: 就像是: 该会从事件使其知道哪个按钮被点击获取源对象。 如果您需要在Action中使用if / else逻辑,那么您应该创建一个单独的Action。如果代码不属于某个动作,请勿将其强制执行。

  • 下面的代码是项目的动作侦听器。基本上,我有 4 个单选按钮,当我单击一个时,我希望它更改屏幕上的变量。当我运行代码时,它只是将所有值相加。还有其他方法可以做到这一点吗?

  • 我有一个有许多按钮的程序,所有这些按钮都将执行相同的功能。我想知道是否有办法将一个侦听器附加到程序中所有现有的JButton。

  • 问题内容: 我正在尝试制作带有三个按钮的秒表,分别是“开始”,“暂停”和“停止”。我的老师只教我们如何将动作监听器设置为两个按钮。如何将动作监听器设置为三个按钮?到目前为止,这是我的编码 我还没有为“暂停”功能设置任何动作监听器,因为无论如何我都不知道如何暂停计时器。但是我想先将动作链接到按钮,然后再弄清楚如何暂停。 问题答案: 您正在寻找的是一条声明。 基本上,像往常一样将都添加到所有三个按钮…