Zum Inhalt springen

JWindow.setVisible(true) dauert ewig


Empfohlene Beiträge

Geschrieben

Moin,

also folgendes Problem:

Ich habe eine Anwendung(JWindow), die ,wenn man auf einen Button drückt, ein JDialog öffnet. Dieser JDialog hat rel viele JTabbedPanes mit vielen Componenten. Dann wird eine Konfigurationsdatei eingelesen und alle Componenten mit den Daten gefüllt. Die meisten Componenten sind globale Variablen

Bis der JDialog erscheint können schon mal 5 Sekunden vergehen. Das ist nicht akzeptabel!

Ich könnte den JDialog befüllen, während das Programm läuft und dann nur noch sichtbar machen. Will ich aber nicht unbedingt! Ich will verstehen warum das so lange dauert und was ich benutzen sollte um dies zu beschleunigen!?

Ich habe nun vorerst ein JWindow gemacht, das den Ladestatus anzeigen soll. Aber das wird garnicht erst sichtbar gemacht(das Fenster ansich schon, aber nicht die Komponenten, das JLabel etc..), bzw. erst wenn alles (JDialog) angezeigt wird.

Irgendwie wird die Anzeige der Komponenten(Lade-JWindow) geblockt bis alle Komponenten des JDialog initialisiert wurden.

Habe ich JAVA noch nicht verstanden? ich dachte die Methoden werden abgearbeitet kehren zurück und es geht mit der nächsten weiter.

Wäre für jden Tip dankbar!!

Gruß MrRock

Geschrieben

Zeig mal den Code.

So wie ich das sehe liegt es daran dass zuerst sämtliche Daten geladen werden.

Z.B. so:

der "Dialog"


class X extends JDialog(){

  public X(){

     // jetzt werden sehr viele Daten geladen

  }

}

die "startklasse" welche auf buttonklick den dialog aufruft

public Main{

   public void buttonGedrueckt(){

      X x = new X();

      x.setVisible(true);

   }

}

Problem ist hier dass in der Zeile "X x = new X()"; so lange gewartet wird bis sämtliche Daten geladen sind.

Gibt mehrere Möglichkeiten,

- Dialog erzeugen ohne Daten zu laden

- Dialog anzeigen

- dialog.ladeGanzVieleDaten() aufrufen

Somit ist dein Dialog sichtbar und die Daten werden danach geladen.

Andere Möglichkeit ist über Multithreading:

- Dialog erzeugen

- Thread erzeugen welcher die Daten lädt

- im Dialog die Daten anzeigen

Gruß Sebastian

Geschrieben

Danke für die Antwort!

Das Problem liegt daran, daß das Erzeugen des Dialogs die ganze Gui blockiert.

Das Daten lesen ist schnell gemacht, aber die ganzen Panels und Tabs und Labels benötigen viel Zeit.

Ansonsten ist dein Code-Beispiel gut getroffen.

Ich habe es nun als Hintergrund-Job beim Laden des Programms realisiert. Ist aber noch nicht so gut, darum werde ich das Erzeugen des Diaolgs in einen WorkerThread auslagern.

Danke vielmals für die Vorschläge!

THREAD KANN GESCHLOSSEN WERDEN!!

Geschrieben

Ok, ich weiß zwar nicht was du da tust, aber ne GUI die so viel Zeit zum laden benötigt hab ich in meinem Leben noch nicht gesehen.

Schau dir mal Eclipse an. Ohne Projekte im Workspace ist das Ding höllisch schnell. Swinganwendungen sind ähnlich schnell..aber gut, wenn du zufrieden bist.

Geschrieben

Nein zufrieden bin ich natürlich nicht!

Also Eclipse benutze ich schon seit über 4 Jahren, kenne mich also rel. gut aus. Ich versteh es ja auch nicht. Ich denke mir fehlen einfach die Erfahrungen was Performance und richtiger Programmierstiel unter Java angeht. Wie z. B. Schachtel niemals JScrollPane, keine TitledBorder etc. Ich denke ich benutze die Member und die einzelnen Components falsch.

Mein Programm ist so klein das ich bestimmte Sachen nicht einhalte (z.B. MVC, GUI und Action-Trennung)

Wenn ich dir mein Programm schicke wirst Du sicher die Hände über dem Kopf zusammenschlagen!

Wenn Du magst und Zeit hast kann ich dier die Source des Dialogs schicken!?

PS: Mein Eclipse braucht zum starten auch zw. 20-30 Sekunden. Aber das liegt wohl am Laptop!?

Gruß Marcus

Geschrieben

Hi,

kopier doch mal deinen Sourcecode hier rein, dann betreiben wir Performanceoptimierung. :)

** edit **

Ein absolut vollgemülltest Eclipse (Eclipse 3.3 Enterprise Edition) mit ca. 25 weiteren Plugins benötigt bei mir 15sec bis es geöffnet ist.

Kannst ja mal verschiedene Parameter versuchen. So rennts bei mir ziemlich schnell:

-vmargs -Xms512M -Xmx1024M -XX:MaxPermSize=256m -XX:NewSize=20m -XX:+UseConcMarkSweepGC

Gruß Sebastian

Geschrieben

Also mein Source ist höllisch lang (wie gesagt alles in einer .java, ohne Trennenungen)

Ich geb dir mal den Link zu meinen Sourcen. Den Dialog findest du unter de.fuhrmeister.browserchooser.OptionsDialog

SourceCode

Danke für dein Angebot...wird gern angenommen!

Geschrieben

Wow :)

Also bei mir benötigt das Teil nichtmal ne Sekunde bis es geladen ist.

Wie lang dauert das bei dir?

Zu dem Code im Allgemeinen:

Du hast ziemlich viele Tabs für verschiedene Brower (IE, Firefox, Safari...).

Jedes Tab enthält die gleichen Controls (Checkbox, Executable u.s.w.).

Anstatt für jedes Tab eine eigene Instanzvariable anzulegen solltest du den Code aufteilen.

D.h. eine Methode welche dir so ein Tab erzeugt.

Diese Methode so parametrisieren dass du sie 7x aufrufst mit entsprechenden Params. und dann hast du deine Tabs.

Z.B.


private void createTab(String title, String cmd){

  // Tab erzeugen

  JCheckBox chk = new JCheckBox(title);

  chk.setActionCommand(cmd);


  // Checkbox zum Tab hinzufügen


  // sämtliche weiteren Controls hinzufügen

  // Listener für die Controls hinzufügen (nur 1 Listener für ALLE Tabs).

}


// dann noch die Listener

class CheckboxListener implements ActionListener{

   public void actionPerformed(ActionEvent e){

      // hier dann unterscheiden welches ActionCommand ankommt 

      //und entsprechende Methoden aufrufen

      // z.B. kannst du in einer Map als Key den ActionCommand und als Value 

      // eine Implementierung eines eigenen Interfaces machen.

      // z.B.

      BrowserAction action = (BrowserAction)getActionForCommand(e.getActionCommand());

     if(action != null){

        action.work(e.getSource());

     }

   }

}


private BrowserAction getActionForCommand(String cmd){

   if(!actionMap.containsKey(cmd)){

      return null;

  }

  return (BrowserAction)actionMap.get(cmd);

}


private Map actionMap;

// so könnte der Konstruktor aussehen:

public OptionDialog(){

   actionMap = new HashMap();

   actionMap.put("actionSelectExecutable", new SelectExecutableBrowserAction());

}


interface BrowserAction(){

   public void work(JComponent source);

}


class SelectExecutableBrowserAction implements BrowserAction{

   public void work(JComponent comp){

      // comp in die richtige Komponente casten und irgendwas damit tun..

   }

} 

Geschrieben

Wow, danke für den Hinweis über die Action-Map mit dem Interface.

Also das geht daher so schnell weil ich den Dialog schon beim Aufruf von BrowserChooser erstelle. Wie gesagt ich habs schon geändert.

Wie lange dauert es denn bei dir bis das Docklet(BrowserChooser) geladen wird und sichtbar wird?

Geschrieben

Siehst Du! Das dauert doch viel zu lange oder? Ok, kommt wahrscheinlich auch auf die Priorität der Laufzeitumgebung an!?

setVisible(true) war falsch platziert, hast Du recht!

Hast Du eine Ahnung warum mein vorheriger Versuch mit dem Lade-JWindow nicht funktioniert hat.

Ich wollte das Laden des JDialog in einem extra JWindow anzeigen. Das JWindow hab ich im Konstruktor des JDialog erstellt, dann den JDialog erstellt und mit Daten gefüllt und dann das JWindow entfernt.

Es wurde aber nur eine weiße Fläche in der Größe des JWindow angezeigt. Das Erstellen des JDialogs hat also das Erstellen des JWindow geblockt, obwohl die Methode erst nach der der jLoadWindowAnzeigen()-Methode steht.

Werden die Methoden nicht nacheinander abgearbeitet?

Geschrieben

Danke dort hat man mir auch schon ein paar hinweise zum EDT gegeben, wie und wann Oberflächen gezeichnet werden.

Danke Dir erstmal!

Wenn du noch Performance hinweise hast auch generell...dann bitte! Höre gern zu!

Gruß

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...