使用键绑定在两种形式之间切换
Switching between two forms with 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;
}
}
FirstForm
和 SecondForm
是我自己的 类 扩展 JPanel
.
您的 keyboardSwitcher(...) 方法有误。第二次调用该方法时,您只是替换了第一个绑定。同一个 KeyStroke
.
不能有两个绑定
您正确地将 JPanel 传递给该方法,但是您从未使用 JPanel 设置键绑定。
因此,您需要在每个面板上单独设置绑定,而不是在根窗格上设置绑定。
您将使用以下 InputMap:
InputMap im = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
此外,要交换面板,您应该使用 CardLayout
。此布局管理器将允许您在添加到 CardLayout
的多个面板之间切换。查看 Swing 教程中关于 How to Use CardLayout 的部分以获得工作示例。
现在,当您创建切换器操作时,您还需要知道要切换到的面板的名称。
我需要使用键绑定以两种方式切换。这是我的代码,它以一种方式工作。有人可以帮我让它双向工作吗?
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;
}
}
FirstForm
和 SecondForm
是我自己的 类 扩展 JPanel
.
您的 keyboardSwitcher(...) 方法有误。第二次调用该方法时,您只是替换了第一个绑定。同一个 KeyStroke
.
您正确地将 JPanel 传递给该方法,但是您从未使用 JPanel 设置键绑定。
因此,您需要在每个面板上单独设置绑定,而不是在根窗格上设置绑定。
您将使用以下 InputMap:
InputMap im = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
此外,要交换面板,您应该使用 CardLayout
。此布局管理器将允许您在添加到 CardLayout
的多个面板之间切换。查看 Swing 教程中关于 How to Use CardLayout 的部分以获得工作示例。
现在,当您创建切换器操作时,您还需要知道要切换到的面板的名称。