Пользовательский JPanel с Netbeans - PullRequest
0 голосов
/ 17 июня 2011

Я создаю пользовательский компонент JPanel и хочу показать фоновое изображение во время разработки.Моя проблема: Как загрузить файл изображения из текущего проекта?

Ответ: Я не знал, но JLabel хорошо работает с изображениями из текущего проекта.Так что сейчас я буду использовать JLabel.Спасибо всем.

Ответы [ 3 ]

0 голосов
/ 17 июня 2011

Для загрузки изображения вы можете использовать этот метод:

ImageIcon loadImageIcon(String name) {
    URL imgURL = getClass().getResource(path);
    if (imgURL != null) {
        return new ImageIcon(imgURL);
    } else {
        System.err.println("Couldn't find file: " + path);
        return null;
    }
}

Где параметр name имеет следующие ограничения:

  • Если имя начинается с /, то абсолютное имя ресурса - это часть имени, следующая за /.
  • В противном случае абсолютное имя имеет следующую форму: modified_package_name/name, где modified_package_name - это имя пакета этого объекта с / вместо ..

Подробнее см. описание метода getResource (String name) .

Например, если вы поместите этот метод в файл MyPanel.java и у вас будет следующая структура пакетов

swing/
  | - panel/
  |      | - MyPanel.java
  | - resources/
         | - my_image.jpg

чем параметр name, может быть

либо ../resources/my_image.jpg, либо /swing/panel/resources/my_image.jpg,

, но ни swing/panel/resources/my_image.jpg, ни /resources/my_image.jpg.

Обновление:

Вот рабочий пример. В конструкторе пользовательского интерфейса NetBeans вы можете сделать аналог.

package swing.panel;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.net.URL;

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

public class ImagePanel extends JPanel {

    private Image img;

    public ImagePanel(String img) {
        this(new ImageIcon(img).getImage());
    }

    public ImagePanel(Image img) {
        this.img = img;
        Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
        setPreferredSize(size);
        setMinimumSize(size);
        setMaximumSize(size);
        setSize(size);
        setLayout(null);
    }

    @Override
    public void paintComponent(Graphics g) {
        g.drawImage(img, 0, 0, null);
    }

    /** Returns an ImageIcon, or null if the path was invalid. */
    private static ImageIcon loadImageIcon(String path) {
        URL imgURL = ImagePanel.class.getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL);
        } else {
            System.err.println("Couldn't find file: " + path);
                return null;
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run(){
                ImagePanel panel =
                        new ImagePanel(loadImageIcon("../resources/image.png").getImage());

                JFrame frame = new JFrame();
                frame.getContentPane().add(panel);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}
0 голосов
/ 17 июня 2011

Ключом к тому, чтобы что-то отображалось в дизайнере GUI, является то, что оно будет там, когда вызывается конструктор формы по умолчанию. Если вы можете получить доступ к изображению как к ресурсу (как предлагали другие), тогда оно будет доступно в иерархии сборки / классов, которую Netbeans использует при попытке запустить ваш класс для создания предварительного просмотра формы в конструкторе. Загрузите это изображение в конструктор формы по умолчанию без аргументов, и оно должно появиться в конструкторе.

0 голосов
/ 17 июня 2011

Я недавно столкнулся с небольшим количеством проблем с этим.

Если вы намерены упаковать вашу программу в исполняемый файл JAR, как я, я бы порекомендовал следующий код.Требуется, чтобы все ваши изображения находились в корне вашего проекта в папке с именем «media»

imgURL = getClass().getResource("/media/Image_to_be_loaded.jpg");
if (imgURL != null) {
    image = new ImageIcon(imgURL, "");
    imageLabel = new JLabel(baeLogo);
} else {
    imageLabel = new JLabel("No icon found");
}

Однако я заметил, что этот код работает ТОЛЬКО при запуске из файла JAR.Когда я запускаю прямо из затмения, он постоянно показывает «Значок не найден»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...