我想做个跟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) {
//做确定按钮按下的步骤
......
}
}
}
当我对我的对话框里的确定按钮加上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) {
//做确定按钮按下的步骤
......
}
}
}
达不到象JOptionPane.showInputDialog样的效果。因为我在输入框里输完文字后,焦点应该还在输入框里,这个时候我敲Enter键并没有用啊。但是在JOptionPane里面,当你输完文本后,可以直接敲Enter键。
嘿嘿,忘了
this.getRootPane().setDefaultButton(button);//加监听
button.addActionListener(new ButtonListener());class ButtonListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
//....to do
this.dispose();
}
}
这样应该可以满足您的要求。
你不就是要输入完文本框的内容,想直接回车确认么,可以这样做:
txtfld.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
txtfld_actionPerformed(e);
}});void txtfld_actionPerformed(ActionEvent e) {
..........
..........
}
就是说文本框接受了你的键盘动作,明白?
如果你想让你的各个组件都能接受回车操作,必须按个加上监听器,因为你录入数据之后焦点肯定在这个组件上!
你可以把提交确认操作写成一个方法,然后各个监听器都调用它,我想没什么更好的捷径可循了
重要的是一定分析清楚你的动作在特定时刻到底是操作的那一个组件
用this.getRootPane().setDefaultButton(button);可以实现Enter键的功能。
把按扭设置为默认按扭可以实现不管焦点在那里,敲入Enter键对话框都会响应。但是我想设计,当敲ESC键时也和敲Enter键时一样方便,即无论焦点传到哪里,我的ESC都是退出,而Enter都是确定。
关于Enter和ESC键的快捷键用最高等级建(具体名字忘了),那整个Dialog都能监听了.
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);
}
}
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);
}
}