JFrame beim Vergrößern schwarz

Hey.

Ich habe in meiner GUI mal wieder einen Bug gefunden, der aber anscheinend für alle SWING-GUIs gilt. Und zwar wird der zu vergrößernde Teil des Fensters immer schwarz und erst nach ca ner Sekunde wird der BEreich gefüllt bzw die Komponenten neu angeordnet. Hab dazu auch in GOogle nen Thread gefunden:

Der Thread ist von 2011 und dort geschieht das selbe Problem. Ich hab in der ComponentResized-Methode vom ComponentListener auch mal repaint(); reingeschrieben, ändert aber nix. Auch nen MouseMotion-Listener an das JFrame anhängen und die Mouse-Dragged Methode zu überschreiben bringt nix, da die Methode nie aufgerufen wird. Gibts also inzwischen ne Lösung dafür, oder wird das wahrscheinlich ewig ein Problem mit Swing sein?

bis jetzt hattest du nie ein Fenster in der Größe verändert, oder das Problem fiel dir nie auf?

testest du noch ‘in deiner GUI’ wo womöglich doch Besonderheiten, falsche Verwendung das aktuelle Problem sein könnten,
oder tritt das bei dir auch in simpelsten Tests, etwa

    {
        new JFrame().setVisible(true);
    }
  • größer ziehen auf?
    nun, bei mir und wohl 99.999% der Welt nicht, sonst gäbe es ja eine Schwemme von Beschwerden und sofort eine Lösung, Swing unbenutzbar

aber kann ja trotzdem bei dir so sein, was immer an Hardware, Treiber, Betriebssystem, Libraries, Einstellungen, Java-Version, die Ursache ist…

War bei mir eig schon immer so, hab dem nur keine Beachtung geschenkt. In dem verlinkten Thread steht ja auch das das mit ATI-Grafikkarten zusammenhängen könnte, die ich besitze inklusive Windows 10.

In dem kurzen Beispiel ist es nicht so extrem, wie in meiner GUI, aber auch noch vorhanden. Es braucht nur keine ganze Sekunde zum aktualisieren, sondern etwas weniger. Dazu kommt es dazu auch nicht, wenn ich das Fenster langsam vergrößer, umso schneller ich es tue, umso öfter kommt es.

Edit: Hab ne Mögliche Ursache gefunden: Während es bei nem einfachen new JFrame().setVisible(true); nur sehr wenig bis gar nciht vorkommt, verschlimmert es sich je mehr Komponenten vorhanden sind. Hab zu Test nur eine JTable, eine progressbar und 4 Buttons hinzugefügt, nicht mehr. Dann tritt das Problem schon sehr merklich auf.

weil mehr gezeichnet werden muss?

Das mir klar, aber das war ja auch die Ausgangsfrage, ob man was dagegen tun kann? Das es eben nciht mehr, oder nicht sichtbar schwarz wird?

für deinen Fall anscheinend ohne paint-Anteile nicht direkt passend, aber mag Anregungen enthalten:
java - JPanel Black screen because of componentResize and long repaint command - Stack Overflow

wie verhält sich denn das angegebene Programm, ohne allzu lange Schleife in BufferGeneratorWorker oder diesen Timer ganz ausgeschaltet, bei dir?
Test-Ausgaben mit Zeit in invalidate, paintComponent, evtl. doch wieder ComponentListener usw. zeigen eine größere Lücke?

edit:
zur Analyse vielleicht einen Thread nebenher laufen lassen der alle 10ms die Threads des Programms durchgeht und deren Beschäftigung aufdeckt,
insbesondere die vom AWT-Thread der ja zeichnen soll,
aber viel kommt da kaum raus mit einfachen Mitteln, entweder er arbeitet, dann nix zu machen, oder ist frei und macht nix, dann kaum zu erklären/ gar zu ändern

bräuchte doch schon wenn überhaupt geheime Zauberbefehle, das Verhalten umzustellen…

Ich kann das Problem auch nicht nachvollziehen. Tritt das Problem bei sowas…

import java.awt.GridLayout;
import java.awt.Toolkit;

import javax.swing.JButton;
import javax.swing.JFrame;


public class FrameTest
{
    public static void main(String[] args)
    {
        //System.setProperty("sun.awt.noerasebackground", "true");
        //Toolkit.getDefaultToolkit().setDynamicLayout(false);
        
        JFrame f = new JFrame("Suddenly: Buttons!");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        int n = 20;
        f.getContentPane().setLayout(new GridLayout(n, n));
        for (int i=0; i<n; i++)
        {
            for (int j=0; j<n; j++)
            {
                f.add(new JButton("B "+i+","+j));
            }
        }
        f.pack();
        f.setVisible(true);
    }
}

schon auf?

@Marco13 : Ja, das tut es

OK, interessant - eine konkrete Abhilfe wüßte ich aber nicht. Man könnte mit den https://docs.oracle.com/javase/8/docs/technotes/guides/2d/flags.html rumspielen, oder wirklich mal die jVisualVM nebenher laufen lassen, und schauen, ob man rausfindet, was er in dieser “Sekunde” genau macht…

-.- bei 400 Buttons würde ich mich auch stäuben. Dazu kommt auch noch das es auf das L&F ankommt, sprich wieviel zu zeichnen ist (schreckliches langsames L&F - FreeCol - Home). Eine einfache Simplebox ist effizienter als ein schöner Farbverlauf mit runden Kanten. Dazu würde ich auch noch darauf tippen das der Layouter an der Stelle noch dauernd gefragt wird.

vermutlich alles auf eine seperate Bitmap malen und dann nach vorne holen