| 

.NET C# Java Javascript Exception

2
Hallo zusammen,

in Sachen Java bin ich nun einmal keine Leuchte (bin erst am Lernen), die Frage wird für Einige wahrscheinlich eher kinderleicht aussehen. Folgende Situation: ich habe in Eclipse mit dem SWT-Plugin eine Applikation erstellt. Durch Klick auf einen Button wird eine Routine gestartet, die einige Minuten läuft, deshalb möchte ich im Fenster über eine Progressbar den Status anzeigen. Solange man nichts macht, funktioniert das auch wunderbar, packt man das Fenster mit der Maus an, kommt das obligatorische "Keine Rückmeldung". Bisheriger Aufruf (nur Ausschnitt):

clsLoadTab c=new clsLoadTab(display,progressBar,shlApp,text,con,combo.getText(),f);
c.run();

Diese Arbeitsklasse instanziiert selbst auch Klassen. Nun wollte ich die Klasse im eigenen Thread laufen lassen und habe obigen Code in einen Thread verpackt:

clsLoadTab c=new clsLoadTab(display,progressBar,shlApp,text,con,combo.getText(),f);
Thread x=new Thread(c);
x.start();
while (x.isAlive())
{
try
{
Thread.sleep(200);
shlApp.redraw();
shlApp.update();
}
catch (InterruptedException ie)
{
}
}

Er bleibt mir nun im Step-by-Step an genau der gezeigten Stelle hängen mit dem Fehler "Class not found":

public class clsLoadTab extends Thread
{
public void run()
{
NamedParameterStatement p = new NamedParameterStatement(con, qry);

Lässt man das Ganze dann weiter laufen (F8), kommt es zu
"Exception in thread "Thread-1" org.eclipse.swt.SWTException: Invalid thread access"

(Noch ein Hinweis: die Klasse NamedParameterStatement findet man auf der Seite http://www.javaworld.com/article/2077706/core-java/named-parameters-for-preparedstatement.html)

Irgendwo stelle ich mich wohl zu doof an... any hints?
05.11.2014
muffi 1,4k 1 9
So, ich habe zwischenzeitlich meinen Fehler gefunden. Ich hatte blöderweise bei einem Steuerelement vergessen, es mit display.asyncExec(new Runnable()... zu verpacken.
muffi 06.11.2014
Einfacher geht es wenn du ein RCP Client baust mit Eclipse, da geht das mit einem Job im Hintergrund und du hast ein gutes Framework zum Arbeiten. Such mal auf http://www.vogella.com/tutorials/EclipseJobs/article.html
Lord_Pinhead 07.11.2014
Über die Vogella-Seiten bin ich schon öfters gestolpert. Sind nette Tutorials. Als Java-Nicht-Profi bin ich da aber schnell am Rätseln... :-)
muffi 10.11.2014
1 Antwort
0
Ich bin zwar kein ausgesprochener Java-Spezialist, aber ich glaube mich zu erinnern, dass Java Threads ähnlich behandelt wie Android. Damit ist es nicht so einfach möglich aus einem Hintergrundthread den GUI-Thread im Vordergrund zu aktualisieren.
Ich habe für einen Fortschritsdialog folgendes Beispiel gefunden:

package com.tutego.insel.ui.swing;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JProgressBarDemo
{
static JProgressBar bar = new JProgressBar( 0, 1000000 );

static class ButtonActionListener implements ActionListener
{
@Override public void actionPerformed( ActionEvent e )
{
new Thread( new Runnable()
{
@Override public void run()
{
for ( int i = 1; i <= bar.getMaximum(); ++i )
{
final int j = i;

SwingUtilities.invokeLater( new Runnable()
{
@Override public void run() {
bar.setValue( j );
}
} );
}
}
} ).start();
}
}

public static void main( String[] args )
{
JFrame f = new JFrame();
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

JButton but = new JButton( "Start zählen" );
but.addActionListener( new ButtonActionListener() );

bar.setStringPainted( true );

f.add( bar, BorderLayout.PAGE_START );
f.add( but, BorderLayout.PAGE_END );

f.pack();
f.setVisible( true );
}
}


Wichtig scheint mir das innere InvokeLater() zu sein, das den GUI-Thread aktualisiert.
Vielleicht hilft dies ja weiter.
05.11.2014
edvservice 1,4k 1 6
OK, ich nutze SWT statt Swing. Ich werde mal sehen, ob ich das ähnlich hinbekomme.
muffi 05.11.2014
Das wäre auch meine Vermutung. Egal ob Swing, SWT, Windows Forms, WPF oder Android: UI-Elemente dürfen nur aus dem Thread heraus geändert werden, in dem sie erzeugt wurden (meistens ist das nur einer).
Matthias Hlawatsch 07.11.2014

Stelle deine Java-Frage jetzt!