# eigener Thread für einen JButton



## PollerJava (8. Okt 2007)

Hallo,

Ich habe eine JToolBar und auf dieser JToolBar befindet sich ein JButton;


```
private JToolBar btPanel; 

 btTree.setFocusable(false);
        btTree.setMaximumSize(new Dimension(22, 120));
        btTree.setBackground(new Color(230, 230, 230));
        btTree.setForeground(new Color(100, 100, 100));       
        btTree.setIcon(graphicIcon);                  
        btTree.setEnabled(false);        
        btPanel.add(btTree);
        btPanel.addSeparator();
        btTree.addMouseListener(this);
```

Wenn ich jetzt über diesen Button btTree fahre, klappt sich ein JPanel aus, 

Wenn sich jetzt einiges in meiner Applikation tut, dann braucht es etwas länger, bis das JPanel "ausfährt", wenn ich mit der Maus über den JButton btTree fahre,

Meine Frage wäre jetzt, was ich da machen kann bzw. wie ich das Ganze in einen eigenen thread gebe,

Vielen Dank,

lg


----------



## Wildcard (8. Okt 2007)

GUI Aufgaben darf man nicht in andere Threads auslagern.


----------



## PollerJava (8. Okt 2007)

Kann ich da sonst was machen?

lg


----------



## *Hendrik (8. Okt 2007)

Vielleicht solltest Du das, was sich in der Applikation tut (Berechnungen, Daten holen o.ä.) in einem Thread/SwingWorker machen?


----------



## PollerJava (8. Okt 2007)

Naja da tut sich sehr viel, leichter wäre es für mich, ich könnte das ausklappen des JPanels in einen eigenen Thread geben,

Ich habe ein Objekt von einer Klasse und dieses Objekt benötigt je nachdem sehr viele Resourchen, wie kann ich eine ganze Klasse (Objekt) in einen eigenen Thread stecken,

lg


----------



## *Hendrik (8. Okt 2007)

Indem Du das Interface Runnable implementierst!?


----------



## PollerJava (8. Okt 2007)

ja, dann habe ich die run()- Methode in der Klasse und was mche ich mit den anderen Methoden in der Klasse,

Die Methoden meiner Klasse werden von einem anderen Objekt aufgerufen,

Steh a bissl auf dem Schlauch,

lg


----------



## Wildcard (8. Okt 2007)

Wenn du das auslagerst ist das Verhalten deiner Applikation unbestimmt. Alles was die GUI verändert muss im EDT stattfinden. Wenn ein anderer Thread die GUI verändert, muss das über die SwingUtilities in den EDT verschoben werden.


----------



## PollerJava (8. Okt 2007)

Oje, was soll ich jetzt machen ?


----------



## *Hendrik (8. Okt 2007)

Tja, normalerweise sollte man sowas mit SwingWorker lösen (können).


----------



## HLX (8. Okt 2007)

@PollerJava: recherchieren, z.B. in der API! Gib die genannten Schlagworte mal bei Google ein und du findest ne Menge Infos.




			
				*Hendrik hat gesagt.:
			
		

> Tja, normalerweise sollte man sowas mit SwingWorker lösen (können).


Wenn man denn Java 6 verwendet.


----------



## PollerJava (8. Okt 2007)

Nö ich kappiers nicht,

Ich mache mir eine Klasse, in der drinnensteht, was im Hintergrund/in einem eigenen Thread zu machen ist also in meinem Fall, dass sich ein JPanel aufmacht, wenn ich über eine JButton fahre, 
Ich weiß aber überhaupt nicht wie ich das machen soll,
Momentan habe ich in meiner Klasse den den MouseListener implementiert und in der Methode mouseEntered wird das JPanel ausgefahren:


```
public class JTreeFrame extends javax.swing.JFrame implements MouseListener, MouseMotionListener
{

...

public void mouseEntered(final MouseEvent e) 
        {
        Object source = e.getSource();
        if(source == btTree) {
            s.setVisible(true);
            s.setBounds(28, 0, Control.getStatesElementAt(0).getJtreewidth(), getSize().height-30);
            validate();
            }
        }

}
```

Kann ich das irgendwie einfach umändern?

Vielen Dank für die Antworten


----------



## HLX (8. Okt 2007)

PollerJava hat gesagt.:
			
		

> Wenn sich jetzt einiges in meiner Applikation tut, dann braucht es etwas länger, bis das JPanel "ausfährt"



Was tut sich denn in deiner Applikation? Vielleicht kann man ja das (falls es swing-fremd ist) in einen eigenen Thread auslagern.


----------



## thE_29 (8. Okt 2007)

Ich kann die von AlArenal mal gezeigte foxtrot API verweisen!
Die ist ein Hammer und von den return Werten besser als SwingWorker!

Einfach mal im Board oder google suchen


----------



## PollerJava (8. Okt 2007)

Ich habe einen JFreeChart, auf dem sehr viele Daten oben sind, die Kurven ab JFreeChart ändern sich nicht aber trotzdem braucht das JPanel sehr lange bis es ausfährt bzw. bis es neu gezeichnet wird, deshalb möchte ich das Ganze entkoppeln

http://www.java-forum.org/de/userfiles/user9898/visu.png


----------



## Wildcard (8. Okt 2007)

Wenn es nicht um Berechnung von Daten oder IO Operationen geht, dann ist da werder mit SwingWorker, noch Foxtrott, noch sonstwas etwas zu ändern. GUI Operationen *nur* im EDT.


----------



## thE_29 (8. Okt 2007)

Jo, GUI Dinger gehören schon im EDT!
Aber wennst halt intensive Rechenoperationen machen willst kannst halt Threads, SwingWorker oder foxtrot nutzen (außer wenn man bei JLabel´s den Text ändert, das Teil ist Threadsafe )


----------



## PollerJava (8. Okt 2007)

Könnt ihr euch das erklären, dass ich auf meinem JFreeChart ein paar Linien plaziere und dann fährt mir das JPanel von der JToolBar (wenn ihc über den JButton fahre) viel langsamer aus als wenn ich keine Linien auf dem JFreeChart habe,

Ich hätte ja gesagt, wenn ich am JFreeChart nichts mache (aufend aktualisieren usw. ) dann sollte das für das Ausfahren des JPanels keinen unterschied machen, oder sehe ich da was falsch?

lg


----------



## Marco13 (8. Okt 2007)

Ja, Swing-Operationen nur im EDT, aber trotzdem kann man das, was er vorhat, doch in einem eigenen Thread machen, wenn die entscheidene Operation dannn wieder in den EDT geschedult wird...

```
void fahrDasPanelAus()
{
    Thread t = new Thread(new Runnable())
    {
        public void run()
        {
            for (int i=0; i<panelSize; i++)
            {
                SwingUtilities.invokeLater(new Runnable()
                {
                    public void run()
                    {
                         panel.setSize(100, i);
                    }
                }
                try { Thread.sleep(20); } catch (InterruptedException e) {}
            }
        }
    }
    t.start();
}
```


----------



## Marco13 (8. Okt 2007)

@PollerJava: Das Ausfahren ist vermutlich deswegen so langsam, weil bei jedem Ausfahr-Schritt neu gezeichnet werden muss. Und wenn es daran nicht liegt, dann vielleicht daran, dass bei jedem Schritt das Layout aktualisiert wird. Man könnte was rum-hacken, z.B. den Fertigen chart in ein BufferedImage malen, und nur DAS dann "animieren", aber ... hm  :?


----------



## HLX (8. Okt 2007)

Marco13 hat gesagt.:
			
		

> Ja, Swing-Operationen nur im EDT, aber trotzdem kann man das, was er vorhat, doch in einem eigenen Thread machen, wenn die entscheidene Operation dannn wieder in den EDT geschedult wird...
> 
> ```
> void fahrDasPanelAus()
> ...



Das geht schon. Ist die Frage ob man damit was erreicht. Ich würd´s dann eher mal mit "invokeAndWait" probieren.


----------



## tuxedo (8. Okt 2007)

Oder nen schnelleren Rechner nehmen ;-)

Was für ne Kiste ist es denn?

- Alex


----------



## PollerJava (9. Okt 2007)

HP, 1.86GHz, 1GB Ram, also nicht der Beste aber auch nicht s langsam, 

Ich entwickle ja für Kunden, welche sicher einen langsameren Rechner haben und daher ist es ganz gut, wenn ich da auf meinem Rechner ein bischen optimiere,

lg


----------



## PollerJava (9. Okt 2007)

Also das Ausfahren des JPanels in einen eigenen Thread geben, hilft nichts, da blockiert das Programm irgendwo anders,


----------



## tuxedo (9. Okt 2007)

Du solltest das ganze logisch angehen. Allem anschein nach ist dein Chart die "langsame" Komponente. Weißt du ob JFreeChart denn 2D Beschleunigung nutzt? Kann/muss man das vielleicht erst einschalten? Was ist mit Anti-Aliasing?

Generell:

Wenn du zwei Komponenten hast, A und B, und eine der beiden so langsam ist, dass sie die andere ausbremst, solltest du der bremsenden Komponente vielleicht ein niedrigere Priorität geben, damit der Rest schneller/unabhängig läuft.

Den "Rest" in einen gleichberechtigten Thread stecken macht's doch nicht besser?

- Alex


----------



## PollerJava (9. Okt 2007)

alex0801 hat gesagt.:
			
		

> Weißt du ob JFreeChart denn 2D Beschleunigung nutzt? Kann/muss man das vielleicht erst einschalten? Was ist mit Anti-Aliasing?
> 
> niedrigere Priorität geben, damit der Rest schneller/unabhängig läuft.
> 
> - Alex



Also von 2D Beshcleuningung habe ich im Zusammenhang mit dem JaFreeChart noch nie etwas gehört, weißt du da ein Stichwort dazu oder weißt Du wie man das einschaltet?

Von Anti- Alising im Zusammenhang mit dem JFreechart habe ich auch noch nie etwas gehört,
Und wie geben ich dem ausklappen des JPanels eine höhere Prior?

Fragen über Fragen???

vielen Dank für Eure Antw.

lg


----------



## tuxedo (9. Okt 2007)

Du hast's noch nicht begriffen... Du solltest nicht dem ausklappenden Button eine höhere Priorität geben. Bsp:

Prio 1 wird schneller bearbeitet als Prio 10.

Angenommen alle deine Threads (auch die in Swing und Co.) haben Prio 5. Und jetzt gibst du deinem Button Prio 1.. Was passiert? Dein Button reagiert jetzt zwar viel schneller, aber der rest der Anwendung kriecht noch zusammen mit dem JFreeChart "hinterher". 

Entkoppelst du jetzt das langsame "vom Rest", so müsstest du lediglich dein JFreeChart eine langsamere Priorität (>5) geben. Somit hätte alles andere "vorrang". 

Du solltest mal versuchen wie weiter oben von den anderen schon geschrieben, dein JFreeChart und das damit zusammenhängende "zeichnen der Kurven/Diagramme" in einen extra Thread auszulagern. 

Zur Thread-Priorität: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#setPriority(int)

Bzgl. 2D Beschleunigung: Soweit ich das jetzz in Erfahrung gebracht habe nutzt JFreeChart schon Java 2D (und das ist auch dein Stichwort: Java 2D). Die Sache mit Anti-Alliasing (kantenglättung): Klar dass du davon noch nix gehört hast. Kommt ja nicht jeden Tag einer auf dich zu und sagt: Hey, hast du schon die Sache mit AA in Bezug auf JFreeChart mitbekommen? Musst du schon selbst Nachschlagen. Wenn in der JFreeChart Doku nix erwähnt ist hast du entweder Pech, oder du musst selbst Hand anlegen ;-)

Fragen über Fragen? Ne, eigentlich nicht, sofern man gegen 09:30 schon wach genug ist um sein Hirn anzustrengen ;-)

Gruß Alex


----------



## PollerJava (9. Okt 2007)

alex0801 hat gesagt.:
			
		

> Fragen über Fragen? Ne, eigentlich nicht, sofern man gegen 09:30 schon wach genug ist um sein Hirn anzustrengen ;-)
> 
> Gruß Alex




Wach genug!??? habe leider keine Gleitzeit, was ich persönlich ja eines der größten Undinge finde bei einer kreativen Arbeit wie dem Programmieren, das heißt, dass ich jeden Tag gut drauf sein muss in der Arbeitszeit!!! Ich mutiere eh gerade vom Menschen zur Maschine,


----------



## Guest (9. Okt 2007)

Oh man, mir kommen gleich die Tränen. Wie unmenschlich doch das böse böse System der bösen bösen Kapitalisten in Deutschland ist oder? Du solltest echt aufwachen :lol: 

Diese unmenschliche Tierhaltung ist mehr als normal und wie ich finde auch nicht so ungerechtfertigt. Irgentwann muss man mal wach werden und arbeiten. Angenommen du würdest von 14 bis 15 Uhr arbeiten, dann wärest du irgentwann um 14 Uhr so müde wie jetzt um 8 

Und ob programmieren tatsächlich sooo eine kreative Arbeit ist, wenn man bei den kleinsten Problemen sich dem Internet bedient (was ja garnicht unbedingt verwerflich ist), ist fraglich. Dafür wurde der Begriff hacken eingeführt  Heutzutage muss man sich, was Java angeht, nurnoch Schnipsel zusammensuchen, anwenden und verbinden. Das ist wie puzzlen. Findest du nicht?


----------



## tuxedo (9. Okt 2007)

Tolle Wurst. Ich hab Gleitzeit... Und was hab ich davon? Ich muss dennoch um 06:00 aufstehen damit ich rechtzeitig zur Regulärzeit im Büro bin. Ist also nicht wirklich ne "Ausrede" ;-)


----------



## PollerJava (9. Okt 2007)

Sollte keine Ausrede sein, nur ich steh um 5 auf und arbeite bis 20 uhr und studiere am we noch, und das seit 3 Jahren, dann noch Freundin usw,
Da würd ich mir halt wünschen, das Ganze etwas flexibler einteilen zu können, aber ich nimms eh wies kommt,

lg

(Tränen sind überFLÜSSIG)


----------



## Guest (9. Okt 2007)

Wobei wohl die Freundin das anstengendste ist :lol:


----------



## PollerJava (9. Okt 2007)

:applaus: genau, aber das gehört nicht hier her


----------

