Переключение панелей и передача данных в Swing - PullRequest
4 голосов
/ 15 декабря 2010

Я только начинаю со Swing - извините, если за этим вопросом трудно следовать, но я чувствую, что это очень простая вещь, но она кажется удивительно сложной в Swing.

У меня есть панель с двумя текстовыми полями и кнопкой отправки.

Я добавил слушателя на кнопку отправки, когда она нажимается, я проверяю данные и тому подобное.

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

Как я могу отправить эти данные обратно во фрейм, чтобы фрейм мог удалить текущую панель и заменить ее новой, другой панелью, созданной с данными из первой панели.

Хотя это не то, чем я занимаюсь, это можно представить как логин.

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

Это удивительно трудно понять в Swing. Должен ли я определить свой собственный тип события и сделать фрейм слушателем этого события?

Ответы [ 2 ]

1 голос
/ 15 декабря 2010

Вы должны посмотреть на java.awt.CardLayout . Этот макет может обрабатывать несколько панелей, которые накладываются друг на друга. И вы можете выбрать, какая панель должна быть самой верхней и, следовательно, видимой.

Следующий код показывает соответствующие части из учебника, упомянутого выше:

//Where instance variables are declared:
final static String BUTTONPANEL = "Card with JButtons";
final static String TEXTPANEL = "Card with JTextField";


//Where the components controlled by the CardLayout are initialized:
//Create the "cards".
JPanel card1 = new JPanel();
JPanel card2 = new JPanel();

//Create the panel that contains the "cards".
JPanel cards = new JPanel(new CardLayout());
cards.add(card1, BUTTONPANEL);
cards.add(card2, TEXTPANEL);

и для переключения видимой панели:

CardLayout cl = (CardLayout)(cards.getLayout());
cl.show(cards, TEXTPANEL);
1 голос
/ 15 декабря 2010

Если я понял ваш вопрос, вы можете использовать логику обратного вызова следующим образом:

MyLoginPanel login = new MyLoginPanel(new IMyCallback(){

            public void processLogin(){
                //frame can remove the current panel and replace it with a new
            }

        });
  • MyLoginPanel расширен из Jpanel с помощью конструктора public MyLoginPanel(IMyCallback callback)
  • IMyCallback - это интерфейс, который имеетpublic void processLogin() метод.

Вы можете позвонить callback.processLogin(); из LoginPanel

У вас это работает?

...