Auf JPanel angezeigte visuelle Artefakte

Ich versuche mit 2 ein Programm zu erstellenJPanel mitBorderLayout. Das mittlere Feld dient zum zufälligen Zeichnen eines Rechtecks, während das südliche Feld für die Schaltflächen vorgesehen ist.

Ich bekomme ein seltsames Bild von der Schaltfläche in der oberen linken Ecke vonJFrame Immer wenn ich den Mauszeiger über die Nord- oder Südtaste bewege. Ich recherchierte und fand heraus, dass dies der Grund für einen transparenten Hintergrund sein könnte. Ich habe versucht mitsuper.paintComponent(g) für das Bedienfeld verschwinden jedoch die übrigen zuvor gezeichneten Rechtecke. Ich brauche die Rechtecke, um im zu bleibenJPanel aber nicht das seltsame Bild oben links.

Ich weiß nicht, was ich falsch mache, hoffentlich kann jemand helfen oder einen Hinweis geben, wie man dieses Problem löst.

    public class TwoBRandomRec extends JFrame{

    private static final long serialVersionUID = 1L;

    public static void main(String[] args) {
        TwoBRandomRec rec = new TwoBRandomRec();

        rec.setSize(500,500);
        rec.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        rec.setVisible(true);
    }

    public TwoBRandomRec() {
        //Create the buttons
        JButton north = new JButton("North");
        JButton south = new JButton("South");
        DrawPanel drawPanel = new DrawPanel(500,500);

        JPanel southP = new JPanel();
        southP.add(south);
        southP.add(north);

        this.add(drawPanel, BorderLayout.CENTER);
        this.add(southP, BorderLayout.SOUTH);

        this.setTitle("TwoButtonRandomRec");
        this.pack();        
    }

    public class DrawPanel extends JPanel {

        private static final long serialVersionUID = 1L;

        private Random rand = new Random();
        private int x,y,xSize,ySize;
        private int height,width;

        public DrawPanel(int w,int h) {
            width = w;
            height = h;
        }
        public void RandomX(){
             x=rand.nextInt(width-1);
             xSize=rand.nextInt(width-x);
         }

         public void RandomY(){
             y=rand.nextInt(height-1);
             ySize=rand.nextInt(height-y);
         }

         public Color RandomColour(){
             rand.nextInt(height);
             return new Color(rand.nextInt(255),rand.nextInt(255),rand.nextInt(255));
         }

        @Override
        protected void paintComponent(Graphics g) {
            RandomX();
            RandomY();

            g.setColor(RandomColour());
            g.fillRect(x, y, xSize, ySize);
            try {
                Thread.sleep(50);

            } catch (InterruptedException e) {  
            }

            repaint();
        }
    }
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage