#java #swing #user-interface #jpanel #components
#java #swing #пользовательский интерфейс #jpanel #Компоненты
Вопрос:
Я новичок в графических интерфейсах. Я создал это простое приложение, которое рисует овал другим цветом при каждом нажатии кнопки. но когда я когда-либо вызываю JPanel
‘s repaint()
, он не просто перерисовывает часть панели рамки (овал). Вместо этого он как бы перерисовывает весь фрейм, а также рисует кнопку, которую я нажал в верхней части фрейма (северная граница). Я знаю, что могу просто вызвать JFrame
‘s repaint()
, чтобы решить эту проблему, но мне просто интересно, почему это происходит. Я думал, что все, что repaint()
нужно, это просто вызвать paintComponent()
объект. может кто-нибудь объяснить, почему он так себя ведет?? Спасибо!!
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Jbutton extends JFrame implements ActionListener {
JFrame frame;
JButton b;
panel p;
public void go() {
frame = new JFrame();
b = new JButton("click me");
p = new panel();
b.addActionListener(this);
frame.add(BorderLayout.CENTER, p);
frame.add(BorderLayout.SOUTH, b);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setSize(250, 250);
frame.setVisible(true);
}
class panel extends JPanel {
public void paintComponent(Graphics g) {
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
g.setColor(new Color(red, blue, green));
g.fillOval(20, 30, 50, 50);
}
}
@Override
public void actionPerformed(ActionEvent arg0) {
p.repaint();
}
}
Ответ №1:
Убедитесь, что вы вызываете super.paintComponent
, чтобы подготовить Graphics
контекст для рисования
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g)
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
g.setColor(new Color(red, blue, green));
g.fillOval(20, 30, 50, 50);
}
Суть в том, что Graphics
контекст является общим ресурсом. Каждый компонент, нарисованный во время цикла рисования, будет использовать один и тот же Graphics
контекст, что означает, что все, что когда-либо было ранее нарисовано для него, все равно будет там. Вам необходимо очищать / подготавливать Graphics
контекст при каждом paintComponent
вызове.
По сути, это то, что paintComponent
делает…