重绘不是在行动中进行的

时间:2015-07-05 16:20:54

标签: java swing repaint

我正在撰写一个简单的游戏应用程序,而且我一直坚持这个问题。

  • pwait和pmain是2个面板
  • 框架是主框架

"创建"是一个按钮,位于pmain面板内,这是单击它时执行的操作:

以下是代码:

// ACTION: Create new game
    create.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            if(UA.alreadyOpen()) {
                JOptionPane.showMessageDialog(null,"already open game!");
                return;
            }

            int n = 0;
            String nome = null;

            try {
                n = Integer.parseInt(JOptionPane.showInputDialog(null, "Give the max number of guessers"));
                nome = JOptionPane.showInputDialog(null, "give the name of the game");
                if ( n < 1 || nome == null) System.out.println("mainInterface: input problems"); // TODO ...

                frame.setContentPane(pwait);
                pwait.setVisible(true);
                pmain.setVisible(false);
                frame.pack();
            } catch (NumberFormatException e1) {
                // ???
                e1.printStackTrace();
            } catch (HeadlessException e1) {
                // ???
                e1.printStackTrace();
            } 
                // AND HERE IS THE PROBLEM:
                if(!UA.apriPartita(n, nome)) 
                    System.out.println("ERR creazione partita"); // TODO
                refreshPartite(); 
        }
    });

UA是此接口类背后的逻辑类。被叫方法&#34; UA.apripartita(..)&#34;工作正常,它做了很多事情。 问题是: 我希望界面重新绘制并在&#34;创建&#34;时显示pwait面板。单击按钮,但它没有返回UA.apripartita(..)的方法返回(我猜,还会返回ActionPerformed函数?)。

实际上,我也试过删除那个UA.apripartita(..)方法调用,它运行正常。 当方法在里面时它为什么不起作用?

提前致谢!

PS。已经尝试过放入一些frame.repaint()或frame.invalidate()但它们似乎什么也没做。

PPS。欢迎任何其他关于此代码的好建议!

2 个答案:

答案 0 :(得分:0)

是的,这是设计的。你可以在重拍&#39;的文档中清楚地看到它。 基本上,它坚持&#34;事件&#34;进入swing事件队列 - 处理点击等同一个队列 - 所以Swing将按顺序处理&#34;执行的操作&#34;然后&#34;重新绘制&#34;然后更多的代码片段(例如mouseClicked或其他任何内容)队列)。 这种方法省去了同步的麻烦,特别是考虑到swing组件不是线程安全的。

您可以立即查找&#39; paint&#39;但我真的建议坚持重拍&#39;如果可能的话。

答案 1 :(得分:0)

这是因为actionPerformed(...)方法在UI主事件线程的控制下运行。因此,在UA.apripartita()运行时,您的用户界面无法刷新。如果此方法设计为运行很长时间(比如超过半秒,用户不喜欢动作及其效果之间的长时间延迟),您应该考虑使用多线程(如果此方法必须与UI交互,想想SwingWorker)。