Probleme mit GUI (RMI)

HeroicGlaedr

Mitglied
Hallo zusammen,

Ich programmiere momentan ein kleines Netzwerkspiel für 2 Spieler (Applet). Sie verbinden sich über RMI mit dem Server, der die Spiellogik enthält.

Wenn beide Clients bereit sind dann lässt der Server das Spiel beginnen. Die Spieler
werden sequenziell benachrichtigt, dass das Spiel beginnt.

Beim Spielbeginn soll das JPanel gewechselt und das Spielbrett angezeigt werden.
Wenn jetzt der Client benachrichtigt soll zuerst noch eine DialogBox angezeigt werden und danach
erst das Panel gewechselt werden. Das Panel wird mir angezeigt, jedoch wenn ich auf OK klicke dann
friert das Ding ein und ich kann nichts mehr machen.

Code des einen JPanels (Home):
Java:
private void jButtonJoinActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonJoinActionPerformed
    	if(!jTextFieldNickname.getText().equals("")){
            if(applet.getClient()==null){
                try {
                    applet.setClient(new GameClient(jTextFieldNickname.getText(),applet));
                    JOptionPane.showMessageDialog(applet.getContentPane(),"You have been added to the Queue.\n"
                            + "Please wait for the second Player to join the Game.","Queue",JOptionPane.INFORMATION_MESSAGE);
                    applet.getClient().sendReady();
                } catch(MaxPlayerReachedException e){
                    JOptionPane.showMessageDialog(applet.getContentPane(),e.getMessage(),"Queue",JOptionPane.ERROR_MESSAGE);
                } catch(NameReservedException e){
                    JOptionPane.showMessageDialog(applet.getContentPane(),e.getMessage(),"Nickname",JOptionPane.ERROR_MESSAGE);
                } catch(RemoteException e){
                    JOptionPane.showMessageDialog(applet.getContentPane(),"Cannot connect to Game-Server.\nPlease retry later.",
                            "Connection-Error",JOptionPane.ERROR_MESSAGE);
                } catch (MalformedURLException e) {
                	JOptionPane.showMessageDialog(applet.getContentPane(),"Cannot connect to Game-Server.\nThe specified URL was invalid.",
                            "Connection-Error",JOptionPane.ERROR_MESSAGE);
				} catch (NotBoundException e) {
					JOptionPane.showMessageDialog(applet.getContentPane(),"Cannot connect to Game-Server.\nThe Game-Server is not running.",
                            "Connection-Error",JOptionPane.ERROR_MESSAGE);
				}
            }
            else{
            	JOptionPane.showMessageDialog(applet.getContentPane(),"Client already generated","Init",JOptionPane.INFORMATION_MESSAGE);
            }
        }
        else{
            JOptionPane.showMessageDialog(applet.getContentPane(),"You have forgotten to fill in your Nickname.","Fehler",JOptionPane.ERROR_MESSAGE);
            jTextFieldNickname.requestFocusInWindow();
        }
    }
Code des Applets (Benachrichtigung durch Server, dass der Client das Spiel beginnen soll):
Java:
public void gameHasBegunSecond(){
		System.out.println("hallo ich bin second");
		getContentPane().removeAll();
		getContentPane().add(game);
		JOptionPane.showMessageDialog(getContentPane(),"The opponent Player has joined the Game.\n"+"" +
				"The coin was tossed: You may start with the Game second.","Game",JOptionPane.INFORMATION_MESSAGE);
		//game.GameHasBegunSecond();
	}
	public void gameHasBegunFirst(){
		System.out.println("hallo ich bin first");
		getContentPane().removeAll();
		getContentPane().add(game);
		JOptionPane.showMessageDialog(getContentPane(),"The opponent Player has joined the Game.\n"+"" +
				"The coin was tossed: You may start with the Game.","Game",JOptionPane.INFORMATION_MESSAGE);
		//game.GameHasBegunFirst();
	}

Wenn der Server den Client benachrichtigt, ist der glaube ich immernoch die Codezeile
Java:
applet.getClient().sendReady();
am Ausführen. Muss ich in meinem Falle hier
Threads benutzten, um das GUI zu updaten oder was schlägt Ihr mir vor?

Brauche momentan nur folgenden Thread, um das GUI am Anfang zu initialisieren und anzuzeigen:
Java:
javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
	            public void run() {
	            	setSize(953,659);
	            	createGUI();
	            }
	        });

Grüsse
 
S

SlaterB

Gast
generell ist Applet ein Albtraum, den quasi niemand benutzt/ testen kann (also ich zumindest nicht ;) ),
selbst wenn du das irgendwann brauchst, kannst du vorher doch alles erstmal in JFrame programmieren und testen

hat das ganze eigentlich etwas mit RMI zu tun? wenn du RMI ausbaust und nur auf Benutzereingaben oder Zufallsereignisse im Programm reagierst, treten dann nicht dieselben Probleme auf?
so richtig zu sehen ist von deinem Programm ansonsten nichts, genaueres kann ich nicht beitragen

noch ein Tipp: statt überall im Programm
Java:
     JOptionPane.showMessageDialog(getContentPane(),"The opponent Player has joined the Game.\n"+"" +
                "The coin was tossed: You may start with the Game second.","Game",JOptionPane.INFORMATION_MESSAGE);
usw. zu schreiben, definiere dir Basismethoden für kürzere Aufrufe a la
Java:
     info("The opponent Player has joined the Game.\n"+"" +
                "The coin was tossed: You may start with the Game second.","Game");
 

HeroicGlaedr

Mitglied
Hey,

Vielen Dank für die Rückmeldung.

Warum ist ein Applet ein Albtraum :)?
Ich habe es jetzt mal umprogrammiert und es funktioniert immer noch nicht.
Ich glaube es wechselt das JPanel im Hintergrund aber zeigt es nicht an.. komisch

Ansonsten sende ich dir gern mal das Projekt zum Anschauen, vielleicht findest du
ja den Fehler. Ich zerbreche mir jetzt schon seit Tagen den Kopf..;(

//EDIT
Habe es jetzt nochmals mit einem CardLayout versucht, um zwischen den verschiedenen Panels
hin und her zu switchen. Hat erfolgreiche funktioniert ;)

Ach, jetzt friert mir der MessageDialog beim zweiten Client (rechts) immer ein.. Ich habe dir ein Image angefügt, dann siehst du, wie es aussieht.

Gruss
 

Anhänge

  • Unbenannt.jpg
    Unbenannt.jpg
    20,4 KB · Aufrufe: 40
Zuletzt bearbeitet:

HeroicGlaedr

Mitglied
Hallo,

Habe gleich noch eine zweite Frage:

Ich kann momentan Images aus einer .jpg Datei einlesen und auf das GUI zeichnen.
Komischerweise funktioniert es aber nur bei 2 JPanels. Beim Dritten, soll es das gleiche Image
(vergrössert) draufzeichnen, wenn ich mit der Maus über ein schon Gezeichnetes fahre.

Hier der Code:
Java:
private JLabel displayCard(Card card){
    	JLabel label = new JLabel();
    	CardComponent cComp = new CardComponent(card.getName().toLowerCase()+".jpg",card);
    	cComp.setScaledImage();
    	label.setIcon(cComp);
    	label.setPreferredSize(cComp.getPrefferedSizeScaled());
    	label.addMouseListener(new MouseAdapter(){
            public void mouseEntered(MouseEvent e){
            	JLabel label = new JLabel();
            	CardImage cImage = ((CardComponent) ((JLabel) e.getSource()).getIcon()).getCardImage();
            	CardComponent cComp = new CardComponent(cImage);
            	cComp.setDefaultImage();
                Card card = cComp.getCardImage().getCard();
            	jTextAreaInfo.setText(card.toString());
            	label.setIcon(cComp);
            	label.setPreferredSize(cComp.getPreferredSize());
            	label.setVisible(true);
                label.setLocation(0, 0);
                jPanelPicture.add(label);
                /**System.out.println("Number of Componenets: "+jPanelPicture.getComponentCount()+"\nCoords: "+
                		jPanelPicture.getComponent(0).getX()+"/"+jPanelPicture.getComponent(0).getY());
            	System.out.println("drawn Pic");**/
            }
            public void mouseExited(MouseEvent e){
                jTextAreaInfo.setText("");
                jPanelPicture.removeAll();
                System.out.println("removed again");
            }
        });
        return label;
    }

Die nicht vergrösserten Images werden mir alle schön angezeigt.
Wenn ich mit der Mouse drüberfahre, dann zeigt es mir den Text der Karte im
JTextArea an, nicht aber ein vergrössertes Bild auf dem dritten JPanel.

Hier der generierte Code des dritten JPanels:
Java:
jPanelPicture.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
jPanelPicture.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
jPanelPicture.setMinimumSize(new java.awt.Dimension(227, 367));
jPanelPicture.setLayout(new java.awt.GridLayout(0, 1, 5, 0));


Hoffe du kannst mir helfen.
Gruss
 
S

SlaterB

Gast
> CardImage cImage = ((CardComponent) ((JLabel) e.getSource()).getIcon()).getCardImage();
==
CardImage cImage = cComp.getCardImage();
wenn cComp final ist

---

nach GUI-Änderungen
validate();
repaint();
am JFrame aufrufen,

besser gar nicht erst irgendwann neue JLabel anlegen, sondern alles vorher bereit haben
und nur noch CardLayout auf eine andere Seite wechseln oder ähnliches
 

HeroicGlaedr

Mitglied
Hallo,

Vielen Dank für die Rückmeldung.

Ich habe jetzt das Projekt refaktoriert und es funktioniert erfolgreich :)!

Ein Fehler bleibt mir noch: Die Message Box friert immernoch ein.

Ich bin dem Fehler auf der Spur und habe ihn lokalisiert:

Auf dem Client gibt es einen Button, der einen InputDialog öffnet.
Der InputDialog braucht eine ArrayList aus Objekten, welche auf einem entfernten Client liegt.
Über RMI wird die ArrayList vom entfernten Client angefordert. Bis hierhin funktioniert noch alles.

Wenn der InputDialog geöffnet werden soll, friert er ein. Wenn ich danach den enfernten Client schliesse, dann wird er plötzlich korrekt dargestellt und es funktioniert.

Was ich daraus schliesse:
Der entfernte Client blockiert das Aufrufen des InputDialogs.

Ich benutze momentan noch keine MVC Architektur beim GUI.
Sollte ich das tun? Vielleicht hilft es, wenn ich das GUI über Observer/Observable implementiere?
Gibt es andere Methoden?

Für Anregungen bin ich dankbar :)

Hier den Java Code fürs GUI (JForm & JPanel):
Java:
	public void receiveOpponentGrave(ArrayList<Card> grave) {
		game.receiveOpponentGrave(grave);
	}
        public void receiveOpponentGrave(ArrayList<Card> grave) {
    	//System.out.println("tried to receive opponent grave");
    	//System.out.println(grave);
        /** Friert ein beim aufruf der Funktion Dialog(ArrayList<Card) **/
    	dialog(grave);
	}
    private void dialog(ArrayList<Card> cards){
        String[] possibilities = new String[cards.size()];
    	Iterator<Card> iter = cards.iterator();
    	Card card, card2;
    	while(iter.hasNext()){
    		card = iter.next();
    		possibilities[cards.indexOf(card)]=card.getName();
    	}
    	if(possibilities.length>0){
	    	String s = (String)JOptionPane.showInputDialog(this, "Please select the Card you want to view: ", 
	        		"Card Selection",JOptionPane.QUESTION_MESSAGE, null, possibilities, possibilities[0]);
	    	if(!s.equals(null)){
	    		Iterator<Card> iter2 = cards.iterator();
	    		while(iter2.hasNext()){
	    			card2 = iter2.next();
	    			if(card2.getName().equals(s)){
	    				CardComponent cComp = new CardComponent(s.toLowerCase()+".jpg");
	                	cComp.setDefaultImage();
	                	jTextAreaInfo.setText(card2.toString());
	                	jLabelPicture.setIcon(cComp);
	                	jLabelPicture.setPreferredSize(cComp.getPreferredSize());
	                	jLabelPicture.setVisible(true);
	                    applet.validate();
	                    applet.repaint();
	                    System.out.println("was printed");
	    				break;
	    			}
	    		}
	    	}
        }
    }

Der formhalber noch den Code auf dem (entfernten) Client:
Java:
    public void requestOpponentGrave() throws RemoteException{
    	session.requestOpponentGrave();
	}
	public void sendPlayerGrave(){
		try{
			//Karten werden geklont, damit das GUI nicht mit serialisiert wird (Karte hat einen Besitzer, Besitzer hat GUI..)
			session.sendGrave(cloneCards(cloneCards(player.getGrave())));
		}
		catch(RemoteException e){
			e.printStackTrace();
		}
	}
	public void receiveOpponentGrave(ArrayList<Card> grave){
		gui.receiveOpponentGrave(grave);
	}

Gruss
 

HeroicGlaedr

Mitglied
Hallo,

Ich habe es jetzt endlich geschafft:

Musste die DialogBox über:
Java:
SwingUtilities.invokeLater(new Runnable())
aufrufen, damit Sie korrekt ausgeführt wird.

Gruss
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Probleme bei Java-Installation auf Server (Linux/Shell/Terminal) Netzwerkprogrammierung 6
platofan23 Probleme mit Socket bei Android Studio? Netzwerkprogrammierung 22
J Probleme mit Multicast über IPv6, DatagramChannel Netzwerkprogrammierung 1
Niggo_ Probleme mit Java Mail Netzwerkprogrammierung 14
F Probleme mit Connection Reset bei Telnet Verbindung Netzwerkprogrammierung 1
K Probleme bei HTML-Mail-Abruf mit IMAP bei 1und1 Netzwerkprogrammierung 2
L Socket SSLServer Probleme Netzwerkprogrammierung 0
H Probleme mit UDP Netzwerkprogrammierung 0
F Server/Client Probleme Netzwerkprogrammierung 3
R Probleme mit JMS Netzwerkprogrammierung 1
A Probleme beim Klassen-Import von sun.misc. ... Netzwerkprogrammierung 19
M RMI RMI Probleme zwischen Client und Server Netzwerkprogrammierung 5
B Probleme beim ersten Netzwerkprogramm Netzwerkprogrammierung 3
M Probleme mit FTP Netzwerkprogrammierung 19
windl URLConnection unter 1.7 macht Probleme Netzwerkprogrammierung 14
Z Socket Probleme beim Senden und Empfangen Netzwerkprogrammierung 5
Z Probleme beim Senden von Nachrichten an den Server Netzwerkprogrammierung 9
Maxim6394 Probleme bei Messenger Netzwerkprogrammierung 16
I Socket UDP Hole Punching bereitet Probleme Netzwerkprogrammierung 14
C Socket Probleme beim Lesen und Schreiben aus/in einen Socket Netzwerkprogrammierung 2
S HTTP Probleme mit POST-Befehl Netzwerkprogrammierung 2
R FTPS - Probleme mit FTPSClient Netzwerkprogrammierung 2
S Probleme mit XMLEncoder/XMLDecoder Netzwerkprogrammierung 2
D Server - Client Probleme Netzwerkprogrammierung 9
Weiti HTTP Zertifikat-Probleme - InstallCert.java Netzwerkprogrammierung 2
M Socket Probleme mit einfacher Socketverbindung Netzwerkprogrammierung 3
T RMI Probleme mit RMI-Server Netzwerkprogrammierung 4
J Probleme bei RSA mit byte[] bei Versand über RMI Netzwerkprogrammierung 2
T FTP Probleme mit Passiv und Binary Mode Netzwerkprogrammierung 3
J Probleme mit Threads (Client terminiert) Netzwerkprogrammierung 4
S Socket SocketServer und Client machen Probleme Netzwerkprogrammierung 6
B Server / Client Anwendung, Client GUI Probleme Netzwerkprogrammierung 11
F RMI probleme Netzwerkprogrammierung 3
D Probleme bei mehreren Clients uns Senden von Messages Netzwerkprogrammierung 16
E jPcap Probleme Netzwerkprogrammierung 3
B HTTP Probleme mit HttpClient? Netzwerkprogrammierung 2
T Probleme mit Jpcap Netzwerkprogrammierung 18
P Probleme mit OutputStream Netzwerkprogrammierung 7
P Probleme beim weiter senden von Datein Netzwerkprogrammierung 10
B Probleme mit FTP verbindung Netzwerkprogrammierung 22
L Probleme bei Chatserver Netzwerkprogrammierung 6
A Probleme mit kleinem Netzwerk Programm Netzwerkprogrammierung 30
S Probleme beim senden von Daten per POST Methode an PHP Scrip Netzwerkprogrammierung 5
G Probleme mit SecruityManager + RMI Netzwerkprogrammierung 10
derMartin Probleme mit NNTP Client Netzwerkprogrammierung 2
A Probleme mit Citrix Netzwerkprogrammierung 17
A Probleme mit kleinem Messenger-Programm Netzwerkprogrammierung 4
K RXTXcomm : Install - Probleme Netzwerkprogrammierung 7
R Probleme mit UDP Netzwerkprogrammierung 4
P Probleme bei Chat programm Netzwerkprogrammierung 2
I Probleme mit 'JSSE Samples' von Sun Netzwerkprogrammierung 5
T RMI - Probleme beim Starten des Clients Netzwerkprogrammierung 4
E InetAddress Klasse-Probleme Netzwerkprogrammierung 4
M dateien übertragen, probleme mit versch. Strömen? Netzwerkprogrammierung 4
R Rechte Probleme bei Applets Netzwerkprogrammierung 16
D EA-Exception Network Adapter macht probleme Netzwerkprogrammierung 2
G Probleme mit Firewall beim empfangen von dateien über socket Netzwerkprogrammierung 6
P Probleme mit Input- / Output-Streams Netzwerkprogrammierung 2
V probleme mit dem chat programm Netzwerkprogrammierung 4
F WLAN Probleme (CLIENT-SERVER) Netzwerkprogrammierung 4
J Probleme mit ObjectOutputStream! Netzwerkprogrammierung 15
S Probleme beim Beschränken der Geschwindigkeit Netzwerkprogrammierung 6
M Probleme beim Abfangen von Streams Netzwerkprogrammierung 5
G Fragen/Probleme mit JavaMail Netzwerkprogrammierung 2
N Java-Chat (lauffähig) macht Probleme auf der Konsole Netzwerkprogrammierung 6
P Probleme mit einem Array aus Sockets Netzwerkprogrammierung 2
C Probleme bei Dateiupload mit socket Netzwerkprogrammierung 4
T FTP Chatprogramm probleme Netzwerkprogrammierung 2
C RMI Probleme mit iptables Netzwerkprogrammierung 2
D socket exception + timing probleme Netzwerkprogrammierung 2
G Probleme bei Proxy-Server! Netzwerkprogrammierung 5
S Probleme mit HttpURLConnection Netzwerkprogrammierung 10
D Habe 2 Probleme: Input eingabe und Multi Socket Server Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben