Странная проблема с Java CardLayout в JFrame - PullRequest
3 голосов
/ 17 февраля 2011

привет, у меня есть Jframe с CardLayout и 3 картами. У меня есть ActionListener на кнопке на первой карте.

Этот код работает хорошо:

JButton btnLogin = new JButton("Login");
btnLogin.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        CardLayout cl = (CardLayout)(cards.getLayout());
        cl.show(cards, "wait");
    }
}

проблема в том, что когда я добавляю код для входа в систему на сервере (я разрабатываю клиент xmpp):

JButton btnLogin = new JButton("Login");
btnLogin.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        CardLayout cl = (CardLayout)(cards.getLayout());
        cl.show(cards, "wait");
        xmppManager = new Xmpp("jabberserver", 5222);
        try {
            xmppManager.init();
        } catch (XMPPException e) {
            e.printStackTrace();
        }
        cl.show(cards, "userList");
    }
}

По сути, мне нужно показать карту «пожалуйста, подождите», когда пользователь нажимает кнопку входа в систему, выполняет вход, а затем показывает другую карту. Но в этом случае карта «ожидания» не отображается, она выполняет вход в систему (это занимает около 5 секунд) и показывает непосредственно окончательную карту «userList».

Чего мне не хватает?

Ответы [ 2 ]

5 голосов
/ 17 февраля 2011

Весь код выполняется в потоке диспетчеризации событий, который не позволяет перерисовывать графический интерфейс. Вы должны выполнить вызов к серверу в отдельном потоке, чтобы не блокировать EDT.

Прочтите раздел из учебника по Swing на Параллелизм для получения дополнительной информации и предлагаемого решения.

1 голос
/ 17 февраля 2011

Возможно, необходимо вызвать перерисовку экрана после показа пожалуйста подождите?Может не сработать автоматически.

...