panel.repaint(); erzeught einen Button-Phantom

I.E.

Mitglied
Hallo.

Der folgende Code erstellt einen Kreis mit einer zufälligen Farbe. Drückt man auf den Knopf unten, wird die Farbe erneut per Zufallsgenerator neu geladen. Was mich aber stutzig macht ist, dass nach dem ersten Knopfdruck oben im Fenster eine Kopie dieses Knopfes erscheint. Diesen Knopf kann man nicht betätigen, und sobald er da ist, will er auch nicht mehr verschwinden.

Hier ist erst einmal der Code:

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

public class gui implements ActionListener {
public static void main(String[] args) {
gui g = new gui(); g.draw();}//main()
JFrame Rahmen; JButton Farbenknopf; PANEL panel;

public void draw(){
Rahmen = new JFrame("DAS SPIEL"); 

Rahmen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Farbenknopf = new JButton("setze Zufallsfarbe");	

Rahmen.getContentPane().add(BorderLayout.SOUTH, Farbenknopf);	

Farbenknopf.addActionListener(this);

panel = new PANEL();								

Rahmen.getContentPane().add(BorderLayout.CENTER, panel);

Rahmen.setSize(600,600); Rahmen.setVisible(true); 
}//draw()

public class PANEL extends JPanel{
public void paintComponent(Graphics g){

int rot  = (int)(Math.random()*255);	
int grün = (int)(Math.random()*255);	
int blau = (int)(Math.random()*255);	

Color randcolor = new Color(rot, grün, blau);

g.setColor(randcolor);
g.fillOval(100, 100, 100, 100);
	
}//paintComponent()	
}//inner class PANEL

public void actionPerformed(ActionEvent event){
	panel.repaint();
}//actionPerformed()

}//class gui

Wenn ich panel.repaint(); lösche, passiert so ein Müll nicht mehr.
Ich könnte zwar panel mit Rahmen ersetzen, dann würde es auch klappen, allerdings gibt es Programme, bei denen ich unbedingt panel brauche. Bei Rahmen.repaint(); wird ja das ganze Bild komplett gelöscht, und neugezeichnet. Bei panel.repaint(); kommt ja ein neues Bild dazu, und falls ich zb. noch einen Zufallsgenerator für die Position und Maße einstelle, würde ich zusätzlich zu dem alten Bild noch ein neues Bild erhalten.

Lange Rede, kurzer Sinn - kann mir bitte einer erklären, was es mit diesem mystischen Knopf auf sich hat? Wie kann ich sein Erscheinen unterbinden?

Danke!
 

Flown

Administrator
Mitarbeiter
Dein JFrame repainten ...

Und das was du hier produziert hast, ist absolut grausiger Code.

Klassennamen GROSS, Variablen camelCase, am besten alles in Englisch halten!

Eventuell das dann es so aussieht:

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

public class GUI {
    public static void main(String[] args) {
        GUI gui = new GUI();
        gui.open();
    }

    public void open() {
        JFrame frame = new JFrame("DAS SPIEL");
        frame.setSize(600, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel mainPanel = new JPanel(new BorderLayout());
        JButton colorBtn = new JButton("setze Zufallsfarbe");
        MyPanel drawPanel = new MyPanel();

        colorBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                mainPanel.repaint();
            }
        });

        mainPanel.add(drawPanel, BorderLayout.CENTER);
        mainPanel.add(colorBtn, BorderLayout.SOUTH);
        
        frame.add(mainPanel);

        frame.setVisible(true);
    }

    public class MyPanel extends JPanel {
        private static final long serialVersionUID = 5757215530434899157L;

        @Override
        public void paintComponent(Graphics g) {
            int rot = (int) (Math.random() * 255);
            int grün = (int) (Math.random() * 255);
            int blau = (int) (Math.random() * 255);

            g.setColor(new Color(rot, grün, blau));
            g.fillOval(100, 100, 100, 100);
        }
    }
}
 
Zuletzt bearbeitet:

I.E.

Mitglied
Hallo, ich habe ja geschrieben, dass man auch Rahmen.repaint(); hätte machen können, und dass es dann auch geklappt hätte. Nur gibt es eben andere Fälle, wo ich JPanel repainten möchte, bloß ohne, dass dieser komischer Doppelgänger-Knopf auftaucht.

Danke für deinen Code-Vorschlag, mir ist zwar momentan nicht jeder Schritt verständlich, aber ich werde es demnächst durcharbeiten.
 

Neue Themen


Oben