我想做个跟JOptionPane.showInputDialog();类似的功能的对话框。由于我想要两个输入文本框,所以只能自己做对话框了。
当我对我的对话框里的确定按钮加上keyListener时。我按下Enter键后,对话框没反应,这是怎么会事?部分代码如下:
 JTextField inputfield1 = new JTextField();
 JTextField inputfield2 = new JTextField();
 JButton button = new JButton("确定");
 button.addKeyListener(new ButtonListener());
 .....
class ButtonListener implements KeyListener{
 public void keyPressed(KeyEvent evt){
  int keyCode = evt.getKeyCode();
   if (keyCode == KeyEvent.VK_ENTER) {
      //做确定按钮按下的步骤
     ......
    }
  }
}

解决方案 »

  1.   

    好象不行啊,你说的是用setDefaultCapable(true)吧!
    达不到象JOptionPane.showInputDialog样的效果。因为我在输入框里输完文字后,焦点应该还在输入框里,这个时候我敲Enter键并没有用啊。但是在JOptionPane里面,当你输完文本后,可以直接敲Enter键。
      

  2.   

    记得和JDeskPane有关吧
    嘿嘿,忘了
      

  3.   

    //设置button为默认按钮
    this.getRootPane().setDefaultButton(button);//加监听
    button.addActionListener(new ButtonListener());class ButtonListener implements ActionListener{
    public void actionPerformed(ActionEvent e) {
                      //....to do
    this.dispose();
    }
    }
    这样应该可以满足您的要求。
      

  4.   

    不是啊,我不是只想给按扭添加鼠标监听。  我的对话框要具有象JOptionPane.showInputDialog()一样的功能,既当我输完数据后,可以直接敲键盘Enter键就可以实现,跟按下确定按扭一样。而你说把按纽设为默认的按扭虽然在刚弹出对话框的时候,焦点是在按扭上,但是当我在输入文本框内输完数据时,焦点却已经在输入文本框内了。
      

  5.   

    哈哈,你太在意按钮的作用了,回车不是一定要加到按钮上的
    你不就是要输入完文本框的内容,想直接回车确认么,可以这样做:
    txtfld.addActionListener(new java.awt.event.ActionListener() {
                  public void actionPerformed(ActionEvent e) {
                    txtfld_actionPerformed(e);
                  }});void txtfld_actionPerformed(ActionEvent e) {
    ..........
    ..........
        }
    就是说文本框接受了你的键盘动作,明白?
      

  6.   

    多谢上面的老兄,这样行是行得通,而这要求我一定要在文本框内输完数据后,再按回车,这样显得很不灵活。如果我在刚弹出对框时,我想按ESC键退出时,这样就做不到了。而当我的对话框里,有很多组件,有文本输入框,有复选框,有下拉框时,我启不是为每个组件都加上键盘监听器?这样显得太麻烦了。有没有其它简便的方法。
      

  7.   

    按esc退出可以把dispose()方法加在键盘动作(ESC)上,和你的各种组件没关系
    如果你想让你的各个组件都能接受回车操作,必须按个加上监听器,因为你录入数据之后焦点肯定在这个组件上!
    你可以把提交确认操作写成一个方法,然后各个监听器都调用它,我想没什么更好的捷径可循了
    重要的是一定分析清楚你的动作在特定时刻到底是操作的那一个组件
      

  8.   

    不知道还有没有简单的方法?
    用this.getRootPane().setDefaultButton(button);可以实现Enter键的功能。
    把按扭设置为默认按扭可以实现不管焦点在那里,敲入Enter键对话框都会响应。但是我想设计,当敲ESC键时也和敲Enter键时一样方便,即无论焦点传到哪里,我的ESC都是退出,而Enter都是确定。
      

  9.   

    没人知道了吗,我看JOptionPane的源码也都没看到它里面怎么设键盘监听器,没有用那么复杂的方法。但是它达到的效果是我想要的那种,我实在是不知道如何做好啊。
      

  10.   

    你的JDialog是用什么建的,试试直接用JOptionPane.createDialog看看,方法自带最好?
    关于Enter和ESC键的快捷键用最高等级建(具体名字忘了),那整个Dialog都能监听了.
      

  11.   

    //用JOptionPane实现import java.awt.GridLayout;import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JTextField;public class OptionPaneTest {
        public static void main(String[] args) {
            JPanel p = new JPanel(new GridLayout(2, 1, 0, 10));
            JTextField tf1 = new JTextField(10);
            JTextField tf2 = new JTextField(10);
            p.add(tf1);
            p.add(tf2);
            
            JOptionPane pane = new JOptionPane(
                    p, JOptionPane.QUESTION_MESSAGE,
                    JOptionPane.OK_CANCEL_OPTION);
            pane.createDialog(null, "Test").show();        Integer sel = (Integer) pane.getValue();
            if (sel.intValue() == JOptionPane.OK_OPTION) {
                System.out.println(tf1.getText());
                System.out.println(tf2.getText());
            }
            else {
                System.out.println("Canceled");
            }
            System.exit(0);
        }
    }
      

  12.   

    //实现ESC关闭对话框的方法import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;import javax.swing.*;public class ActionMapTest {
        public static void main(String[] args) {
            final JDialog d = new JDialog((JFrame)null, "Test", true);        d.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
                    KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "dispose");
            d.getRootPane().getActionMap().put(
                    "dispose", new AbstractAction() {
                        public void actionPerformed(ActionEvent e) {
                            System.out.println("Esc pressed");
                            d.dispose();
                        }
                    });        JButton btn = new JButton("OK");
            btn.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Enter pressed");
                    d.dispose();
                }
            });
            d.getContentPane().add(new JTextField("Press ESC to dispose dialog", 20), BorderLayout.CENTER);
            d.getContentPane().add(btn, BorderLayout.SOUTH);
            
            d.getRootPane().setDefaultButton(btn);        
            d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            d.pack();
            d.setLocationRelativeTo(null);
            d.show();
            System.exit(0);
        }
    }
      

  13.   

    太强了,我以前都是自己继承jdialog写一个新的dialog,搞得麻烦死了。原来可以用joptionpane建dialog。感谢gtlang78!!