JFrame中java CardLayout的奇怪问题

Lap*_*aig 3 java swing actionlistener cardlayout

你好,我有一个带有CardLayout和3张卡的Jframe.我在第一张卡片上的按钮上有一个ActionListener.

这段代码运行良好:

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

问题是当我添加代码在服务器上进行登录时(我正在开发一个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");
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,当用户按下登录按钮,登录,然后显示另一张卡时,我需要显示"请稍候"的卡片.但在这种情况下,"等待"卡不会显示,它会进行登录(大约需要5秒)并直接显示最终卡"userList".

我错过了什么?

cam*_*ckr 5

所有代码都在Event Dispatch Thread上执行,这阻止了GUI重新绘制自身.您需要调用服务器才能在单独的线程中执行,因此您不会阻止EDT.

阅读有关并发的Swing教程中的部分以获取更多信息和建议的解决方案.

  • 我不认为有必要在EDT上进行服务器操作,除非我误解了你的帖子.您应该点击上面camickr帖子中的链接,了解如何使用SwingWorker对象来帮助您在Swing中执行后台线程. (2认同)