Guten Tag,
nach langer Zeit des "normalen" Java programmierens, mit den native Librarys von Sun, habe ich mich entschlossen eine Anwendung mit SWT / JFace zu schreiben.
Nachdem ich mich etwas in SWT eingelesen und rumprobiert hatte, hab ich versucht das ganze mit JFace zu implementieren, da das ja angeblich einfacher sein soll.
Nun zu meinem Problem:
Ich möchte gerne den User mit einem Beenden-Dialog nerven. Also eine Art "Wollen Sie das Programm wirklich beenden?" Ja-Nein Abfrage.
Wenn ich ohne JFace arbeite kann ich das sehr einfach mit einem ShellListener machen:
Durch das ShellEvent mit seinem Attribut "doit" kann ich die Aktion abbrechen.
Arbeite ich jetzt mit einem JFace und überschreibe wie gefordert die Methode "createContents(Composite parent)" und versuche da folgendes zu machen:
Da gibts folgende rote Tapete:
Nicht einmal ein einfaches "e.doit = false;" verhindert das Schließen. Es gibt zwar keinen Fehler, aber das Schließen wird nicht verhindert.
Bei Swing würde ich einfach die Methode "windowClosed(WindowEvent e)" überschreiben und sie meinem JFrame zum fressen geben, aber hier weiß ich echt nicht weiter.
Vielen Dank für jede ernst gemeinte Antwort!
Gruß ryoshi
nach langer Zeit des "normalen" Java programmierens, mit den native Librarys von Sun, habe ich mich entschlossen eine Anwendung mit SWT / JFace zu schreiben.
Nachdem ich mich etwas in SWT eingelesen und rumprobiert hatte, hab ich versucht das ganze mit JFace zu implementieren, da das ja angeblich einfacher sein soll.
Nun zu meinem Problem:
Ich möchte gerne den User mit einem Beenden-Dialog nerven. Also eine Art "Wollen Sie das Programm wirklich beenden?" Ja-Nein Abfrage.
Wenn ich ohne JFace arbeite kann ich das sehr einfach mit einem ShellListener machen:
Code:
final MessageBox messageBox = new MessageBox(shell, SWT.ICON_QUESTION | SWT.YES | SWT.NO);
messageBox.setMessage("Möchten Sie das Programm wirklich schließen?");
messageBox.setText("Frage");
shell.addShellListener(new ShellAdapter()
{
public void shellClosed(ShellEvent arg0)
{
if(messageBox.open() == SWT.NO)
arg0.doit = false;
}
});
Durch das ShellEvent mit seinem Attribut "doit" kann ich die Aktion abbrechen.
Arbeite ich jetzt mit einem JFace und überschreibe wie gefordert die Methode "createContents(Composite parent)" und versuche da folgendes zu machen:
Code:
protected Control createContents(Composite parent)
{
final Shell shell = getShell();
ImageDescriptor programmIcon = ImageDescriptor.createFromFile(Applikation.class, "icons/programm_icon.gif");
shell.setSize(700, 500);
shell.setText("Applikation");
shell.setImage(programmIcon.createImage());
shell.addShellListener(new ShellAdapter()
{
public void shellClosed(ShellEvent e)
{
boolean beenden_Dialog = MessageDialog.openQuestion(shell, "Frage", "Wirklich Beenden?");
if(!beenden)
e.doit = false;
}
});
return parent;
}
Da gibts folgende rote Tapete:
Code:
org.eclipse.swt.SWTException: Widget is disposed
at org.eclipse.swt.SWT.error(SWT.java:3374)
at org.eclipse.swt.SWT.error(SWT.java:3297)
at org.eclipse.swt.SWT.error(SWT.java:3268)
at org.eclipse.swt.widgets.Widget.error(Widget.java:435)
at org.eclipse.swt.widgets.Widget.getDisplay(Widget.java:545)
at org.eclipse.jface.dialogs.IconAndMessageDialog.getSWTImage(IconAndMessageDialog.java:266)
at org.eclipse.jface.dialogs.IconAndMessageDialog.getQuestionImage(IconAndMessageDialog.java:247)
at org.eclipse.jface.dialogs.MessageDialog.<init>(MessageDialog.java:149)
at org.eclipse.jface.dialogs.MessageDialog.openQuestion(MessageDialog.java:364)
at de.annabamp.adressbuch.gui.Applikation$1.shellClosed(Applikation.java:39)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:159)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:928)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:952)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:937)
at org.eclipse.swt.widgets.Decorations.closeWidget(Decorations.java:257)
at org.eclipse.swt.widgets.Decorations.WM_CLOSE(Decorations.java:1606)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:3248)
at org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1539)
at org.eclipse.swt.widgets.Shell.windowProc(Shell.java:1634)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:4025)
at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:1927)
at org.eclipse.swt.widgets.Shell.callWindowProc(Shell.java:443)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:3334)
at org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1539)
at org.eclipse.swt.widgets.Shell.windowProc(Shell.java:1634)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:4025)
at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:1927)
at org.eclipse.swt.widgets.Shell.callWindowProc(Shell.java:443)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:3334)
at org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1539)
at org.eclipse.swt.widgets.Shell.windowProc(Shell.java:1634)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:4025)
at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:1932)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2966)
at org.eclipse.jface.window.Window.runEventLoop(Window.java:820)
at org.eclipse.jface.window.Window.open(Window.java:796)
at de.annabamp.adressbuch.gui.Applikation.<init>(Applikation.java:22)
at de.annabamp.adressbuch.gui.Applikation.main(Applikation.java:110)
Nicht einmal ein einfaches "e.doit = false;" verhindert das Schließen. Es gibt zwar keinen Fehler, aber das Schließen wird nicht verhindert.
Bei Swing würde ich einfach die Methode "windowClosed(WindowEvent e)" überschreiben und sie meinem JFrame zum fressen geben, aber hier weiß ich echt nicht weiter.
Vielen Dank für jede ernst gemeinte Antwort!
Gruß ryoshi