java - 使用按键绑定(bind)在两种形式之间切换

标签 java swing jpanel key-bindings

我需要使用按键绑定(bind)以两种方式进行切换。这是我的代码,它以一种方式工作。有人可以帮我让它双向工作吗?

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 的类。

最佳答案

你的keyboardSwitcher(...)方法是错误的。第二次调用该方法时,您只是替换第一次绑定(bind)。同一个 KeyStroke 不能有两个绑定(bind)。

您正确地将 JPanel 传递给该方法,但您从未使用 JPanel 来设置键绑定(bind)。

因此,您不需要在根 Pane 上设置绑定(bind),而是需要单独在每个面板上设置绑定(bind)。

您将使用以下输入映射:

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

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

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

关于java - 使用按键绑定(bind)在两种形式之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42317325/

相关文章:

java - 为什么将鼠标移到 Java 应用程序上会更流畅?包括视频

java - Java中IP地址过滤器内存数据结构的最佳选择

java - 是否有可能获得从标准谷歌地图导航到我们的应用程序到达目的地的估计时间?

java - Oracle 10g 中使用哪种数据类型来存储 DateTime?

java - 如何将 JTextField[][] 作为参数传递给动态加载的 java 类方法?

java - 用于聊天室的 JTextPane 或 JEditorPane

java - 在 JPanel 中实例化 JApplet 实例?

java - JPanel 错误 - 无法解析 J 组件

java - 如果 ArrayList 的大小发生变化,如何从其中选择一个随机元素?

java - JFrame 中的组件不显示