使用键绑定在两个表单之间切换

时间:2017-02-18 15:54:40

标签: java swing jpanel key-bindings

我需要使用Key Bindings以两种方式切换。这是我的代码,它以一种方式工作。有人可以帮助我让它在两个方面都有效吗?

public class MyFrame extends JFrame {
    private FirstForm firstForm = new FirstForm();
    private SecondForm secondForm = new SecondForm();

    public MyFrame(){
        setContentPane(firstForm);
        setSize(800,600);
        firstForm.addActionListenerForSomeAction(switcher(secondForm));
        secondForm.addActionListenerForSomeAction(switcher(firstForm));

        keyboardSwitcher(firstForm);
        keyboardSwitcher(secondForm);

    }

    public void keyboardSwitcher(JPanel panel){

        InputMap imap = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        imap.put(KeyStroke.getKeyStroke("ctrl ENTER"),"switchAction");

        ActionMap amap = getRootPane().getActionMap();
        amap.put("switchAction",switcher(panel));
    }

    public Action switcher(JPanel panel){
        Action action = new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                setContentPane(panel);
                getContentPane().revalidate();
                getContentPane().repaint();
            }
        };
        return action;
    }
}

FirstFormSecondForm是我自己的扩展JPanel的类。

1 个答案:

答案 0 :(得分:1)

您的keyboardSwitcher(...)方法错误。第二次调用方法时,您只需要替换第一个绑定。您无法对同一KeyStroke进行两次绑定。

您正确地将JPanel传递给该方法,但之后您永远不会使用JPanel来设置键绑定。

因此,您需要分别在每个面板上设置绑定,而不是在根窗格上设置绑定。

您将使用以下InputMap:

InputMap im = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);

此外,要交换面板,您应该使用CardLayout。此布局管理器允许您在添加到CardLayout的多个面板之间进行切换。请查看How to Use CardLayout上Swing教程中的部分以获取工作示例。

现在,当您创建Switcher Action时,您还需要知道要切换到的面板的名称。