如何在jpanel文本字段中执行keypress事件?

时间:2014-06-10 06:53:34

标签: java swing jpanel keypress joptionpane

当我选择组合框中的东西时:

enter image description here

它显示了带有两个输入的joptionPane对话框。

enter image description here

这里我想首先关注金额字段然后,当我输入金额字段时,它转到应用字段的否,然后输入转到确定。

这是我的JOption Dialog代码:

JTextField xField = new JTextField(5);
JTextField yField = new JTextField(5);
JPanel myPanel = new JPanel();
myPanel.add(new JLabel("Amount:"));
myPanel.add(xField);
myPanel.add(Box.createHorizontalStrut(15)); // a spacer
myPanel.add(new JLabel("No of App:"));
myPanel.add(yField);
int value = 0;
xField.requestFocus();
int result = JOptionPane.showConfirmDialog(null, myPanel, "Please Enter Amount and No.of app", JOptionPane.OK_CANCEL_OPTION);

2 个答案:

答案 0 :(得分:0)

您只需尝试将非布局的组件聚焦在窗口中。

替换

xField.requestFocus();

通过

SwingUtilities.invokeLater(new Runnable() {
  public void run() {
    xField.requestFocusInWindow();
  }
});

答案 1 :(得分:0)

您可以在项目已更改为新项目的事件上创建自己的JDialog。然后,您可以在JDialog中输入值并在父级中适当设置信息。如果要更改焦点顺序,请使用自定义焦点策略。如果要将遍历焦点键更改为Enter键,则应重新映射该键,以使其与Tab键的响应相同。网上有几个资源,在这个网站上有关于如何做到这一点的信息。

您应该注意,默认的焦点遍历策略取决于您将元素添加到内容面板的顺序。

我为您使用JDialog

创建了一个简单示例

The initial screen The JDialog The new screen with the entered information

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class RankSelection extends JFrame {
    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    private JTextField textField;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    RankSelection frame = new RankSelection();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public RankSelection() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        JComboBox<String> comboBox = new JComboBox<String>();
        comboBox.setModel(new DefaultComboBoxModel<String>(new String[] {"Slave", "Peasant", "Minion", "Knight", "Bishop", "Prince", "Coder King"}));
        comboBox.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                if(e.getStateChange() == ItemEvent.SELECTED){
                    Amount amount = new Amount();
                    textField.setText(Integer.toString((Integer) amount.getStinkiness().getValue()));
                }
            }
        });
        contentPane.add(comboBox, BorderLayout.CENTER);

        JLabel lblYourRank = new JLabel("Your Rank");
        contentPane.add(lblYourRank, BorderLayout.NORTH);

        JPanel panel = new JPanel();
        contentPane.add(panel, BorderLayout.SOUTH);

        JLabel lblYourStinkiness = new JLabel("Your Stinkiness:");
        panel.add(lblYourStinkiness);

        textField = new JTextField();
        textField.setEditable(false);
        textField.setEnabled(false);
        textField.setText("0");
        panel.add(textField);
        textField.setColumns(10);
        pack();
    }

}

自定义JDialog

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class Amount extends JDialog {
    private static final long serialVersionUID = 1L;
    private final JPanel contentPanel = new JPanel();
    private JSpinner amount;
    private JSpinner stinkiness;

    public Amount() {
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        setModalityType(ModalityType.APPLICATION_MODAL);
        getContentPane().setLayout(new BorderLayout());

        contentPanel.setLayout(new FlowLayout());
        contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        getContentPane().add(contentPanel, BorderLayout.CENTER);

        JLabel lblAmount = new JLabel("Amount:");
        amount = new JSpinner();
        JLabel lblStinkiness = new JLabel("Stinkiness:");
        stinkiness = new JSpinner();

        contentPanel.add(lblAmount);
        contentPanel.add(amount);
        contentPanel.add(lblStinkiness);
        contentPanel.add(stinkiness);

        JPanel buttonPane = new JPanel();
        buttonPane.setLayout(new FlowLayout(FlowLayout.CENTER));
        getContentPane().add(buttonPane, BorderLayout.SOUTH);
        JButton okButton = new JButton("OK");
        okButton.setActionCommand("OK");
        buttonPane.add(okButton);
        getRootPane().setDefaultButton(okButton);
        okButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });

        pack();
        setVisible(true);
    }

    public JSpinner getAmount() {
        return amount;
    }

    public JSpinner getStinkiness() {
        return stinkiness;
    }

}