我正在进行一项任务,我需要在文本字段中输入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
}
}
答案 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
检查。