#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);
}
Также попробуйте сделать заголовок элементом данных класса. Это может оказаться полезным позже.