2010-02-17 58 views
0

我想用(Java + Eclipse + Swing)創建我的第一個GUI應用程序。這是我的代碼:爲什麼我的基於Swing的GUI應用程序沒有響應?

import java.awt.*; 
import javax.swing.*; 


public class HelloWorldSwing extends JFrame { 

     JTextArea m_resultArea = new JTextArea(6, 30); 

     //====================================================== constructor 
     public HelloWorldSwing() { 
      //... Set initial text, scrolling, and border. 
      m_resultArea.setText("Enter more text to see scrollbars"); 
      JScrollPane scrollingArea = new JScrollPane(m_resultArea); 
      scrollingArea.setBorder(BorderFactory.createEmptyBorder(10,5,10,5)); 

      // Get the content pane, set layout, add to center 
      Container content = this.getContentPane(); 
      content.setLayout(new BorderLayout()); 
      content.add(scrollingArea, BorderLayout.CENTER); 
      this.pack(); 
     } 

     //============================================================= main 
     public static void main(String[] args) { 
      JFrame win = new HelloWorldSwing(); 
      win.setTitle("TextAreaDemo"); 
      win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      win.setVisible(true); 
     } 


} 

該代碼取自here。當我從Eclipse運行應用程序時,出現期望的窗口(所以,這很好,我看到了我想看到的東西)。但是,當我嘗試關閉窗口或嘗試在文本區域中寫入內容時,程序會凍結。操作系統寫道,程序沒有響應(我在Ubuntu上試用)。

任何人都可以幫助我找到問題的原因嗎?

非常感謝您的幫助。

+0

我試過提供的代碼,它工作正常...你還有什麼其他的嗎?當你註釋掉構造函數的內容以獲得一個空的'JFrame'並嘗試關閉它時,它是否工作? – 2010-02-17 15:12:13

+0

這不是代碼。它在我的Windows機器上正常工作。按預期關閉並寫入。你不是在用beta jvm嗎? – Oso 2010-02-17 15:33:49

+0

我試着評論這段代碼:content.add(scrollingArea,BorderLayout.CENTER);我仍然有同樣的問題。出現一個空的窗口,它也沒有響應。 – Roman 2010-02-17 15:35:26

回答

1

我敢肯定,這沒有用代碼來執行,正如其他人發現的代碼運行在自己的機器就好了 - 指向機器具體問題。在Eclipse中,確保它被設置爲使用預期的JDK/JRE。然而,在擔心Eclipse如何處理您的情況之前,我會先手動運行 - 尤其是因爲您有一個非常簡單的課程。

我會檢查以確保您使用的是預期的編譯器和運行時。在Linux上:

which javac 
which java 

如果他們都是你所期望的,請執行下列操作:

javac HelloWorldSwing.java 
java HelloWorldSwing 

如果你得到一個類似的問題,那麼你就知道這不是Eclipse配置,它是別的東西。如果您沒有使用最新的JDK,請升級到最新版本。如果你已經是最新的,它可能是一個顯示驅動程序。其他的JAVA swing程序在這臺電腦上工作嗎?我相信你可以在網上找到一些,下載一個已經打包成jar的應用並嘗試運行它。

-2

你需要捕捉退出事件和 響應與System.exit(0);

你應該能夠發現,在 最搖擺在線的例子。

錯誤的東西...對不起... ...咖啡....哎呀

+1

不應該'JFrame.EXIT_ON_CLOSE'照顧? – 2010-02-17 15:09:54

+0

多數民衆贊成在糟糕的建議,因爲你有一個JFrame的銷燬方法的一些邏輯時,它不會被執行時調用System.exit() – fasseg 2010-02-17 15:20:35

0

做您嘗試使用eventdispatcherthread查看JFrame的?

類似:

public static void main(String[] args){ 
    SwingUtilities.invokeLater(new Runnable(){ 
     public void run(){ 
      createAndViewJFrame(); 
     } 
    }); 
} 

public void createAndViewJFrame(){ 
    JFrame win = new HelloWorldSwing(); 
    win.setTitle("TextAreaDemo"); 
    win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    win.setVisible(true); 
} 

那麼你的框架將通過擺動調度線程中。

希望它幫助,雖然我只是猜測......

更新:如評論者指出你I F **編起來的invokeLater()調用。我剛剛編輯這篇文章來糾正。 Thanx去yishai & willcodejavaforfood指出它!

坦率

+1

這不是你如何調用invokeLater方法。 – Yishai 2010-02-17 15:34:25

+0

以及它接近:) – willcodejavaforfood 2010-02-17 15:39:03

+2

SwingUtilities.invokeLater(new Runnable(){public void run(){createAndViewJFrame()}); – willcodejavaforfood 2010-02-17 15:41:48

相關問題