Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

29.05.2011, 11:17

SWT MessageBox

Also ich hab ein wenig mit Java rumgespielt und benutze für die GUI SWT. Jetzt hab ich mit SWT noch nie was gemacht, aber bis auf ein paar Kleinigkeiten funktioniert schon alles. Jetzt möchte ich aber irgendwo in meinem Programm eine MessageBox anzeigen, und das will nicht recht geraten.
Für eine Messagebox braucht man ja eine Shell, die man mithilfe eines Displays erstellen kann. Das Display existiert einmal für die ganze Applikation, das ist nicht das Problem. Aber ich habe mehrere Fenster die mal offen und mal zu sein können, und der Teil mit der MessageBox kann von mehreren Stellen aus aufgerufen werden, also hab ich keine Shell, die ich übergeben kann. Dann hab ich folgendes versucht:

C-/C++-Quelltext

1
2
3
4
5
6
Shell shell = new Shell(display);
MessageBox mb=new MessageBox(shell);
mb.setText("Fehler!");
mb.setMessage(Text);
mb.open();
shell.dispose();

Das funktioniert auch, aber nur einmal. Wenn ich danach noch eine MessageBox anzeigen will, kommt diese zwar, aber im Hintergrund und es kommt kein Benachrichtigungston. Wie würde ich das Problem mit SWT jetzt sauber gelöst bekommen (es ist ja auch schon irgendwie sehr hässlich, eine temporäre shell zu erstellen).
Lieber dumm fragen, als dumm bleiben!

denjo

Treue Seele

Beiträge: 163

Wohnort: BLB

  • Private Nachricht senden

2

29.05.2011, 12:34

Aber warum eine temporäre Shell? Ich denke doch mal, dass du immer ein Fenster offen hast und ein Fenster wird immer durch ein Shell-Objekt repräsentiert. Dann schreib dir eine kleine statische Helper-Methode und übergib der immer die Shell bzw. das Fenster, aus dem du die MessageBox aufrufen willst, z.B.:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
public class Helper {

    public static void showMessage(final Shell shell, final String title, final String message) {
        final MessageBox msgbox = new MessageBox(shell);
        msgbox.setText(title);
        msgbox.setMessage(message);
        msgbox.open();
    }

}


In der Hauptanwendung dann z.B.:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Application {

    private Shell m_oShell;

    public Application(final Display display) {
        m_oShell = new Shell(display);
        m_oShell.setText("MessageBox-Test");

        m_oShell.open();
        
        Helper.showMessage(m_oShell, "Titel", "Nachricht");

        while(!m_oShell.isDisposed()) {
            if(!display.readAndDispatch())
                display.sleep();
        }
    }

    public static void main(String[] args) {
        final Display display = new Display();
        new Application(display);

        display.dispose();
    }

}
"Irren ist menschlich, Vergeben göttlich."
- Alexander Pope -

3

29.05.2011, 14:16

Ich hab zum Beispiel ein Anmeldefenster und ein Arbeitsfenster, bei denen jeweils in aufgerufenen Funktionen Fehler auftreten können, die dann einerseits in ein Logbuch geschrieben werden, anderseits aber auch in einer MessageBox angezeigt werden können. Die selbe Funktion kann also aus 2 verschiedenen Fenstern aufgerufen werden.
In der Hauptklasse dem Logger ganz am Anfang mal das Display zu geben, das ist ja noch ok, aber ich will wirklich nicht Shellobjekte durch meine halbe Anwendung reichen oder immer versuchen, in einer variable das gerade offene Fenster gespeichert zu haben. Da muss es doch noch irgendeine elegantere Methode geben?
Lieber dumm fragen, als dumm bleiben!

4

29.05.2011, 14:30

Wenn ich das shell.dispose weglasse klappt alles wunderbar. Aber das hört sich so falsch an oO
Lieber dumm fragen, als dumm bleiben!

denjo

Treue Seele

Beiträge: 163

Wohnort: BLB

  • Private Nachricht senden

5

29.05.2011, 16:27

Ja das klappt deshalb, weil die Shell immer noch im Speicher vorliegt. dispose() ist dafür da, SWT-Objekte zu löschen oder besser gesagt angeforderte System-Ressourcen freizugeben. So sollte das aber natürlich nicht bleiben, denn ein dispose() sollte möglichst immer aufgerufen werden.

Kannst du mal einen Code-Ausschnitt zeigen, in dem du die MessageBox gerne anzeigen möchtest?
"Irren ist menschlich, Vergeben göttlich."
- Alexander Pope -

Werbeanzeige