如何使用不同的热键添加焦点遍历?

时间:2014-05-01 06:35:26

标签: java focus

我在实现该程序的最后一部分时遇到问题,即按Enter键将活动字段从一个文本字段按顺序移动到下一个文本字段(1,2,3,4)。

这需要在不删除tab键使用的焦点循环的情况下完成。

我不知道如何开始这样做,我在API中发现的唯一一件就是用你自己的替换遍历策略,但我不想替换它我想创建一个新的与默认版本并行运行。

public class unit27 {

    JButton button1 = new JButton("add to next cup");
    JButton button2 = new JButton("add to next cup");
    JButton button3 = new JButton("add to next cup");
    JButton button4 = new JButton("add to next cup");

    JTextField text1 = new JTextField("4");
    JTextField text2 = new JTextField("4");
    JTextField text3 = new JTextField("4");
    JTextField text4 = new JTextField("4");

    JLabel label1 = new JLabel("Cup 1");
    JLabel label2 = new JLabel("Cup 2");
    JLabel label3 = new JLabel("Cup 3");
    JLabel label4 = new JLabel("Cup 4");

    JFrame frame = new JFrame();
    JPanel mainPanel = new JPanel();
    JPanel panel1 = new JPanel();
    JPanel panel2 = new JPanel();
    JPanel panel3 = new JPanel();
    JPanel panel4 = new JPanel();

    public unit27() {

        mainPanel.setLayout(new GridLayout(2, 4));
        panel1.setLayout(new GridLayout(1, 3));
        panel2.setLayout(new GridLayout(1, 3));
        panel3.setLayout(new GridLayout(1, 3));
        panel4.setLayout(new GridLayout(1, 3));
        frame.add(mainPanel);
        frame.setSize(800, 800);
        frame.setVisible(true);
        mainPanel.add(panel1);
        mainPanel.add(panel2);
        mainPanel.add(panel3);
        mainPanel.add(panel4);

        panel1.add(label1);
        panel1.add(button1);
        panel1.add(text1);

        panel2.add(label2);
        panel2.add(button2);
        panel2.add(text2);

        panel3.add(label3);
        panel3.add(button3);
        panel3.add(text3);

        panel4.add(label4);
        panel4.add(button4);
        panel4.add(text4);

        button1.add(text1);
        button1.addActionListener(new MyListener1());
        button2.addActionListener(new MyListener2());
        button3.addActionListener(new MyListener3());
        button4.addActionListener(new MyListener4());

        // end class

    }

    class MyListener1 implements ActionListener {
        public void actionPerformed(ActionEvent e) {

            int a = Integer.parseInt(text1.getText());
            int b = Integer.parseInt(text2.getText());

            int c = a + b;

            text2.setText(Integer.toString(c));

        }
    }

    class MyListener2 implements ActionListener {
        public void actionPerformed(ActionEvent e) {

            int a = Integer.parseInt(text2.getText());
            int b = Integer.parseInt(text3.getText());

            int c = a + b;

            text3.setText(Integer.toString(c));

        }
    }

    class MyListener3 implements ActionListener {
        public void actionPerformed(ActionEvent e) {

            int a = Integer.parseInt(text3.getText());
            int b = Integer.parseInt(text4.getText());

            int c = a + b;

            text4.setText(Integer.toString(c));

        }
    }

    class MyListener4 implements ActionListener {
        public void actionPerformed(ActionEvent e) {

            int a = Integer.parseInt(text4.getText());
            int b = Integer.parseInt(text1.getText());

            int c = a + b;

            text1.setText(Integer.toString(c));

        }
    }

    public static void main(String[] args) {

        new unit27();
    }

}

1 个答案:

答案 0 :(得分:0)

Swing不允许同时运行2个焦点循环。如果你真的需要第二个焦点循环(而不仅仅是输入焦点遍历键),那么你可以做的是:

创建一个确定您的周期的地图 在具有额外周期的每个组件上,为Enter添加一个键绑定,以获取周期中的下一个可见字段并在其上调用requestFocus。

您必须维护地图并创建自定义检查以查看下一个组件是否可见或是否应跳过。