簡體   English   中英

搖擺-無法將默認任務欄圖標更改為自定義圖標

[英]Swing - Unable to change default taskbar icon to custom icon

我有一個小問題,出於某些奇怪的原因,我似乎無法解決。

我正在努力了解為什么我嘗試使用自定義任務欄圖標而不是默認Java徽標作為程序圖標的嘗試無效。

本質上,我的程序從包含一個JFrame的JDesktopPane開始,單擊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”),我從以下路徑文件訪問要用作任務欄圖標的圖像:/ C:/ Users / WorkPC /文檔/測試/斌/ 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)

感謝您的任何建議。

getResource方法使類加載器在程序的類路徑中瀏覽圖像的目錄和JAR文件,因此它應該位於您的jar或類路徑中的另一個jar中

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

我建議您在src文件夾中創建用於圖像的文件夾,然后將圖像移到該文件夾​​中

然后您可以指定文件夾名稱/圖像名稱來訪問它:

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

或者您可以使用:

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

它們都將從類路徑的根開始

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM