the situation is the following.
I have this class:
package it.polimi.client.view.gui.phases;
import it.polimi.client.controller.ControllerClient;
import it.polimi.client.exceptions.BadInputException;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class ChoiceGameTypePhase extends GuiPhase {
ControllerClient controllerClient;
public static JFrame frame;
private String typeGame;
public ChoiceGameTypePhase(ControllerClient controllerClient) {
super();
this.controllerClient = controllerClient;
}
@Override
public void exec() {
initialize();
}
private void initialize() {
frame = new JFrame("ciao");
frame.setBounds(100, 100, 345, 260);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
JLabel lblChoiceRules = new JLabel("choose which rules to use");
lblChoiceRules.setBounds(38, 44, 152, 14);
frame.getContentPane().add(lblChoiceRules);
/*JRadioButton rdbtnSimple = new JRadioButton("simple");
rdbtnSimple.setBounds(203, 40, 88, 23);
rdbtnSimple.addActionListener(/new RdbtnBase());
frame.getContentPane().add(rdbtnSimple);
JRadioButton rdbtnComplete = new JRadioButton("complete");
rdbtnComplete.setBounds(203, 66, 88, 23);
rdbtnComplete.addActionListener(new RdbtnAdvanced());
frame.getContentPane().add(rdbtnComplete);
JRadioButton rdbtnOldSchool = new JRadioButton("old school");
rdbtnOldSchool.setBounds(203, 92, 88, 23);
rdbtnOldSchool.addActionListener(new RdbtnOldSchool());
frame.getContentPane().add(rdbtnOldSchool);
JRadioButton rdbtnInfection = new JRadioButton("infection");
rdbtnInfection.setBounds(203, 118, 88, 23);
rdbtnInfection.addActionListener(new RdbtnInfection());
frame.getContentPane().add(rdbtnInfection);
JRadioButton rdbtnArena = new JRadioButton("arena");
rdbtnArena.setBounds(203, 144, 88, 23);
rdbtnArena.addActionListener(new RdbtnArena());
frame.getContentPane().add(rdbtnArena);
ButtonGroup bg = new ButtonGroup();
bg.add(rdbtnSimple);
bg.add(rdbtnComplete);
bg.add(rdbtnOldSchool);
bg.add(rdbtnInfection);
bg.add(rdbtnArena);
JButton btnBack = new JButton("BACK");
btnBack.setBounds(10, 196, 89, 25);
btnBack.addActionListener(new Back());
frame.getContentPane().add(btnBack);
JButton btnNext = new JButton("NEXT");
btnNext.setBounds(240, 196, 89, 25);
btnNext.addActionListener(new Next());
frame.getContentPane().add(btnNext);*/
Dimension screenSize = Toolkit.getDefaultToolkit ().getScreenSize ();
Dimension frameSize = frame.getSize ();
frame.setLocation ((screenSize.width - frameSize.width) / 2 , (screenSize.height - frameSize.height) / 2);
frame.setVisible(true);
}
private class RdbtnBase implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
typeGame = e.getActionCommand();
}
}
private class RdbtnAdvanced implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
typeGame = e.getActionCommand();
}
}
private class RdbtnOldSchool implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
typeGame = e.getActionCommand();
}
}
private class RdbtnInfection implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
typeGame = e.getActionCommand();
}
}
private class RdbtnArena implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
typeGame = e.getActionCommand();
}
}
private class Back implements ActionListener {
@Override
public void actionPerformed(ActionEvent arg0) {
ChoiceGameTypePhase.closeFrame();
ChoiceConnectionPhase choiceConnectionPhase = new ChoiceConnectionPhase();
choiceConnectionPhase.exec();
}
}
private class Next implements ActionListener{
@Override
public void actionPerformed(ActionEvent arg0) {
if (typeGame != null ) {
try {
System.out.println(typeGame);
controllerClient.controlGameType(typeGame);
} catch (BadInputException e) {
JOptionPane.showMessageDialog(null, "<html><p align='center' width='150'>" + e.getMessage() + "</p></html>", "messagge", JOptionPane.ERROR_MESSAGE);
}
}
else {
JOptionPane.showMessageDialog(null, "<html><p align='center' width='150'>No field selected</p></html>", "messagge", JOptionPane.ERROR_MESSAGE);
}
}
}
public static void closeFrame() {
ChoiceGameTypePhase.frame.dispose();
}
}
which creates a JFrame and shows a window. The class is called in this other class at "phase.exec()":
package it.polimi.client.view;
import it.polimi.client.Session;
import it.polimi.client.controller.ControllerClient;
import it.polimi.client.phases.Phase;
import it.polimi.server.observer.Event;
import it.polimi.server.observer.Observable;
import it.polimi.server.observer.Observer;
import java.net.Socket;
public abstract class HandleNotifiesFromServer implements Observer {
protected Session session;
protected Phase phase;
String eventMessage;
public HandleNotifiesFromServer(Socket socketServer, ControllerClient controllerClient) {
this.session = new Session(socketServer, controllerClient);
getstartedToHandle();
}
public void writeServerMessageAndlaunchPhaseCorrespondentBehaviour() {
System.out.println(eventMessage);
phase.exec();
}
public void parseServerString(String serverString) {
//Divido la stringa serverString in sottostringhe -> Phase:EventMessage
String[] serverStringSubstrings = serverString.split(":");
assert serverStringSubstrings.length == 2 : "[ASSERTION ERROR] Creato un array di sottostringhe dalla stringa ricevuta dal server con dimensione diversa 2."
+ "Dimensione =" + serverStringSubstrings.length ;
buildPhaseObjectDependingOnServerPhase(serverStringSubstrings[0]);
eventMessage = serverStringSubstrings[1];
writeServerMessageAndlaunchPhaseCorrespondentBehaviour();
}
public String getEventMessage() {
return eventMessage;
}
@Override
public void notify(Observable source, Event event) {
parseServerString(event.getMsg());
}
private void registerToEventReceiveGateway(){
session.getEventReceiveGateway().register(this);
}
private void getstartedToHandle() {
registerToEventReceiveGateway();
session.getEventReceiveGateway().startReadingFromSocket();
}
public Session getSession() {
return session;
}
public void setSession(Session session) {
this.session = session;
}
public abstract void buildPhaseObjectDependingOnServerPhase(String phase);
}
While the "phase" variable of the previous class is setted in another class depending on what the server sends.
An "HandleNotifiesFromServer" instance (or better an istance of his subclass: "GuiHandleNotifiesFromServer") is created, instead, in this class:
package it.polimi.client.controller;
import it.polimi.client.exceptions.BadInputException;
//import it.polimi.client.phases.Phase;
import it.polimi.client.view.gui.GuiHandleNotifiesFromServer;
import it.polimi.client.view.gui.phases.ChoiceConnectionPhase;
import it.polimi.client.view.gui.phases.ChoiceGameTypePhase;
import it.polimi.client.view.gui.phases.ChoiceNicknamePhase;
import it.polimi.client.view.gui.phases.SimpleGamePhase;
import it.polimi.client.view.util.SocketWriter;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JOptionPane;
public class ControllerClientGui extends ControllerClient {
public ControllerClientGui() {
super();
}
@Override
public void controlConnection(String userInput) throws BadInputException {
switch (userInput) {
case "SOCKET":
try {
Socket socketServer = createSocket();
this.socketWriter = new SocketWriter(socketServer);
ChoiceConnectionPhase.closeFrame();
new GuiHandleNotifiesFromServer(socketServer, this);
} catch (UnknownHostException e) {
JOptionPane.showMessageDialog(null, "<html><p align='center' width='150'>Error creating socket</p></html>", "messagge", JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "<html><p align='center' width='150'>Error creating socket</p></html>", "messagge", JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
break;
case "RMI":
ChoiceConnectionPhase.closeFrame();
ChoiceGameTypePhase choiceGameTypePhaseRmi = new ChoiceGameTypePhase(this);
choiceGameTypePhaseRmi.exec();
break;
}
}
@Override
public void controlGameType(String userInput) throws BadInputException {
System.out.println(userInput);
//socketWriter.printLineStringOnSocket("GameType:" + userInput);
ChoiceGameTypePhase.closeFrame();
ChoiceNicknamePhase choiceNicknamePhase = new ChoiceNicknamePhase(this);
choiceNicknamePhase.exec();
}
@Override
public void controlNickname(String userInput) {
if (userInput.matches("[a-zA-Z]+")) {
//socketWriter.printLineStringOnSocket("Nickname:" + userInput);
ChoiceNicknamePhase.closeFrame();
SimpleGamePhase simpleGamePhase = new SimpleGamePhase(this);
simpleGamePhase.exec();
}
else {
JOptionPane.showMessageDialog(null, "<html><p align='center' width='150'>enter username [only character]</p></html>", "messagge", JOptionPane.ERROR_MESSAGE);
}
}
@Override
public void controlSimpleGame(String userInput) {
}
@Override
public void controlCompleteGame(String userInput) {
// TODO Auto-generated method stub
}
@Override
public void controlMove(String userInput) {
// TODO Auto-generated method stub
}
@Override
public void controlNoise(String userInput) {
// TODO Auto-generated method stub
}
@Override
public void controlUseItem(String userInput) {
// TODO Auto-generated method stub
}
@Override
public void controlListRounds(String userInput) {
// TODO Auto-generated method stub
}
@Override
public void controlPossibleMovementsOpponents(String userInput) {
// TODO Auto-generated method stub
}
@Override
public void controlEndTurn(String userInput) {
// TODO Auto-generated method stub
}
@Override
public void controlTimer(String userInput) {
// TODO Auto-generated method stub
}
@Override
public void controlExit(String userInput) {
// TODO Auto-generated method stub
}
@Override
public void controlAttack(String userInput) {
// TODO Auto-generated method stub
}
}
When I run I can see only a blank JFrame window, I can't see any of the element added to pane.
Very strange thing is that if I edit "ControllerClientGui" class this way:
//...
switch (userInput) {
case "SOCKET":
try {
Socket socketServer = createSocket();
this.socketWriter = new SocketWriter(socketServer);
ChoiceGameTypePhase choiceGameTypePhaseSocket = new ChoiceGameTypePhase(this);`
choiceGameTypePhaseSocket.exec();
} catch (UnknownHostException e) {
//...
creating the phase directly in the GuiController end executing it the very next line, I can correctly see the window with all elements inside...
... I really don't know what to think, debugged all day and got nothing, can you help?
I closed the frame 'cause my idea was of opening a window for every "phase", where the correct phase is sended by the server through the socket. As asked, this is the content of GuiHandleNotifiesFromServer:
package it.polimi.client.view.gui;
import java.net.Socket;
import it.polimi.client.controller.ControllerClient;
import it.polimi.client.view.HandleNotifiesFromServer;
import it.polimi.client.view.gui.phases.ChoiceGameTypePhase;
import it.polimi.client.view.gui.phases.ChoiceNicknamePhase;
import it.polimi.client.view.gui.phases.SimpleGamePhase;
public class GuiHandleNotifiesFromServer extends HandleNotifiesFromServer {
public GuiHandleNotifiesFromServer(Socket socketServer, ControllerClient controllerClient) {
super(socketServer, controllerClient);
}
@Override
public void buildPhaseObjectDependingOnServerPhase(String phase) {
switch(phase) {
case "InsertGameTypePhase":
System.out.println(session.getControllerClient() + " " + phase + " DEBUG buildPhaseObjectDependingOnServerPhase");
this.phase = new ChoiceGameTypePhase(session.getControllerClient());
break;
case "InsertNicknamePhase":
this.phase = new ChoiceNicknamePhase(session.getControllerClient());
break;
case "InsertSimpleGamePhase ":
this.phase = new SimpleGamePhase(session.getControllerClient());
break;
}
}
}