欲做如图一个小程序:    基本功能均已实现,现欲通过按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) {}*/

}

解决方案 »

  1.   


    只监听第二个文本框的Enter事件即可:第二个输入完毕,就可以计算结果了。
      

  2.   


    如果先输入第二个文本框,再输入第一个文本框,这个方法就不可以了试试给整个frame添加Enter键盘事件,看看会不会焦点在它的子组件,它会不会响应
      

  3.   

    使用 Toolkit的 void addAWTEventListener(AWTEventListener listener, long eventMask) 方法。
      

  4.   

    二楼兄长所言甚妙···如三楼兄长所说,但JFrame系window事件的组件,不好使啊。单就这种小程序而言,大不了给num1,num2,result和button全注册侦听...逸飞兄之意,小弟还不是太懂,还望详之~
      

  5.   

    大前提是前两个TextField都有值了,再按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);