Problème chargement interface

Résolu
napstero Messages postés 3 Date d'inscription mardi 13 avril 2010 Statut Membre Dernière intervention 15 décembre 2010 - 12 déc. 2010 à 19:17
napstero Messages postés 3 Date d'inscription mardi 13 avril 2010 Statut Membre Dernière intervention 15 décembre 2010 - 15 déc. 2010 à 16:39
Bonjour, je dois créer un jeux avec des socket pour mon cours de langage de programmation. J'ai décidé de faire un puissance 4. Le jeux fonctionne pour un joueur, et lorsque l'on a voulu faire la partie socket, on rencontre un soucis. Enfaite l'interface graphique se lance, mais c'est tout blanc... Je comprends vraiment pas pourquoi!

Voici 3 classes de mon codes, je penses que c'est dans une de celle-la qu'il y a un problème:






*************************************************************************
 * Interface graphique permettant de rentrer les noms des joueurs 			   *
 *******************************************************************************/
package puissance4;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

class joueur extends JFrame
{
String j1,j2;			//Chaine de caractère ou seront stockés les noms des jouers
JTextField jtf_j1;		//JTextField ou seront entrés les noms des joueurs
JTextField jtf_j2;
joueur j;				//référence vers soi-même necessaire pour l'appel de puissance4IHM

boolean running=false;
Comm tmp=null;
MySocket socket=null;
puissance4IHM jf;

//Constructuer
public joueur()		
{
//titre
super("Joueurs");

//référence vers soi
j=this;

//initialisation des JTextField
jtf_j1=new JTextField(20);
//jtf_j2=new JTextField(20);

//initialisation de JLAbel
JLabel jl_j1=new JLabel("Joueur 1 : ");
//JLabel jl_j2=new JLabel("Joueur 2 : ");

//Ecouteur du bouton OK
ActionListener al_ok=new ActionListener(){
public void actionPerformed(ActionEvent e)
{
//on récupère les noms des deux joueurs
j1=jtf_j1.getText();
//j2=jtf_j2.getText();
j2="joueur 2";

//on cache la fenêtre courante
setVisible(false);

//Création de la JFrame du puissance 4
jf=new puissance4IHM("Puissance 4",j);
//calcul de la dimension de la JFrame
jf.pack();
//on rend visible la JFrame
jf.setVisible(true);
//on lui affecte l'opération de fermeture par défaut lorsqu'on
//clique sur la croix
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// connexion
socket=new MySocket(MySocket.getLocalHost(),2001);
socket.connect();
while(!socket.isConnected()){
try {
Thread.sleep(10);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
running=true;
listen();
}
};

//création du bouton
JButton jb_ok=new JButton("OK");

//ajout de l'écouteur
jb_ok.addActionListener(al_ok);

//Création des JPanel
JPanel jp1=new JPanel();
JPanel jp2=new JPanel();
JPanel jpb=new JPanel(); 


//rajout des différents éléments dans les JPanel
jp1.add(jl_j1);
jp1.add(jtf_j1);
//jp2.add(jl_j2);
//jp2.add(jtf_j2);
jpb.add(jb_ok);

//Ajout des JPanel dans la JFrame
this.getContentPane().add(jp1,BorderLayout.NORTH);
this.getContentPane().add(jp2,BorderLayout.CENTER);
this.getContentPane().add(jpb,BorderLayout.SOUTH);


}

public void listen(){
while(running){
tmp=socket.recieve();
try{
if(tmp.getType()==2) j2=tmp.getStr();
else if(tmp.getType()==1){
jf.col[tmp.getMove()].ajouter(2);
jf.joueurCur=1;
}

}catch(Exception e){
running=false;
}
}
}
}


/************************************
 * IHM du programme de puissance 4 	*
 ************************************/			

package puissance4;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;


/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit www.cloudgarden.com for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
class puissance4IHM extends JFrame
{
JPanel tout;		//JPanel contenant toutes les colonnes du puissance 4
colonne[] col;		//tableau de 'colonne' contenant les références vers chaque objet 'colonne'
int joueurCur;		//numéro du joueur courant (1 ou 2)
verification v;
joueur j;
JLabel jl;

String defaut="C'est le tour de ";

//constructeur de l'IHM principale
public puissance4IHM(String titre,joueur jo)
{
//affectation du titre à la Frame
super(titre);

this.j=jo;

//Le joueur courant est le joueur 1
this.joueurCur=1;

//instanciation du JPanel général 
this.tout=new JPanel(new GridLayout(1,7));

//instanciation du tableau de 'colonne'
this.col=new colonne[7];

//pour toutes les colonnes du puissance 4
for (int i=0;i<7;i++)
{
//on crée un nouvel objet colonne
this.col[i]=new colonne(this);
//et on récupère le JPanel correspondant qu'on ajoute dans 'tout'
(this.tout).add((this.col[i]).renvoyer());
}

//Création d'une instance de vérification
v=new verification(this.col);

jl=new JLabel(defaut + this.j.j1);

JPanel jpl=new JPanel();
jpl.add(jl);

//ajout de 'tout' dans la JFrame principale
this.getContentPane().add(this.tout,BorderLayout.CENTER);
this.getContentPane().add(jpl,BorderLayout.SOUTH);

System.out.println("----------------");

}




//**************************************************************************
// Réinitialisation du programme
public void reinit()
{
//on réinititalise la vérification
v.reinit();

//on réinitialise les colonnes
for (int i=0;i<7;i++)

{
this.col[i].reinit();
}

if (joueurCur==1)
{
jl.setText(defaut+j.j1);
}
else
{
jl.setText(defaut+j.j2);
}
}

private void initGUI() {
try {
{
this.setSize(376, 304);
}
} catch(Exception e) {
e.printStackTrace();
}
}
}



package puissance4;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

public class MySocket {
protected int port;
protected String ip;
protected Socket socket=null;
protected ObjectInputStream in;
protected ObjectOutputStream out;
private boolean connected=false;
private int type=0;

public MySocket(String ip, int port){
this.ip=ip;
this.port=port;
}

public boolean connect(){
System.out.println("tentative de connexion en tant que client");
try{
socket=new Socket(ip,port);
out= new ObjectOutputStream(socket.getOutputStream());
in= new ObjectInputStream(socket.getInputStream());
type=2;
System.out.println("Connexion établie en tant que client.");
}catch(UnknownHostException e){
System.err.println("Impossible de se connecter à l'adresse "+ip);
return connectServeur();
}catch (IOException e){
System.err.println("Aucun serveur à l'écoute du port "+port);
return connectServeur();
}
connected=true;
return true;
}

public boolean connectServeur(){
System.out.println("début de l'écoute en tant que serveur");
ServerSocket socketserver=null;
try {
socketserver = new ServerSocket(port);
} catch (IOException e1) {
e1.printStackTrace();
}
try{
if(socket==null){
socket=socketserver.accept();
in= new ObjectInputStream(socket.getInputStream());
out= new ObjectOutputStream(socket.getOutputStream());
type=1;
System.out.println("Connexion établie en tant que serveur.");
}
}catch(IOException e){
System.err.println("Erreur serveur");
connected=false;
return false;
}
connected=true;
return true;
}

public void send(Comm tmp){
try {
out.writeObject(tmp);
} catch (IOException e) {
System.out.println("erreur d'envoi");
//e.printStackTrace();
}
System.out.println("envoi");
}

public Comm recieve(){
Comm tmp=null;
while(tmp==null){
try {
tmp = (Comm) in.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
System.out.println("reception");
return tmp;
}

public static String getLocalHost(){
InetAddress ip=null;
try {
ip = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
}
return ip.getHostAddress();
}

public boolean isConnected() {
return connected;
}

}


Ce qui est bizzare, c'est que lorsque dans la classe Joueur je met ceci en commentaire:


// connexion
socket=new MySocket(MySocket.getLocalHost(),2001);
socket.connect();
while(!socket.isConnected()){
try {
Thread.sleep(10);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
running=true;
listen();


Et bien la l'interface se lance correctement... C'est quand même bizarre vu que le bout de code qui charge l'interface se trouve avant ces lignes...
Enfin voila, je suis un peu perdu...

J'espère que vous pourrez m'aider, si vous avez besoin de tout le code, voici un lien: <lien url="http://www.zshare.net/download/8381752114b932f5/">Puissance 4</lien>

2 réponses

Utilisateur anonyme
12 déc. 2010 à 21:40
Bonsoir

Il ne faut pas appeler une méthode qui peut prendre beaucoup de temps sur l'Event Dispatching Thread, ça va geler tout l'affichage. Par exemple, évite d'appeler listen() avec une boucle qui peut durer très longtemps dans un ActionListener. Ce que tu mets à la fin n'est pas bizarre, c'est logique quand on sait comment fonctionne les processus légers et l'affichage en Java.

Au passage, tu n'as pas besoin d'une référence sur toi-même contrairement à ce que tu écris dans ton code, tu peux faire "joueur.this" à la place.









TUER : http://tuer.sourceforge.net/tuer.jnlp

yeah! vive java
3
napstero Messages postés 3 Date d'inscription mardi 13 avril 2010 Statut Membre Dernière intervention 15 décembre 2010
15 déc. 2010 à 16:39
Merci, ça fonctionne
0
Rejoignez-nous