【问题标题】:Strange problem with java CardLayout in JFrameJFrame中java CardLayout的奇怪问题
【发布时间】:2011-06-29 05:11:58
【问题描述】:

你好,我有一个带有 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");
    }
}

问题是当我添加代码以在服务器上进行登录时(我正在开发一个 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”。

我错过了什么?

【问题讨论】:

    标签: java swing actionlistener cardlayout


    【解决方案1】:

    所有代码都在事件调度线程上执行,这会阻止 GUI 重新绘制自身。您需要对服务器的调用在单独的线程中执行,这样您就不会阻塞 EDT。

    阅读 Concurrency 上的 Swing 教程部分,了解更多信息和建议的解决方案。

    【讨论】:

    • 您好,谢谢!现在我关闭了 EventQueue.invokeLater(new Runnable() { public void run() { //server call } 中的服务器调用,它正在工作,你认为这是一个好的解决方案吗?
    • 我认为不需要在 EDT 上进行服务器操作,除非我误解了您的帖子。您应该单击上面 camickr 帖子中的链接以了解如何使用 SwingWorker 对象来帮助您在 Swing 中执行后台线程。
    【解决方案2】:

    显示后可能需要触发重绘屏幕,请稍候?它可能不会自动触发。

    【讨论】:

    • 您好,谢谢。我刚刚添加了一个 frame.repaint();在 cl.show(cards, "wait");但它确实改变了。卡在第一张卡上,登录后直接进入第三张卡……
    • 刚刚也尝试了cards.repaint()。什么都没有。
    • 对于 CardLayout,这不是必需的。 camickr 的帖子最好地描述了这个问题及其解决方案。
    猜你喜欢
    • 1970-01-01
    • 2012-01-30
    • 2013-08-19
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 2011-10-17
    相关资源
    最近更新 更多