2017-02-18 32 views
0

Мне нужно переключиться двумя способами с помощью клавишных привязок. Вот мой код, он работает в одну сторону. Может ли кто-нибудь помочь мне заставить его работать в обоих направлениях?Переключение между двумя формами с привязкой клавиш

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.

+1

1) Используйте ['CardLayout'] (http://download.oracle.com/javase/8/docs/api/java/awt/CardLayout.html), как показано в [этом ответе] (http://stackoverflow.com/a/5786005/418556). 2) Чтобы лучше помочь, опубликуйте [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

+0

Спасибо. Это мой первый пост, я буду использовать ваши рекомендации в будущем – Arseniy

+0

* «Я буду использовать ваше руководство в будущем» * Прохладный. В этом случае я мог бы добавить больше в ваши вопросы .. в будущем. Конечно, вы можете [изменить] вопрос * сейчас. * –

ответ

1

Ваш клавиатурный переключатель (...) неправильный. Во второй раз, когда вы вызываете метод, вы просто заменяете первое связывание. У вас не может быть двух привязок для одного и того же KeyStroke.

Вы правильно передаете JPanel методу, но тогда вы никогда не используете JPanel для установки привязок клавиш.

Таким образом, вместо установки привязок на корневой панели вам необходимо установить привязки на каждой панели отдельно.

Вы могли бы использовать следующую InputMap:

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

Кроме того, для замены панелей вы должны использовать CardLayout. Этот менеджер макета позволит вам поменять местами между несколькими панелями, добавленными в CardLayout. Ознакомьтесь с разделом из учебника Swing по How to Use CardLayout для рабочего примера.

Теперь, когда вы создаете свое действие Switcher, вам также нужно будет узнать имя панели, на которую вы хотите переключиться.

+0

Спасибо за ваш ответ. У меня есть задача сделать 2 формы переключения через KeyBindings двумя способами (ctrl ENTER) Мне нужно использовать GridBagLayout и RootPane в картах ввода/действия, это возможно? – Arseniy

+0

@ Арсений, я уже говорил, что вы не можете иметь несколько привязок для одного и того же KeyStroke. Это вы хотите добавить привязку к корневой панели, тогда вы можете иметь только одно привязку. Я думаю, что если вы используете CardLayout, вы можете просто использовать метод 'next (...)'. для замены на другую панель. Действие должно быть умнее. Действие должно знать, какая панель в данный момент видна, а затем отобразить другую панель. Детские панели могут использовать то, что вы хотите. В родительской панели используется CardLayout. Прочтите учебник, загрузите примеры и играйте с демо-кодом, чтобы понять концепцию !!! – camickr

+0

Теперь я понимаю, спасибо, очень – Arseniy