Как установить значок для моего jframe без необходимости помещать значок на рабочий стол при экспорте jar? - PullRequest
1 голос
/ 22 апреля 2020

Я хочу установить значок для моей игры java на значок с именем lgico.png, но когда я использую:

static ImageIcon icon = new ImageIcon("lgico.png");
public Window(int width, int height, String title, Game game) {
    frame.setIconImage(icon.getImage());
}

Мой файл JAR не имеет значка при его создании и поместите его на мой рабочий стол.

Вот мой класс окон в полном объеме:

package com.teto.main;
import java.awt.Canvas;
import java.awt.Cursor;
import java.awt.Dimension;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
public class Window extends Canvas {
    private static final long serialVersionUID = 5486926782194361510L;
    static ImageIcon icon = new ImageIcon("lgico.png");
    Cursor csr = new Cursor(Cursor.CROSSHAIR_CURSOR);
    public Window(int width, int height, String title, Game game) {
        JFrame frame = new JFrame(title);
        frame.setPreferredSize(new Dimension(width, height));
        frame.setMaximumSize(new Dimension(width, height));
        frame.setMinimumSize(new Dimension(width, height));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.add(game);
        frame.setVisible(true);
        frame.setIconImage(icon.getImage());
        frame.setCursor(csr);
        game.start();
    }
}

Я пытался найти решения на этом сайте несколько раз, чтобы встретить исключение NullPointerException и моя программа - белый экран, на котором ничего нет.

Я прошу прощения, если то, что я пытаюсь express, не кажется очень ясным, поскольку мой родной язык не является английским sh.

1 Ответ

1 голос
/ 22 апреля 2020
  1. Не расширяйте Canvas. Вы не добавляете функциональность в класс Canvas, поэтому нет причин расширять его.

  2. Не вызывайте класс вашего Window. Это класс AWT с таким именем. Имена классов должны быть описательными.

  3. Если вы используете файл JAR, то вам, вероятно, необходимо загрузить изображение в качестве ресурса:

Вот базовый c пример:

import javax.swing.*;
import java.net.*;

class FrameIconFromMain
{
    public static void main(String[] args)
    {
        Runnable r = new Runnable()
        {
            public void run()
            {
                JFrame f = new JFrame("Frame with icon");
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

                String imageName = "dukewavered.gif";
                URL imageUrl = f.getClass().getResource(imageName);

                if (imageUrl == null)
                {
                    System.out.println("imageUrl not found using default classloader!");
                    imageUrl = Thread.currentThread().getContextClassLoader().getResource(imageName);
                }

                ImageIcon icon = new ImageIcon( imageUrl );
                f.setIconImage( icon.getImage() );
                f.setSize(400,300);
                f.setLocationRelativeTo( null );
                f.setVisible( true );
            }
        };

        SwingUtilities.invokeLater(r);
    }
}
...