欲做如图一个小程序: 基本功能均已实现,现欲通过按Enter键使显示结果,即在前两个文本框里输入完数据后,直接按Enter,即可使第三个文本框显示出计算结果。
现在我如果用鼠标单击一下第三个文本框,按Enter是可以得出结果的,不过如果不事先选中第三个文本框,按Enter无反应。我想应该在第二个数据输入后,使第三个文本框即处于被选中状态,那么我按Enter,也就知道是第三个文本框响应该Enter事件。应该是要添加焦点吧?应如何实现,还望高手指点..不胜感激!
(源代码如下:)
//四则运算
import java.awt.*;
import java.awt.event.*;import javax.swing.*;public class Test6 extends JFrame implements KeyListener/*, FocusListener*/
{
int WIDTH = 400, HEIGHT = 280;
JTextField num1, num2, result;
JButton button;
JComboBox operator; public static void main(String[] args)
{
new Test6();
} Test6()
{
super("四则运算");
Container c = this.getContentPane();
c.setLayout(new FlowLayout());
this.setDefaultCloseOperation(3);
this.setSize(WIDTH,HEIGHT);
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int width = screenSize.width;
int height = screenSize.height;
int x = (width - WIDTH)/2;
int y = (height - HEIGHT)/2;
this.setLocation(x, y);
String[] s = {"+", "-", "*", "/"};
operator = new JComboBox(s);
num1 = new JTextField(6);
num2 = new JTextField(6);
result = new JTextField(6);
button = new JButton("=");
c.add(num1);
c.add(operator);
c.add(num2);
c.add(button);
c.add(result);
/*result.addFocusListener(this);*/
result.addKeyListener(this);
this.setVisible(true);
} void method()
{
double n1 = Double.parseDouble((num1.getText()));
double n2 = Double.parseDouble((num2.getText()));
if((operator.getSelectedItem()) == "+")
{
result.setText(String.valueOf(n1 + n2));
}
else if((operator.getSelectedItem()) == "-")
{
result.setText(String.valueOf(n1 - n2));
}
else if((operator.getSelectedItem()) == "*")
{
result.setText(String.valueOf(n1 * n2));
}
else
{
result.setText(String.valueOf(n1 / n2));
}
}
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode() == KeyEvent.VK_ENTER)
{
method();
}
} public void keyReleased(KeyEvent e) {} public void keyTyped(KeyEvent e) {}
/*
public void focusGained(FocusEvent e) {} public void focusLost(FocusEvent e) {}*/
}
现在我如果用鼠标单击一下第三个文本框,按Enter是可以得出结果的,不过如果不事先选中第三个文本框,按Enter无反应。我想应该在第二个数据输入后,使第三个文本框即处于被选中状态,那么我按Enter,也就知道是第三个文本框响应该Enter事件。应该是要添加焦点吧?应如何实现,还望高手指点..不胜感激!
(源代码如下:)
//四则运算
import java.awt.*;
import java.awt.event.*;import javax.swing.*;public class Test6 extends JFrame implements KeyListener/*, FocusListener*/
{
int WIDTH = 400, HEIGHT = 280;
JTextField num1, num2, result;
JButton button;
JComboBox operator; public static void main(String[] args)
{
new Test6();
} Test6()
{
super("四则运算");
Container c = this.getContentPane();
c.setLayout(new FlowLayout());
this.setDefaultCloseOperation(3);
this.setSize(WIDTH,HEIGHT);
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int width = screenSize.width;
int height = screenSize.height;
int x = (width - WIDTH)/2;
int y = (height - HEIGHT)/2;
this.setLocation(x, y);
String[] s = {"+", "-", "*", "/"};
operator = new JComboBox(s);
num1 = new JTextField(6);
num2 = new JTextField(6);
result = new JTextField(6);
button = new JButton("=");
c.add(num1);
c.add(operator);
c.add(num2);
c.add(button);
c.add(result);
/*result.addFocusListener(this);*/
result.addKeyListener(this);
this.setVisible(true);
} void method()
{
double n1 = Double.parseDouble((num1.getText()));
double n2 = Double.parseDouble((num2.getText()));
if((operator.getSelectedItem()) == "+")
{
result.setText(String.valueOf(n1 + n2));
}
else if((operator.getSelectedItem()) == "-")
{
result.setText(String.valueOf(n1 - n2));
}
else if((operator.getSelectedItem()) == "*")
{
result.setText(String.valueOf(n1 * n2));
}
else
{
result.setText(String.valueOf(n1 / n2));
}
}
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode() == KeyEvent.VK_ENTER)
{
method();
}
} public void keyReleased(KeyEvent e) {} public void keyTyped(KeyEvent e) {}
/*
public void focusGained(FocusEvent e) {} public void focusLost(FocusEvent e) {}*/
}
只监听第二个文本框的Enter事件即可:第二个输入完毕,就可以计算结果了。
如果先输入第二个文本框,再输入第一个文本框,这个方法就不可以了试试给整个frame添加Enter键盘事件,看看会不会焦点在它的子组件,它会不会响应
方法1. 自己写个继承自KeyListener的类,为每个TextField加上监听器。具体方法中进行判断,如果两文本框都有值了就计算。这个代码就不上了,你懂的。
方法2. 获取你JFrame的根面板,获取根面板的InputMap以及它的ActionMap,往InputMap中加入相应的键,往ActionMap加入相应的动作。对于目前的问题可以使用,也比较专业。附部分代码: JRootPane rootPane = 你的jframe.getRootPane();
InputMap inputMap = rootPane.getInputMap(2);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.ENTER, 0), "Enter");
rootPane.getActionMap().put("Enter", 相应的动作action);