JPanel problema de repintado

Tengo un JFrame que contiene 2 subclases de JPanel y 2 JLabel en BorderLayout. Uno de los JPanel contiene JButtons y el otro se usa para mostrar gráficos. Los JLabels están en norte y sur, el botón JPanel en el oeste y la pantalla JPanel en el centro.

La pantalla JPanel requiere una actualización constante, por lo que invoco su método repintar () a través del evento de acción generado por el temporizador de oscilación. También anulo su método paintComponent () para hacer mis dibujos.

En lugar de mostrar lo que he dibujado, el "contenido del JFrame" se está dibujando en la pantalla JPanel. Soy consciente de que simplemente puedo "borrar" la pantalla JPanel usando g.fillRect () o super.paintComponent () antes de hacer mis dibujos.

Solo tengo curiosidad de por qué sucede esto.

Estoy usando jdk 1.6u27. a continuación está mi código:

package test;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Main {

public static void main(String[] args) {
    Simulation sim = new Simulation();

    }
}

class Simulation extends JFrame {

    public JLabel state;
    private JLabel id;
    private ButtonPanel control;
    private Display display;

    public Simulation() {
        id = new JLabel("Test");
        state = new JLabel("Test");
        control = new ButtonPanel();
        display = new Display(this);

        this.setLayout(new BorderLayout());
        this.add(id, BorderLayout.NORTH);
        this.add(control, BorderLayout.WEST);
        this.add(display, BorderLayout.CENTER);
        this.add(state, BorderLayout.SOUTH);

        this.setSize(500, 600);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    public ButtonPanel getControl() {
        return this.control;
    }
}

class ButtonPanel extends JPanel implements ActionListener {

    public JButton b[] = new JButton[8];
    public boolean bp[] = new boolean[8];

    public ButtonPanel() {
        this.setLayout(new GridLayout(8, 1));

        for (int i = 0; i < b.length; i++) {
            b[i] = new JButton(""+i);
            b[i].addActionListener(this);
            bp[i] = false;
            this.add(b[i]);
        }
    }

    public void actionPerformed(ActionEvent e) {
        //do something
    }
}

class Display extends JPanel implements ActionListener {

    private Timer tm;
    private int yco;
    private Simulation sim;

    public Display(Simulation sim) {
        tm = new Timer(100, this);
        tm.start();

        yco = 0;

        this.sim = sim;
    }

    @Override
    public void paintComponent(Graphics g) {
        //draw something
        g.drawLine(0, yco, 100, 100);
    }

    public void actionPerformed(ActionEvent e) {
        yco ++;
        this.repaint();
    }
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta