Проблема с перерисовкой Java JPanel ()?

#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 делает…