2011-03-31 67 views
2

我已經在JFrame窗口中編寫了一個應用程序,並且想要在需要時彈出錯誤消息。但是,當我調用「JOptionPane.showMessageDialog()」時,應用程序凍結,唯一的方法就是使用任務管理器。 這裏是我的代碼下調版本:爲什麼我的應用程序在JFrame頂部顯示JOptionPane時會凍結?

import java.awt.Canvas; 
import java.awt.Dimension; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 
import java.util.concurrent.atomic.AtomicReference; 
import javax.swing.JFrame; 

public class GameMain { 
    public JFrame jframe; 
    public Canvas canvas; 

    private AtomicReference<Dimension> canvasSize = new AtomicReference<Dimension>(); 

    public void initialize(int width, int height) { 
    try { 
     Canvas canvas = new Canvas(); 
     JFrame frame = new JFrame("testapp"); 
     this.canvas = canvas; 
     this.jframe = frame; 
     ComponentAdapter adapter = new ComponentAdapter() { 
      public void componentResized(ComponentEvent e) { 
       resize(); 
      } 
     }; 

     canvas.addComponentListener(adapter); 
     canvas.setIgnoreRepaint(true); 
     frame.setSize(640, 480); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(canvas); 
     frame.setVisible(true); 
     Dimension dim = this.canvas.getSize(); 
     } catch (LWJGLException le) { 
      le.printStackTrace(); 
     } 

     JOptionPane.showMessageDialog(null, "oops!"); 
    } 
    public void resize() 
    { 
     Dimension dim = this.canvas.getSize(); 
     canvasSize.set(dim); 
     dim = null; 
    } 
} 

有誰知道爲什麼它可能會那麼做嗎?

+0

您是否在應用程序中使用併發?你可以測試你的代碼,只留下'新的JFrame(...),setVisible,showMessageDialog',看看它是否工作呢? – pajton 2011-03-31 17:30:01

+0

@pajton:那有效。嗯..讓我們來看看如果我一個一個地啓用所有的東西會發生什麼 – Bartvbl 2011-03-31 17:36:53

+1

那麼,這只是調試問題的技巧:現在您可以開始逐個添加代碼並查看哪一段代碼會導致問題。 – pajton 2011-03-31 17:39:53

回答

7
private void ShowMessage(String message) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      JOptionPane.showMessageDialog(null, message); 
     } 
    }); 
} 
+1

我們的救星。我們的應用程序完全沒有這個凍結,我不知道爲什麼。謝謝! – electrotype 2014-11-07 14:41:29

+0

爲我解決了,謝謝。 – Tyron 2017-04-16 17:17:48

1

嘗試通過框架,而不是空存在

JOptionPane.showMessageDialog(null, "oops!"); 

不要混在一起AWT和Swing(JFrame的和Canvas)

+0

這對我來說非常合適。 – 2013-09-10 12:30:13

0

那是因爲你已經通過真實的setAlwaysOnTop JFrame.Try傳遞false。 setAlwaysOnTop(false);

相關問題