Probleme beim aktualisieren eines JPanels

Mikesh

Mitglied
Hey an alle,

ich habe mal wieder ein kleineres Problem.
Ich habe mit Swing eine Anwendung erstellt, mit der die geometrischen Figuren Quadrat oder
Kreis in den Farben rot, grün oder blau angezeigt werden können. Mein JFrame hat ein BorderLayout. Ich habe eine Unterklasse von JPanel innerhalb des JFrames für den
Zeichenflächenbereich definiert und meine Paint-Methode so überschrieben, dass sie abhängig von der Einstellung der Radiobuttons und der Größe des Panels die geometrische Figur in passender Größe zeichnet.
Die RadioButtons habe ich in ein Panel(gridLayout) eingefügt und es in meinem BorderLayout WEST platziert.

Nehmen wir an ich aktiviere die RadioButtons Form: Rechteck und Farbe: Rot , dann sehe ich das rote Rechteck erst nachdem ich mein Fenster mit der Maus einmal größer oder kleiner gezogen habe...

Ich hätte aber gern, dass sobald ich zB. Grün anklicke es mir direkt das grüne Rechteck anzeigt ohne mein Frame davor vergrößern oder verkleinern zu müssen.

panel.repaint(); funktioniert auch nicht wie erwünscht.

Hier mal die überschriebene paint-methode
Java:
private class PaintPanel extends JPanel {

        @Override
        public void paint(Graphics g) {

            if (jRbRect.isSelected() == true) {
                if (jRbRot.isSelected() == true) {
                    g.setColor(Color.RED);

                } else if (jRbGrün.isSelected() == true) {
                    g.setColor(Color.GREEN);

                } else if (jRbBlau.isSelected() == true) {
                    g.setColor(Color.BLUE);

                }
                g.fillRect(50, 50, panel1.getWidth() - 100,
                        panel1.getHeight() - 100);

            } else if (jRbOv.isSelected() == true) {
                if (jRbRot.isSelected() == true) {
                    g.setColor(Color.RED);

                } else if (jRbGrün.isSelected() == true) {
                    g.setColor(Color.GREEN);

                } else if (jRbBlau.isSelected() == true) {
                    g.setColor(Color.BLUE);

                }
                g.fillOval(50, 50, panel1.getWidth() - 100,
                        panel1.getHeight() - 100);

            }

        }
    }

Bin über jeden Tipp dankbar

Grüße
Mikesh
 

Anhänge

  • Draw.PNG
    Draw.PNG
    7,2 KB · Aufrufe: 30
Erstens: benutze paintComponent() anstatt von paint()

Zweitens: hast du überhaupt irgendwo einen actionlistener für deine Buttons definiert?
 
Ok stimmt das mit paintComponent() macht Sinn, Danke.

Anfangs hatte ich für jeden Button einen ActionListener definiert, wusste aber nicht genau was ich reinschreiben sollte.
button.setSelected(); dafür brauche ich ja nicht extra einen ActionListener oder?
Da panel.repaint(); auch nicht die gewünschte Erfolg gebracht hat, habe ich die Listener wieder gelöscht...
Ich vermute dass in den Listener eine Methode kommt, welche mir das panel "aktualisiert" nur weiß ich nicht welche.
 
Ich glaube ich habe es gelöst!
Java:
private class PaintPanel extends JPanel {

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);

            if (jRbRect.isSelected() == true)  {
                if (jRbRot.isSelected() == true) {
                    //g.clearRect(50, 50, panel1.getWidth()-100, panel1.getHeight()-100);
                    g.setColor(Color.RED);

                } else if (jRbGrün.isSelected() == true) {
                    //g.clearRect(50, 50, panel1.getWidth()-100, panel1.getHeight()-100);
                    g.setColor(Color.GREEN);
                   

                } else if (jRbBlau.isSelected() == true) {
                    //g.clearRect(50, 50, panel1.getWidth()-100, panel1.getHeight()-100);
                    g.setColor(Color.BLUE);

                }
                g.fillRect(50, 50, panel1.getWidth()-100 ,
                        panel1.getHeight()-100 );

und in die ActionListener bei den Buttons habe ich dann einfach panel1.repaint(); implementiert
 
Ich weiß nicht, was der Zweck Deiner Übung ist, aber wenn Du eine kleine Herausforderung brauchst, dann realisiere Dein Panel in einer separaten Java-Datei.
 
Warum sollte das Panel neu gezeichnet werden wenn du einen Button drückst? Wenn Java schlau ist zeichnet es dann auch nur den Button neu. Du solltest also im ActionListener des Buttons ein repaint() des Panels aufrufen das die Formen malt.

Gruß

Claus
 

Zurück
Oben