关于ActionListener和'enter'键的简单问题

时间:2011-04-08 04:15:02

标签: java

我正在进行一项任务,我需要在文本字段中输入SQL查询。用户可以按下自定义“执行查询”按钮,也可以按回车键。当使用其中任何一个时,它将触发ActionListener(不允许其他侦听器)。是否像写作一样简单:

if (e.getSource()=='querybutton' || e.getSource=='enter')

或者还有更多吗?

正如我所说,这是一个简单的问题(我知道)。

编辑:

我会在ActionPerformed中写下这一点:

       public void actionPerformed(ActionEvent e)
   {
      if(e.getSource()==gui.executeQueryButton || e.getSource()==gui.enter)
      {
         String query = gui.queryText.getText();

         //more code to follow  
      }
   }

2 个答案:

答案 0 :(得分:2)

“这就像写作一样简单:

if (e.getSource()=='querybutton' || e.getSource=='enter')"

写这个并不简单,但写它是错误的。

对于一个你不想将字符串与==进行比较,对于另一个,你不要用单引号声明字符串,而对于第三个字符串,不能以这种方式获得回车键,而是通过添加适当的ActionListener对象到JTextField本身,最后应该在一个ActionListener类中处理这个动作,所以if块完全没必要。这可能最好用一个小的内部私有ActionListener类来完成。然后,您将创建此类的一个对象,并将其添加为查询按钮和JTextField的ActionListener。

编辑1:

我的意思的更完整的例子如下所示,一个具有私有内部处理程序类的演示类:

import java.awt.event.*;
import javax.swing.*;

public class ActionListenerEg extends JPanel {
   private JButton queryButton = new JButton("Query");
   private JTextField textField = new JTextField("hello", 20);


   public ActionListenerEg() {
      QueryListener qListener = new QueryListener();
      queryButton.addActionListener(qListener);
      textField.addActionListener(qListener);

      add(queryButton);
      add(textField);
   }

   private class QueryListener implements ActionListener {
      public void actionPerformed(ActionEvent arg0) {
         String textInField = textField.getText();
         System.out.println("Use text in field, \"" + textInField + "\" to call SQL query in a background SwingWorker thread.");
      }
   }

   private static void createAndShowUI() {
      JFrame frame = new JFrame("ActionListenerEg");
      frame.getContentPane().add(new ActionListenerEg());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

通过按下按钮或在JTextField中按Enter键来触发ActionListener。然后,我将在我的控件类中,在actinoPerformed方法内部调用代码。

编辑2:在自己的Handler或Control类中拥有大多数处理程序或“控制”代码可能是一个好主意,但它不必实现ActionListener接口本身,而只是拥有将从中调用的代码在ActionListener代码中。例如,在这里我尝试将所有处理程序代码放在它自己的类中。它将具有针对各种情况调用的不同方法。如,

import java.awt.Component;
import java.awt.event.*;

import javax.swing.*;

public class ActionListenerEg extends JPanel {
   private ActionListenerHandler handler;

   private JButton queryButton = new JButton("Query");
   private JButton displayButton = new JButton("Display");
   private JTextField textField = new JTextField("hello", 20);

   // pass in handler or handler
   public ActionListenerEg(final ActionListenerHandler handler) {
      this.handler = handler;
      QueryListener qListener = new QueryListener();
      queryButton.addActionListener(qListener);
      textField.addActionListener(qListener);
      displayButton.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            if (handler != null) {
               handler.displayActionPerformed(e);
            }
         }
      });

      add(queryButton);
      add(textField);
      add(displayButton);
   }

   private class QueryListener implements ActionListener {
      public void actionPerformed(ActionEvent e) {
         if (handler != null) {
            String textInField = textField.getText();
            handler.doQueryAction(e, textInField);
         }
      }
   }

   private static void createAndShowUI() {
      ActionListenerHandler handler = new ActionListenerHandler();
      JFrame frame = new JFrame("ActionListenerEg");
      frame.getContentPane().add(new ActionListenerEg(handler));
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

class ActionListenerHandler {

   public void displayActionPerformed(ActionEvent e) {
      JOptionPane.showMessageDialog((Component) e.getSource(), "Display things!");

   }

   public void doQueryAction(ActionEvent e, String textInField) {
      String text = "We will use \"" + textInField + "\" to help create and run the SQL Query";
      JOptionPane.showMessageDialog((Component) e.getSource(), text);   
   }

}

如果问题很明显,或者出现任何问题,请提出问题。

答案 1 :(得分:2)

e.getSource()实际上返回负责触发事件的对象(不是创建控件时使用的变量的名称)。在这种情况下,您的按钮。原则上,您可以将e.getSource()与实际的按钮实例进行比较。但是,您实际上是将此动作侦听器添加到除这两个之外的按钮吗?大概你只需要将这个监听器添加到你想要这种行为的两个按钮 - 在这种情况下你不必进行if检查。