Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Aus einem Runnable-thread auf einen JFrame zugreifen
wahrscheinlich ein banaler Anfängerfehler eines alten Prozeduralisten. Ich benötige mal einen Tipp in die richtige Richtung:
Ich habe mir für den Anfang ein simples Swing-Programm gebaut. 2 JButtos, 1 JList und ein JTextPane. Das ganze wird in einem JFrame dargestellt. Realisiert in einer Klasse meinFrame. Dazu habe ich mir eine Main-Klasse erstellt, die das Programm initialisiert ( in die JList kommen alle Rechner aus /etc/hosts,...) und MeinFrame startet und darstellt. Soweit so gut.
Für die beiden buttons habe ich auch ActionListener erstellt. Der Eine hat die schlichte Aufgabe einen ausgewählten host aus JList anzupingen und das Resultat in die TextPane zu schreiben. Das ganze sieht im Moment so aus:
Code:
private void pingButtonActionPerformed(java.awt.event.ActionEvent evt) {
String aktHost=(String) jList1.getSelectedValue();
String content=jTextPane1.getText();
content=content+"\n\npinging "+aktHost+"... \n";
jTextPane1.setText(content);
jTextPane1.invalidate();
this.repaint();
content=jTextPane1.getText();
// ==>
// Diesen Bereich in einen thread auslagern:
try{
String ping_str;
Process ping_proc = Runtime.getRuntime().exec("ping -c1 "+aktHost);
// Ausgabe des Befehls lesen...
BufferedReader ping_in = new BufferedReader(new InputStreamReader (
ping_proc.getInputStream()));
try {
while ((ping_str = ping_in.readLine()) != null) {
content="\n"+content+ping_str;
}
} catch (IOException e) {
content=content+"\n"+e;
}
} catch (IOException e1) {System.err.println(e1);}
jTextPane1.setText(content);
jTextPane1.invalidate();
jTextPane1.repaint();
// <==
}
Wie oben zu sehen, würd ich gerne den Teil, der das Mini-Shellscript ausführt in einen eigenen thread packen (per runnable). Soweit so gut. Die Beispiel die ich zu threads finde machen es sich einfach. Sie schreiben in die Konsole.
Wie kann ich von einem separaten thread-Objekt heraus auf TextPane1 zugreifen? Mir gelingt es nicht das Ergebnis des Skriptes dort abzulegen. Vermutlich ein Denkfehler! Habt Ihr nen Tipp für nen Java-Newbie?
ich habe mich gewundert, daß trotz eines threads auf die Ausführung gewartet wurde. Dabei stieß ich auf diese Lösung:
Code:
Pinging ping = new Pinging(jTextPane1,aktHost);
SwingUtilities.invokeLater(ping);
damit wird der thread angestoßen und der Listener trotzdem gleich beendet. Falls das hier nicht richtig ist, möge man mich korrigieren. Tipps eines Newbies sind ja immer mit Vorsicht zu geniessen :wink:
dann hast du wohl keinen Thread gestartet sondern das run() direkt aufgerufen, oder wie ? Und auch bei deiner invokeLater-Lösung wird das run() im AWT-EventThread ausgeführt ... nur eben etwas später.
Wenn Pinging selbst ein Thread ist (also extends Thread), dann machst du
new Pinging(jTextPane1,aktHost).start();
wenn Pinging "nur" Runnable implementiert, dann machst du:
new Thread(new Pinging(jTextPane1,aktHost)).start();