2014-06-18 62 views
1

我遇到了一個小問題,我似乎無法解決某些奇怪的原因。擺動 - 無法將默認任務欄圖標更改爲自定義圖標

我很努力地理解爲什麼我的嘗試有一個自定義的任務欄圖標,而不是默認的Java標誌作爲我的程序圖標不起作用。

本質上,我的程序從一個JDesktopPane開始,它包含一個JFrame,並在JFrame上按一下按鈕,JFrame就會調用一個JInternalFrame。

從我的代碼下面你會發現這就是我試圖設置任務欄圖標:

 java.net.URL resource = getClass().getClassLoader().getResource("systrayicon.jpg"); 
    Image image = Toolkit.getDefaultToolkit().getImage(resource); 
    TestJDesktopPaneFrame.setIconImage(image); 

你會發現,使用的getClass()getClassLoader()的getResource(「systrayicon.jpg」。 )我正在訪問imahge,我打算使用它作爲我的任務欄圖標從以下路徑文件:/ C:/Users/WorkPC/Documents/TEST/bin/systrayicon.jpg

我已經使用getClass()。getClassLoader ().getResource(「」)無數次,它對我來說很好,例如在我用來調用JInternalFrame的按鈕中,我使用getClass()。getClassLoader()。getResource(「」)來訪問按鈕的自定義圖像。

下面是我的全部代碼:

package bge.applcs.dsa; 

import java.awt.Cursor; 
import java.awt.Dimension; 
import java.awt.Image; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.io.IOException; 
import javax.swing.*; 

public class TestJDesktopPane extends JDesktopPane { 

    public static TestJDesktopPane TestJDesktopPane; 
    public static JFrame TestJDesktopPaneFrame = new JFrame(""); 
    public JButton btnJIFrame; 

    public TestJDesktopPane() throws IOException { 
     createPanel(); 
    } 

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

    public static void showFrame() { 

     try { 
      TestJDesktopPane = new TestJDesktopPane(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 

     TestJDesktopPaneFrame.setContentPane(TestJDesktopPane); 

     TestJDesktopPaneFrame.setUndecorated(true); 

     MoveMouseListener mml = new MoveMouseListener(TestJDesktopPane); 
     TestJDesktopPane.addMouseListener(mml); 
     TestJDesktopPane.addMouseMotionListener(mml); 

     TestJDesktopPaneFrame.pack(); 

     TestJDesktopPaneFrame.setVisible(true); 

     TestJDesktopPaneFrame.setResizable(false); 

     TestJDesktopPaneFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     TestJDesktopPaneFrame.setLocationRelativeTo(null); 

     TestJDesktopPaneFrame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), 
       "Cancel"); 
     TestJDesktopPaneFrame.getRootPane().getActionMap().put("Cancel", new AbstractAction(){ 
      public void actionPerformed(ActionEvent x) { 
       System.exit(0);     
      } 
     }); 

    } 

    public void createPanel() { 

     setLayout(null); 

     setPreferredSize(new Dimension(1000, 300)); 

     java.net.URL resource = getClass().getClassLoader().getResource("systrayicon.jpg"); 
     Image image = Toolkit.getDefaultToolkit().getImage(resource); 
     TestJDesktopPaneFrame.setIconImage(image);  

     // ****************************** Minimize button ****************************** 
     // Prepare images 
     ImageIcon btnJIFrameNonRollover = new ImageIcon((getClass().getClassLoader().getResource("btnjiframe.jpg"))); 
     ImageIcon btnJIFrameRollover = new ImageIcon((getClass().getClassLoader().getResource("btnjiframerollover.jpg"))); 

     // Create custom button 
     btnJIFrame = new JButton(btnJIFrameNonRollover); 
     btnJIFrame.setBorder(null); 
     btnJIFrame.setContentAreaFilled(false); 
     btnJIFrame.setBorderPainted(false); 
     btnJIFrame.setFocusPainted(false); 
     btnJIFrame.setBounds(100,100,100,100); 
     btnJIFrame.setRolloverIcon(btnJIFrameRollover); 
     btnJIFrame.setCursor(new Cursor(Cursor.HAND_CURSOR)); 
     btnJIFrame.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent event) { 
       JInternalFrame logInJIFrame = new JInternalFrame(); 

       add(logInJIFrame);    
      } 
     }); 

     // 
     add(btnJIFrame); 
    } 

    } 

編輯:

我嘗試以下,但得到了一個錯誤:

// 
java.net.URL resource = getClass().getClassLoader().getResource("/images/systrayicon.jpg"); 
Image image = Toolkit.getDefaultToolkit().getImage(resource); 
signInDesktopPaneFrame.setIconImage(image); 

這裏的錯誤:

Uncaught error fetching image: 
java.lang.NullPointerException 
    at sun.awt.image.URLImageSource.getConnection(Unknown Source) 
    at sun.awt.image.URLImageSource.getDecoder(Unknown Source) 
    at sun.awt.image.InputStreamImageSource.doFetch(Unknown Source) 
    at sun.awt.image.ImageFetcher.fetchloop(Unknown Source) 
    at sun.awt.image.ImageFetcher.run(Unknown Source) 

感謝任何su ggestions。

+2

圖像移動到您的源文件夾,它會工作 –

回答

2

的getResource方法會導致類加載器通過在程序的類路徑中的目錄和JAR文件尋找你的形象,因此應該是在你的罐子或其他jar的一個您的類路徑中

http://docs.oracle.com/javase/tutorial/uiswing/components/icon.html#getresource

我建議你做文件夾圖片src目錄內,然後將你的圖片有

,那麼你可以指定文件夾名/ imagename訪問它:

ImageIcon icon = ImageIcon(this.getClass().getResource("/images/filename.png")); 

,或者您可以使用:

ImageIcon icon = ImageIcon(this.getClass().getClassLoader().getResource("images/filename.png")); 

他們都將從類路徑

的根目錄開始
+2

實際上,你會需要一個'/ '在'圖像'前面,因爲搜索將從類位置開始(即,包)。 '/'將你帶到'images'所在的根。沒有它,搜索將在調用類的包中尋找一個文件夾「images」。在操作中使用'getClassLoader()',你不需要'/',因爲類加載器從類路徑的根開始搜索。這實際上使你對該帖子發表評論正確:-) –

+1

謝謝你,我不知道這件事,現在明白了問題後再解決,再次感謝:) –

+0

@peeskillet:謝謝你的回覆。如果在將項目轉換爲jar文件時使用images文件夾,然後將jar文件轉換爲exe文件,那麼這些圖像將在exe文件中可用? – TokTok123

相關問題