Как создать пользовательский JButton в java с базой изображений? - PullRequest
6 голосов
/ 23 ноября 2011

Я недавно читал эту ветку ( Создание пользовательской кнопки в Java ) по созданию пользовательских кнопок в java путем расширения класса JButton, однако все решения в этом потоке используют графику, нарисованную в java.

Я хотел, чтобы моя кнопка была основана на изображении кнопки, которое я нарисовал в фотошопе.Поэтому я попытался применить то, что я прочитал в этой теме, с таким результатом:

import javax.swing.*;
import java.awt.*;

public class nextButton extends JButton {
    @Override
        protected void paintComponent(Graphics g) {
        Image image = new ImageIcon("nextButton.png").getImage();
        g.drawImage(image,0,0,this);
}

    @Override
    public Dimension getPreferredSize() {
        Dimension size = super.getPreferredSize();
        size.setSize(75, 150);
        return size;
    }
}

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

a) Размер JButton не соответствует изображению?б) Я не загрузил изображение должным образом.В записках, которые мне дал лектор, он записывает код отображаемого изображения, используя просто «imageName.png» без указания пути к файлу, поэтому я понятия не имею, правильный ли это способ или как программа узнает, как загрузить изображение.,в) Что-то еще, что мне не известно.

Если кто-нибудь знает, как решить эту проблему, я был бы очень признателен.

Большое спасибо!

Ответы [ 3 ]

5 голосов
/ 15 марта 2013

Я тоже задавал этот вопрос ранее.Лучшее решение, которое я нашел, работало лучше всего, вместо того, чтобы рисовать.

ImageIcon icon = new ImageIcon("pathOfImageHere.png");
JButton button = new JButton(icon);

Так, что устанавливает кнопку на изображение.Теперь я решил сделать кнопку невидимой и удалить все границы.Итак, я сделал это следующим образом:

button.setOpaque(false);
button.setContentAreaFilled(false);
button.setBorderPainted(false);
button.setFocusPainted(false);
4 голосов
/ 23 ноября 2011

Для одного вы должны использовать ImageIO.read(new File("somefile.png")) для загрузки Image. Обратите внимание, что если не указан абсолютный путь, по умолчанию используется относительный из рабочего каталога . Если у вас заканчивается затмение, это папка проекта. Из банки это папка, в которой находится банка (если не указано иное).

См. http://docs.oracle.com/javase/tutorial/2d/images/loadimage.html для объяснения того, как правильно загрузить изображение (также сказано, как это сделать из апплета).

Кроме того, вы должны загрузить изображение один раз , а затем повторно использовать его для каждой итерации рисования:

BufferedImage image;

public nextButton() {
    try {
        image = ImageIO.read(new File("nextButton.png"));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(image, 0, 0, null);
}

@Override
public Dimension getPreferredSize() {
    return new Dimension(image.getWidth(), image.getHeight());
}

Дайте мне знать, если это работает для вас (не забудьте поместить свой png в рабочий каталог!).

2 голосов
/ 23 ноября 2011

Почему бы вам просто не использовать конструктор JButton, который получает изображение?

http://www.apl.jhu.edu/~hall/java/Swing-Tutorial/Swing-Tutorial-JButton.html

...