Не работает отображение Java JPanel

#java #swing #graphics #jpanel #paint

#java #swing #графика #jpanel #Краски

Вопрос:

У меня проблема с созданием внутреннего класса, который расширяется из 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, который, в свою очередь, вызывает метод внутреннего класса с тем же именем, и где должна быть нарисована строка show… но это не работает, я не вижу этого на панели. Вот мое событие нажатия кнопки:

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

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

Комментарии:

1. вздохните, снова получите графику… похоже, распространяется эпидемически… Как уже отмечал @camickr: DO. NOT. USE. этот метод в Swing

Ответ №1:

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

Что ж, вот и ответ на вопрос. Выполните весь свой рисунок с помощью метода paintComponent ().

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

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

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

Комментарии:

1. Спасибо за ваш ответ. Я понимаю, что вы мне сказали. Теперь, как вы предлагаете мне нарисовать пользовательский и динамический текст в методе paintComponent?

2. Заголовок должен быть просто свойством класса Plot, который вы всегда рисуете. Тогда у вас есть метод setTitle(), который сохраняет новое значение заголовка. Затем вы вызываете repaint (), и компонент перерисовывает сам себя. Итак, вместо метода drawTitle() вам нужен метод setTitle().

Ответ №2:

Просто вызовите функцию 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);
    }
  

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