2013-01-21 51 views
1

EDITED 2013年2月2日我的Swing應用程序有什麼問題?

隨着一些你的答案的幫助和一個簡單的Swing應用指南,我發現,我能夠做的一點點進步,我把它們都放在一個類現在。然而,我仍然無法完成它,我不得不做一個按鈕來做到這一點,因爲它非常煩人,不得不拉起任務管理器。工具提示也不起作用。我不知道它是否重要,但我正在Eclipse中做。

import javax.swing.SwingUtilities; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JButton; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class Thing extends JFrame 
{ 
    private static final long serialVersionUID = 1L; 

    public Thing() 
    { 
     setTitle("Thing"); 
     setSize(1024, 768); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setResizable(false); 

     JPanel panel = new JPanel(); 
     getContentPane().add(panel); 
     panel.setLayout(null); 
     panel.setToolTipText("A panel container"); 

     JButton quit = new JButton("Quit"); 
     quit.setBounds(50, 60, 80, 30); 
     quit.setToolTipText("A button component"); 
     quit.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent event) 
      { 
       System.exit(0); 
      } 
     }); 
     panel.add(quit); 
    } 

    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       Thing thing = new Thing(); 
       thing.setVisible(true); 
      } 
     }); 
    } 
} 

這是它給人的錯誤,當我嘗試與X.關閉(閉合工作正常的按鈕)

java.lang.NoClassDefFoundError: sun/awt/TimedWindowEvent 
    at sun.awt.windows.WToolkit.eventLoop(Native Method) 
    at sun.awt.windows.WToolkit.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
+1

請注意:您應該在構造函數中加載圖像,然後將圖像保存到圖像中,而不是每次要繪製時加載圖像。 – MTilsted

+1

'g.drawImage(Toolkit.getDefaultToolkit()。getImage(「image.jpg」),0,0,null);'不要試圖在paint方法中加載圖像!在構建時讀取它(或者更好,定義一個接受'Image'的構造函數)。只需用油漆塗抹即可。所以假設它是一個名爲'image'的類屬性,可能會變成..'g.drawImage(image,0,0,this);' –

+0

1)'Title'應該返回一個首選大小(推測是)1200x1200。 2)一旦你完成了這些,'pack()'frame和'setLocationByPlatform(true)'3)除非這個圖像是用於其他組件的BG,否則考慮在一個標籤中顯示它。 4)忘了在最終代碼片段中強調對「this」的引用。一個'JPanel'實現'ImageObserver',所以使用該對象本身作爲圖像加載通知。隨着更多圖像可用,重繪將被觸發。 –

回答

2

出於某種原因,我不能關閉它並且必須使用任務管理器。

使用SwingUtilies.invokeLater()來創建GUI。

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html

+0

它似乎沒有改變任何東西。我複製了網站上的代碼,並將其粘貼到main()方法中,然後剪切並粘貼所有代碼,它說createAndShowGUI();這是我需要做的還是我誤解了?它仍然給出同樣的錯誤,我現在將它放入原始文章。 –

1

Toolkit.getDefaultToolkit().getImage("image.jpg")很可能使用背景加載器加載關閉主塗料線程圖像(或事件指派線程,AKA EDT)。

這基本上意味着,該方法將直接返回,但圖像實際上並沒有加載。

對於低容量帶寬系統,這是爲了防止系統在下載並加載到內存中的圖像時出現拖延現象(以前的方式)。現在,這幾乎沒有問題。

相反,在Title構造函數,你應該預先載入圖像...

private BufferedImage background; 
public Title() throws IOException {   
    background = ImageIO.read(new File("image.jpg")); 
} 

而在你paintComponent方法...

public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    if (background != null) { 
     g.drawImage(background, 0, 0, this); 
    } 
} 

的其他問題與您目前的做法加載圖像處理如何處理錯誤。你目前的方法會傾向於默默地消耗錯誤,並且很難確定實際發生了什麼問題。

你可以看看JButton only show up on mouseover更多完整的例子

+0

謝謝,圖像現在工作正常,但窗口仍然不會關閉沒有任務管理器。當我有機會時,我會閱讀你給出的鏈接。 –

+0

這聽起來像是你在EDT內有其他東西(如循環或阻塞動作和/或Thread.sleep或Object#等待),這將阻止EDT響應關閉事件 – MadProgrammer

0

我不知道,如果你能解決問題,但我也有類似的問題:對於我的應用程序擴展JFrame的,但無法用任何setDefaultCloseOperation(...)關閉或隱藏它。在最小化,恢復或最大化框架時,我遇到了與上面顯示的相同的錯誤。
我修正了它更新jdk和jre到最新Java 1.7並正在使用它。在eclipse中,轉到Window > Preferences > Java > Installed JREs並選擇最新的Java (如果使用64位系統),最好也使用64位Java。在子菜單> Execution Environment中,左側選擇Java 1.7,右側選擇兼容的Java 1.7 64位JRE。
我不確定究竟是什麼問題,但可能是Java 64位應用程序和32位運行時環境之間的一些不兼容問題。

+0

這只是我正在做的事情有趣,所以我還沒有回到這個呢。我會很快去的;聽起來像它可能會工作。 –

相關問題