Рисование графики поверх JButton - PullRequest
3 голосов
/ 09 марта 2010

У меня есть ситуация, когда у меня есть группа JButtons на GridLayout.Мне нужно, чтобы каждый из JButton имел:

  1. фоновое изображение (но при необходимости сохранял возможность сохранять внешний вид кнопки по умолчанию)
  2. пользовательскую графику, нарисованную поверх других классов

У меня нет проблем с фоновым изображением, поскольку я использую setIcon (), но у меня возникают проблемы при рисовании объектов поверх фона.В какой-то момент я смог нарисовать поверх кнопки, но после нажатия кнопки рисунки исчезли.Как заставить кнопку сохранять это состояние рисования?

По сути, мне нужен способ, чтобы мои JButton имели открытые методы, которые позволили бы другому классу рисовать на нем что-либо, например:

public void drawSomething() {
  Graphics g = this.getGraphics();
  g.drawOval(3,2,2,2);
  repaint();
}

или

public Graphics getGraphics() {
  return this.getGraphics();
}

тогда другой класс мог бы сделать это:

button.getGraphics().drawSomething();

Последний - больше того, что я ищу, но первый также полезен.

Есть ли способ пойти по этому поводу?Кроме того, переопределение метода родительского класса paintComponent () не помогает, поскольку мне нужно, чтобы каждая кнопка имела разную графику.

Ответы [ 2 ]

8 голосов
/ 09 марта 2010

вы можете создать подкласс JButton и переопределить paintComponent (). Вы можете обрабатывать каждую кнопку, имеющую различный рисунок, предоставляя внешнего «художника» для подкласса. Или просто иметь разные подклассы для каждой другой графики.

public class MyButton extends JButton {
    private Painter painter;

    public void paintComponent(Graphics g) {
       super.paintComponent(g);
       painter.paint(g);
    }
}

public interface Painter {
    public void paint(Graphics g);
}

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

3 голосов
/ 09 марта 2010

Вы можете создать BufferedImage и сделать пользовательское рисование на нем, а затем нарисовать изображение с помощью вашего собственного метода paintComponent (...).

Посмотрите на пример DrawOnImage из Пользовательские подходы к рисованию .

...