gpt4 book ai didi

java - Swing - 无法将默认任务栏图标更改为自定义图标

转载 作者:行者123 更新时间:2023-11-30 03:51:38 25 4
gpt4 key购买 nike

我遇到了一个小问题,由于某些奇怪的原因我似乎无法解决。

我很难理解为什么我尝试使用自定义任务栏图标而不是默认的 java Logo ,因为我的程序图标不起作用。

本质上,我的程序从包含 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/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)

感谢您的任何建议。

最佳答案

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"));

它们都将从类路径的根目录开始

关于java - Swing - 无法将默认任务栏图标更改为自定义图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24288686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com