MrRock Geschrieben 9. Oktober 2007 Teilen Geschrieben 9. Oktober 2007 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ksg9-sebastian Geschrieben 15. Oktober 2007 Teilen Geschrieben 15. Oktober 2007 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MrRock Geschrieben 16. Oktober 2007 Autor Teilen Geschrieben 16. Oktober 2007 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!! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ksg9-sebastian Geschrieben 17. Oktober 2007 Teilen Geschrieben 17. Oktober 2007 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MrRock Geschrieben 18. Oktober 2007 Autor Teilen Geschrieben 18. Oktober 2007 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ksg9-sebastian Geschrieben 18. Oktober 2007 Teilen Geschrieben 18. Oktober 2007 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MrRock Geschrieben 18. Oktober 2007 Autor Teilen Geschrieben 18. Oktober 2007 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! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ksg9-sebastian Geschrieben 18. Oktober 2007 Teilen Geschrieben 18. Oktober 2007 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.. } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MrRock Geschrieben 18. Oktober 2007 Autor Teilen Geschrieben 18. Oktober 2007 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ksg9-sebastian Geschrieben 18. Oktober 2007 Teilen Geschrieben 18. Oktober 2007 Dauert bei mir 5.7sec. Du solltest das Docklet erst sichtbar machen wenn alles fertig geladen ist. Sonst gibts nämlich hässliche Exceptions wenn jemand während der Ladezeit auf den Button klickt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MrRock Geschrieben 18. Oktober 2007 Autor Teilen Geschrieben 18. Oktober 2007 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ksg9-sebastian Geschrieben 18. Oktober 2007 Teilen Geschrieben 18. Oktober 2007 Um das hinzubekommen (Ladebalken) benötigst du Multitheading. Schau dir das mal an, da wird eigentlich alles erklärt: java-forum.org - ProgressBars, Algorithmen und Multithreading java-forum.org - Tutorials von Mitgliedern java-forum.org - SplashLoader - LadeBild Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MrRock Geschrieben 18. Oktober 2007 Autor Teilen Geschrieben 18. Oktober 2007 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ß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.