[Erledigt] repaint bei Änderung der Dimensionen

Hi, ich habe ein Panel geschrieben, das einen Farbverlauf im Hintergrund erzeugt. Wenn ich nun dieses Panel in einer GUI einfüge und dann die Dimensionen des Fensters durch ziehen per Maus verändere, passt sich das Panel erst nach Loslassen der Maustaste in das Fenster an.
Wie kann ich es erreichen, dass das Panel schon während des Ziehens aktualisiert (neu gezeichnet) wird?

Hier mal der Code, vielleicht ist ja da schon Mist drin.


import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JPanel;

/**
 * GradientPanel ist eine Komponente, die einen Farbverlauf auf ihrem Hintergrund enthalten kann.
 */
public class GradientPanel extends JPanel {
   private Color startColor, endColor;
   private int gradientType;
   /**
    * Dient zum Erzeugen eines vertikalen Farbverlaufes von oben nach unten über die gesamte Höhe.
    */
   public static final int VERTICAL = 0;
   
   /**
    * Dient zum Erzeugen eines horizontalen Farbverlaufes von links nach rechts über die gesamte Breite.
    */   
   public static final int HORIZONTAL = 1;
   
   /**
    * Dient zum Erzeugen eines diagonalen Farbverlaufes von links oben nach rechts unten über die gesamte Breite und Höhe.
    */   
   public static final int TOP_DIAGONAL = 2;
   
   /**
    * Dient zum Erzeugen eines diagonalen Farbverlaufes von links unten nach rechts oben über die gesamte Breite und Höhe.
    */   
   public static final int BOTTOM_DIAGONAL = 3;
   
   /** 
    * Erzeugt ein neues GradientPanel ohne Werte.
    * In diesem Fall erhält GradientPanel das Verhalten eines JPanel und kann
    * zur Laufzeit mit entsprechenden Parametern verändert werden.
    */
   public GradientPanel() {
      super();
   }
   
   /**
    * Erzeugt ein neues GradientPanel aus den übergebenen Parametern.
    * @startColor Die Farbe, mit der der Farbverlauf beginnen soll.
    * @endColor Die Farbe, mit der der Farbverlauf enden soll.
    * @gradient Die Richtung, in die die Farbe verlaufen soll. Um die Verlaufsrichtung einzustellen,
    * sind die Attribute VERTICAL, HORIZONTAL, TOP_DIAGOBAL und BOTTOM_DIAGONAL zu verwenden.
    */
   public GradientPanel(Color startColor, Color endColor, int gradientType) {
      super();
      this.setGradientColors(startColor, endColor);
      this.setGradientType(gradientType);
   }
   
   /**
    * @see javax.swing.JPanel
    */
   public void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2d = (Graphics2D)g;
      switch(gradientType) {
         case GradientPanel.VERTICAL:
            g2d.setPaint(new GradientPaint(0, 0, startColor, 0, getHeight(), endColor, true));
            break;
         
         case GradientPanel.HORIZONTAL:
            g2d.setPaint(new GradientPaint(0, 0, startColor, getWidth(), 0, endColor, true));
            break;
         
         case GradientPanel.TOP_DIAGONAL:
            g2d.setPaint(new GradientPaint(0, 0, startColor, getWidth(), getHeight(), endColor, true));
            break;
            
         case GradientPanel.BOTTOM_DIAGONAL:
            g2d.setPaint(new GradientPaint(0, getHeight(), startColor, getWidth(), 0, endColor, true));            
      }
      g2d.fill(new Rectangle(getWidth(), getHeight()));
   }
   
   /**
    * Setzt zur Laufzeit die Richtung des Farbverlaufes.
    * @param gradientType die Richtung des Farbverlaufes.
    * Bsp.: panel.setGradient(GradientPanel.VERTCAL);
    */
   public void setGradientType(int gradientType) {
      this.gradientType = gradientType;
   }

   /**
    * Setzt zur Laufzeit die Start- und Endfarbe für einen Farbverlauf.
    * @param startColor Die Farbe, mit der der Farbverlauf beginnen soll.
    * @param endColor Die Farbe, mir der der Farbverlauf enden soll.
    */
   public void setGradientColors(Color startColor, Color endColor) {
      this.startColor = startColor;
      this.endColor = endColor;
   }   
   
}```

Das sollte dir helfen :wink:
Toolkit.getDefaultToolkit().setDynamicLayout(true);

In Windows gibt’s eine Performanceeinstellung, mit der man das DynamicLayout auch wieder abschalten kann.

Eagle, ich hab deinen Vorschlag noch nicht probiert, weil ich noch etwas hinzufügen möchte:
Auf meiner GUI sind außer diesem Panel noch weitere Komponenten, die aber bereits alle von Haus aus “on the fly” gezeichnet werden. Warum geht das bei denen und bei meinem Panel nicht? Muss deine Zeile nun in den Konstruktor meines Panels?

Ich glaube bei Java 5 ist DynamicLayout standardmässig nicht aktiviert
und bei Java 6 ist es aktiviert. Das muss aber auch gleichzeitig vom Betriebssytem unterstützt sein,
sonst hat es keine Wirkung. Die Einstellung gilt übrigens für alle Container.
Wenn das nur teilweise zu funktionieren scheint, dann muss irgendwas anderes im Spiel sein.
So können wir feststellen, ob DynamicLayout aktiviert ist:

       System.out.println("isDynamicLayoutActive: "+dl);```

Hab das Problem erkannt!
Ich entwickle mit NetBeans. Das scheint beim Ausführen der Anwendung innerhalb der IDE das isDynamicLayoutActive-Flag auf false zu setzen.
Denn als ich mein Panel mal in einem Java-Editor in eine Test-GUI setzte, hat alles wunderbar funktioniert.

Hier mal meine Test-GUI:

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

public class ComponentTest extends JFrame {
   public ComponentTest(String title) {
      super(title);
      System.out.println("isDynamicLayoutActive: "+Toolkit.getDefaultToolkit().isDynamicLayoutActive());
      Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
      setSize((int)dim.width*60/100, (int)dim.height*60/100);
      setLocationRelativeTo(null);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      
      JPanel headerPanel = new GradientPanel(SystemColor.activeCaption, SystemColor.inactiveCaption, GradientPanel.HORIZONTAL);
      headerPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
      JLabel headerTitle = new JLabel("Beschreibung");
      headerTitle.setForeground(SystemColor.info);
      headerPanel.add(headerTitle);
      add(headerPanel, BorderLayout.NORTH);
      
      JPanel btnPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
      JButton okBtn = new JButton("OK");
      btnPanel.add(okBtn);
      
      JButton cancelBtn = new JButton("Abbrechen");
      btnPanel.add(cancelBtn);
      
      add(btnPanel, BorderLayout.SOUTH);
   }

   public static void main(String[] args) {
      try {
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
      }
      catch(Exception e) {
         e.printStackTrace();
      }
      new ComponentTest("ComponentTest").setVisible(true);
   }
}```

Jedenfalls danke für eure Hilfe. :)