Hallo,
ich möchte eine Statusmeldung in einem Extra-Fenster für ein paar Sekunden anzeigen und automatisch wieder schliessen. Dabei sollte das Hauptfenster während dieser Zeit bedienbar bleiben. Ich weiss dass dies mit einem neuen Thread gelöst werden muss, doch leider bleibt die Bedienung des Hauptfensters blockiert.
Ich habe schon in vielen Foren gestöbert finde aber nicht die Lösung meines Problems. Sieht jemand meinen Fehler ??
Die Hauptanwendung (auslösen der Statusmeldung durch Enter-Taste):
und hier die Klasse der Statusmeldung:
ich möchte eine Statusmeldung in einem Extra-Fenster für ein paar Sekunden anzeigen und automatisch wieder schliessen. Dabei sollte das Hauptfenster während dieser Zeit bedienbar bleiben. Ich weiss dass dies mit einem neuen Thread gelöst werden muss, doch leider bleibt die Bedienung des Hauptfensters blockiert.
Ich habe schon in vielen Foren gestöbert finde aber nicht die Lösung meines Problems. Sieht jemand meinen Fehler ??
Die Hauptanwendung (auslösen der Statusmeldung durch Enter-Taste):
Code:
package de.test.sandbox;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class RunSmartMessage {
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
Text text1 = new Text(shell, SWT.BORDER);
text1.setText("vorbelegt");
text1.setBounds(50,50,200,20);
text1.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.character == SWT.CR) {
SmartMessage sm = new SmartMessage(shell, "Eine kleine Testmessage", 5000);
sm.printMessageInNewThread();
}
}
});
shell.open();
while(!shell.isDisposed()) {
if(!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
und hier die Klasse der Statusmeldung:
Code:
[LEFT]package de.test.sandbox;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;[/LEFT]
[LEFT]public class SmartMessage {[/LEFT]
[LEFT]private Shell shell;
private String message;
private Long displayTime = 1000L;[/LEFT]
[LEFT]public SmartMessage(Shell parentShell) {
shell = new Shell(parentShell, SWT.NO_TRIM | SWT.ON_TOP);
}[/LEFT]
[LEFT]public SmartMessage(Shell parentShell, String displaymessage) {
this(parentShell);
this.message = displaymessage;
}[/LEFT]
[LEFT]public SmartMessage(Shell parentShell, String displaymessage, int displaytime) {
this(parentShell, displaymessage);
this.displayTime = (long)displaytime;
}[/LEFT]
[LEFT]public void printMessage() {
int textSize = message.length() * 7;
shell.setLocation(800,200);[/LEFT]
[LEFT]// Colors
shell.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_RED));
shell.setForeground(shell.getDisplay().getSystemColor(SWT.COLOR_WHITE));[/LEFT]
[LEFT]// Font-Definition
Font myFont = shell.getFont();
FontData[] fontdata = myFont.getFontData();
fontdata[0].setHeight(10);
fontdata[0].setStyle(SWT.BOLD);[/LEFT]
[LEFT]shell.setFont(new Font(Display.getCurrent(), fontdata[0]));
shell.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
final PaintEvent pe = e;
Point occupiedTextSize = e.gc.textExtent(message);
shell.setSize(occupiedTextSize.x+10, occupiedTextSize.y);
pe.gc.drawString(message, 5, 0, true);
System.out.println("Paint");
}
});
shell.open();
try {
Thread.sleep(displayTime);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
shell.close();[/LEFT]
[LEFT]}
public void printMessageInNewThread() {
new Thread() {
public void run() {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
printMessage();
}
});
}
}.start();
}[/LEFT]
[LEFT]}[/LEFT]
Zuletzt bearbeitet von einem Moderator: