Java 重新绘制isn';t执行内部操作

Java 重新绘制isn';t执行内部操作,java,swing,repaint,Java,Swing,Repaint,我正在写一个简单的游戏应用程序,我被困在这个问题上 pwait和pmain是两个面板 框架是主体框架 “创建”是pmain面板内的一个按钮,这是单击该按钮时执行的操作: 代码如下: // ACTION: Create new game create.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(UA.alread

我正在写一个简单的游戏应用程序,我被困在这个问题上

  • pwait和pmain是两个面板
  • 框架是主体框架
“创建”是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(); 
        }
    });
//操作:创建新游戏
create.addActionListener(新建ActionListener()){
已执行的公共无效操作(操作事件e){
if(UA.alreadyOpen()){
showMessageDialog(null,“已经打开游戏!”);
返回;
}
int n=0;
字符串nome=null;
试一试{
n=Integer.parseInt(JOptionPane.showInputDialog(null,“给出最大猜测数”);
nome=JOptionPane.showInputDialog(null,“给出游戏名称”);
如果(n<1 | | nome==null)System.out.println(“主接口:输入问题”);//TODO。。。
frame.setContentPane(pwait);
pwait.setVisible(真);
pmain.setVisible(假);
frame.pack();
}捕获(NumberFormatException e1){
// ???
e1.printStackTrace();
}捕捉(无头例外e1){
// ???
e1.printStackTrace();
} 
//问题是:
如果(!UA.apriPartita(n,nome))
System.out.println(“ERR creazione partita”);//待办事项
refreshPartite();
}
});
UA是该接口类后面的逻辑类。被调用的方法“UA.apripartta(…)”工作得很好,它可以做很多事情。 问题是: 我希望界面在单击“创建”按钮时重新绘制并显示pwait面板,但直到返回方法UA.apripartta(..)时才重新绘制并显示pwait面板(我猜,ActionPerformed函数也会返回?)

实际上,我还尝试删除了UA.apripartta(..)方法调用,效果很好。 当方法在其中时,为什么它不起作用

提前谢谢

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


pps。欢迎任何关于此代码的好建议

是的,这是故意的。您可以在“重新绘制”的文档中清楚地看到它。 基本上,它会将一个“事件”粘贴到swing事件队列中(与处理单击等的事件相同),因此swing将依次处理“已执行的操作”,然后“重新绘制”,然后再处理更多的代码(例如,mouseClicked或队列中的任何内容)这种方法省去了同步的麻烦,特别是考虑到swing组件不是线程安全的


您可以立即查找“paintinstally”,但我确实建议尽可能坚持使用“repaint”。

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

frame.setContentPane(pwait)改用a,如.I second@AndrewThompson建议使用CardLayout所示。另外,如果你的问题没有很快解决,考虑创建和发布A,这样我们就能准确地看到问题所在。我几乎可以向您保证,
repaint()
调用在这里不是问题。什么是设计?根据目前提供的代码和信息,我无法猜测他的代码为什么不工作,我当然不能将他当前的故障归咎于Swing事件队列的结构。抱歉,如果不清楚,我指的是他的原始问题,引用:“但直到。。。“ActoRealPrimor函数也被返回”。这是“ReFrand”的精确设计,最初是由Sun设计和记录的。他的问题是他用长时间运行的代码键入事件队列。他需要向我们展示代码,因为解决方案当然是使用后台线程,而不是考虑使用PrimTimeTimes。