Java JPanel рисование не работает - PullRequest
0 голосов
/ 14 ноября 2011

У меня проблема с созданием внутреннего класса, который расширяется от JPanel для рисования на нем чего-либо. Я переопределил метод paintComponent, и все, что я выбрал для рисования, работает нормально, но использование другого метода для рисования не работает.

Вот мой внутренний код класса:

private class Plot extends JPanel {

    public Plot() {
        this.setBackground(Color.WHITE);
    }

    @Override
    public void paintComponent(Graphics graphic) {
        super.paintComponent(graphic);
        Graphics2D graphic2d = (Graphics2D) graphic;

        graphic2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

        graphic2d.drawOval(0, 0, this.getWidth() - 1, this.getHeight() - 1);
    }

    public void drawTitle(final String title) {
        Graphics2D graphic2d = (Graphics2D) this.getGraphics();
        graphic2d.setColor(Color.red);
        graphic2d.drawString(title, 1, 10);
    }
}

Обратите внимание на метод drawTitle. Я просто хочу, чтобы пользовательский текст был показан. В моем внешнем классе, который расширяется от JFrame, я создаю экземпляр этого внутреннего класса следующим образом:

private Plot plot;

/** Creates new form GraphicsView */
public GraphicsView() {
    initComponents();
    plot = new Plot();
    this.add(plot, BorderLayout.CENTER);
}

public void drawTitle(final String title) {
    this.plot.drawTitle(title);
}

Я даже создаю удобный метод для вызова метода drawTitle внутреннего класса (с тем же именем). Я делаю это потому, что хочу, чтобы внешний класс JFrame был виден при нажатии кнопки, как только он становится видимым (что обеспечивает инициализацию графики), я вызываю внешний класс drawTitle, который, в свою очередь, вызывает метод внутреннего класса с тем же именем и где Строка шоу будет нарисована ... но это не работает, я не вижу его на панели. Вот мое событие нажатия кнопки:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    GraphicsView view = new GraphicsView();
    view.setVisible(true);
    view.drawTitle("Hello");
}

Заранее спасибо, буду признателен за любую помощь. :)

Ответы [ 2 ]

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

Я переопределил метод paintComponent, и все, что я выбрал для рисования отсюда, прекрасно работает

Ну, есть ответ на вопрос.Все рисование выполняется методом paintComponent ().

, но использование другого метода для рисования не работает.

Не используйте метод getGraphics ().Вам следует когда-либо использовать только объекты Graphics, переданные методу paintComponent ().

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

0 голосов
/ 01 апреля 2014

Просто вызовите функцию drawTitle () в переопределении paintComponent и передайте графику в качестве аргумента. Примерно так:

    @Override
    public void paintComponent(Graphics graphic) {

        super.paintComponent(graphic);
        Graphics2D graphic2d = (Graphics2D) graphic;

        graphic2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

        graphic2d.drawOval(0, 0, this.getWidth() - 1, this.getHeight() - 1);
        drawTitle(graphic, title);
    }

    public void drawTitle(Graphics g, final String title) {
        Graphics2D graphic2d = (Graphics2D) g;
        graphic2d.setColor(Color.red);
        graphic2d.drawString(title, 1, 10);
    }

Также попытайтесь сделать заголовок членом данных класса. Это может оказаться полезным позже.

...