Hallo!
Ich arbeite derzeit an meinem Schulprojekt, in dem ich das Brettspiel die Siedler von Catan implementiere.
Während des Spielverlaufs werden mit Hilfe eines JDialogs diverse Nachrichten angezeigt.
z.B.
-User ist am Zug
-Handel mit der Bank war erfolgreich
-Handel mit der Bank war nicht erfolgreich
-Warte auf Antwort der anderen User (bei einer Handelsanfrage)
-etwaige Fehlermeldungen
-uvm
Es gibt bei der Darstellung von einzelnen Meldungen keine Probleme. Der JDialog lässt sich ohne Probleme darstellen und schließen.
Ich erzeuge mit ein JDialog Objekt und setze es mit setVisible aktiv bzw. inaktiv.
Hier die Initialisierung des JDialogs
Hier die Methoden, mit denen ich den JDialog einblenden/ändern bzw verstecken kann.
Das Funktioniert soweit einwandfrei.
Nur habe ich jetzt folgende Situation
Der Client wählt die Ressourcen aus, die er gerne handeln möchte und schickt dies zum Server.
Der Server überprüft, ob ein anderer User die gewünschte Ressource in der gewünschten Menge überhaupt hat. Beim anfragenden Client wird folgender Dialog geöffnet:
(es handelt sich dabei um den Dialog der aussieht wie auf Screenshot Schritt1.jpg; siehe Anhang)
Der OK-Button wird an dieser Stelle nicht angezeigt, da der User nicht weiterspielen soll, während er wartet.
Wenn der Fall eintritt, dass niemand in der Lage ist um zu handeln, erhält der Anfragende-Client die Meldung, dass der Handel vorbei ist.
Der Dialog wird dann geändert werden (Titel, Text und der Button soll angezeigt werden)
Und genau hier, bei dem Übergang von "Waiting for response" zu "Nobody to trade", passiert etwas merkwürdiges. Der JDialog wird nicht kurzfristig geschlossen, der Text + Titel wird nicht geändert und das OK-Button-Panel wird ebenfalls nicht auf visible gesetzt.
Es scheint, als würde diese Abfolge zu schnell passieren und die GUI kommt nicht nach mit zeichnen oder ähnlichem.
Bei dem Fall, dass es aber einen User gibt, der handeln kann und auch mit dem anfragenden Client handelt, funktioniert alles einwandfrei und der Dialog "Wait for response" verschwindet und es erscheint der zweite Dialog (siehe Screenshot)
(Screenshot Schritt2.jpg)
Es handelt sich dabei allerdings um den selben Code.
So ändere ich den Dialog, wenn ein Client den Handel akzeptiert hat:
Ich habe auch bereits versucht, den JDialog nicht modal anzeigen zu lassen. Das ändert aber leider genau garnichts. Ich kann dann zwar weiterspielen, doch der Dialog bleibt besteht.
Das JDialog-Object immer zu zerstören und ein neues zu erzeugen hat ebenfalls keine Änderung gezeigt.
Kann mir da vielleicht jemand weiterhelfen - wäre wirklich sehr dankbar, da ich einfach nicht mehr weiter weiß.
Vielen Dank!
Gruß
Stefan
Ich arbeite derzeit an meinem Schulprojekt, in dem ich das Brettspiel die Siedler von Catan implementiere.
Während des Spielverlaufs werden mit Hilfe eines JDialogs diverse Nachrichten angezeigt.
z.B.
-User ist am Zug
-Handel mit der Bank war erfolgreich
-Handel mit der Bank war nicht erfolgreich
-Warte auf Antwort der anderen User (bei einer Handelsanfrage)
-etwaige Fehlermeldungen
-uvm
Es gibt bei der Darstellung von einzelnen Meldungen keine Probleme. Der JDialog lässt sich ohne Probleme darstellen und schließen.
Ich erzeuge mit ein JDialog Objekt und setze es mit setVisible aktiv bzw. inaktiv.
Hier die Initialisierung des JDialogs
Code:
private JDialog dialog;
private JButton dialogOk;
private JPanel dialogMsgPanel;
private JLabel dialogTextLable;
private JPanel dialogOkPanel;
private void openJDialog() {
dialog = new JDialog(GUIInGame, true);
dialog.setSize(300,150);
dialog.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
dialog.setAlwaysOnTop(true);
dialog.getContentPane().setLayout(new GridLayout(2, 1));
dialog.setLocationRelativeTo(null);
dialogMsgPanel = new JPanel();
dialogMsgPanel.setLayout(new FlowLayout());
dialogTextLable = new JLabel();
dialogMsgPanel.add(dialogTextLable);
dialogOkPanel = new JPanel();
dialogOkPanel.setLayout(new FlowLayout());
dialogOk = new JButton("ok");
dialogOkPanel.add(dialogOk);
dialog.getContentPane().add(dialogMsgPanel);
dialog.getContentPane().add(dialogOkPanel);
}
Hier die Methoden, mit denen ich den JDialog einblenden/ändern bzw verstecken kann.
Code:
//für die Darstellung des JDialogs mit Titel, Nachricht und
//ob der OK-Button dargestellt werden soll oder nicht
//dabei wird das Panel mit dem Button auf visible = true/false gesetzt
public void showNewDialog(String title, String msg, Boolean button) {
hideJDialog();
dialog.setTitle(title);
dialogTextLable.setText("<html><body>" + msg + "</body></html>");
changeJDialogButtonState(button);
showJDialog();
}
//diese Methode wird vom Controller aufgerufen, wenn der OK Button
//gedrückt wurde
public void hideJDialog() {
dialog.setAlwaysOnTop(false);
dialog.setVisible(false);
}
//wird aufgerufen, nachdem der Text des JDialogs etc
//geändert wurde
private void showJDialog() {
dialog.repaint();
dialog.setAlwaysOnTop(true);
dialog.setVisible(true);
}
//ist für das Ändern des visible status des OK-Button Panel
private void changeJDialogButtonState(Boolean value) {
dialogOkPanel.setVisible(value);
}
Das Funktioniert soweit einwandfrei.
Nur habe ich jetzt folgende Situation
Der Client wählt die Ressourcen aus, die er gerne handeln möchte und schickt dies zum Server.
Der Server überprüft, ob ein anderer User die gewünschte Ressource in der gewünschten Menge überhaupt hat. Beim anfragenden Client wird folgender Dialog geöffnet:
Code:
//1. Titel, 2. Nachricht, 3. OK-Button nicht anzeigen
ingame.showNewDialog("Trade waiting", "Waiting for response", false);
(es handelt sich dabei um den Dialog der aussieht wie auf Screenshot Schritt1.jpg; siehe Anhang)
Der OK-Button wird an dieser Stelle nicht angezeigt, da der User nicht weiterspielen soll, während er wartet.
Wenn der Fall eintritt, dass niemand in der Lage ist um zu handeln, erhält der Anfragende-Client die Meldung, dass der Handel vorbei ist.
Der Dialog wird dann geändert werden (Titel, Text und der Button soll angezeigt werden)
Code:
//1. Titel, 2. Nachricht, 3. OK-Button anzeigen
ingame.showNewDialog("Trade ended", "Nobody to trade", true);
Und genau hier, bei dem Übergang von "Waiting for response" zu "Nobody to trade", passiert etwas merkwürdiges. Der JDialog wird nicht kurzfristig geschlossen, der Text + Titel wird nicht geändert und das OK-Button-Panel wird ebenfalls nicht auf visible gesetzt.
Es scheint, als würde diese Abfolge zu schnell passieren und die GUI kommt nicht nach mit zeichnen oder ähnlichem.
Bei dem Fall, dass es aber einen User gibt, der handeln kann und auch mit dem anfragenden Client handelt, funktioniert alles einwandfrei und der Dialog "Wait for response" verschwindet und es erscheint der zweite Dialog (siehe Screenshot)
(Screenshot Schritt2.jpg)
Es handelt sich dabei allerdings um den selben Code.
So ändere ich den Dialog, wenn ein Client den Handel akzeptiert hat:
Code:
ingame.showNewDialog("Trade success", res.getByUser() + " has tradet with you!", true);
Ich habe auch bereits versucht, den JDialog nicht modal anzeigen zu lassen. Das ändert aber leider genau garnichts. Ich kann dann zwar weiterspielen, doch der Dialog bleibt besteht.
Das JDialog-Object immer zu zerstören und ein neues zu erzeugen hat ebenfalls keine Änderung gezeigt.
Kann mir da vielleicht jemand weiterhelfen - wäre wirklich sehr dankbar, da ich einfach nicht mehr weiter weiß.
Vielen Dank!
Gruß
Stefan