Det skal lige siges at den køres i en tråd...
Hele koden :
// KlientGUI.java
/**
* Dette er en GUI-klasse med selve spillepladen
*
* @author Team4
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.BorderFactory;
import java.util.*;
import java.rmi.*;
public class KlientGUI extends JFrame implements Runnable
{
private static final int Opdateringshastighed = 1000; // Hvor tit der skal hentes data (i ms)
private String host = "";
private static String handle;
private JTextField ordInputFelt;
private JTextField bogstavOutputFelt;
private JTextField tidsOutputFelt;
private JTextArea spillerListe;
private JTextArea ordListe;
private JButton startSpilKnap;
private JButton forladSpilKnap;
private JLabel bogstavLabel;
private JLabel overskriftLabel;
private JLabel spillerLabel;
private JLabel ordFeltLabel;
private JLabel indtastOrdLabel;
private JLabel bogstavOutputLabel;
private JLabel tidsOutputLabel;
private RMIKlient rmiKlient;
private Thread updater;
private int tid;
private int index_ord;
private int counter = 1;
private String spl;
private String[] ordArray;
private Hashtable spillere;
private boolean knapStatus = false;
private boolean knapSynlig = false;
private ExceptionHandler exceptionHandler;
/**
* Denne metode returnere spillerens navn
* @return Spillerens navn
**/
public String getNavn()
{
return handle;
}
/**
* Klassens contructoren som tager spilleres navn som parametre
* @param handle Constructoren tager et spillernavn som parameter
**/
public KlientGUI(String handle, String host)
{
exceptionHandler = new ExceptionHandler();
try
{
rmiKlient = new RMIKlient(host);
}
catch(Exception ex)
{
exceptionHandler.fejl(ex);
}
try
{
start();
}
catch(Exception ex)
{
exceptionHandler.fejl(ex);
}
this.handle = handle;
this.host = host;
setSize(800,600);
setTitle("QuickWord [" + handle + " @ " + host + "]");
setResizable(false);
centrer(this);
ImageIcon ikon = new ImageIcon("ikon.gif");
setIconImage(ikon.getImage());
// JTextFields START!!
// Felt med de tilfældige bogstaver
bogstavOutputFelt = new JTextField();
bogstavOutputFelt.setText("");
bogstavOutputFelt.setFont(new Font("Arial", Font.BOLD, 16));
bogstavOutputFelt.setEditable (false);
bogstavOutputFelt.setBackground(new Color(228,240,250));
bogstavOutputFelt.setBorder(BorderFactory.createLineBorder(Color.black));
bogstavOutputFelt.setHorizontalAlignment(JTextField.CENTER);
bogstavOutputFelt.setToolTipText("Tilgængelige bogstaver til at danne ord ud fra....");
bogstavOutputFelt.setBounds(10,100,770,40);
// Felt til indtastning af ord
FeltLytter feltLytter =new FeltLytter();
ordInputFelt = new JTextField();
ordInputFelt.setEditable (true);
ordInputFelt.setBackground(new Color(228,240,250));
ordInputFelt.setBorder(BorderFactory.createLineBorder(Color.black));
ordInputFelt.setFont(new Font("Arial", Font.BOLD, 16) );
ordInputFelt.setToolTipText("Indtast dit ord her....");
ordInputFelt.setBounds(10,175,600,30);
ordInputFelt.addActionListener (feltLytter);
// Felt til visning af tiden
tidsOutputFelt = new JTextField();
tidsOutputFelt.setText("");
tidsOutputFelt.setFont(new Font("Arial", Font.BOLD, 14));
tidsOutputFelt.setEditable (false);
tidsOutputFelt.setBackground(new Color(228,240,250));
tidsOutputFelt.setBorder(BorderFactory.createLineBorder(Color.black));
tidsOutputFelt.setHorizontalAlignment(JTextField.CENTER);
tidsOutputFelt.setToolTipText("Spiltiden....");
tidsOutputFelt.setBounds(620,370,160,30);
// JTextFields SLUT!!
// JTextArea START!!
// Liste med dannede ord
ordListe = new JTextArea();
ordListe.setEditable (false);
ordListe.setBackground(new Color(228,240,250));
JScrollPane ordListeScrollPane = new JScrollPane(ordListe);
ordListeScrollPane.setBorder(BorderFactory.createLineBorder(Color.black));
ordListe.setToolTipText("Liste med dannede ord....");
ordListeScrollPane.setBounds(10,240,600,300);
// Liste med spillere og point
spillerListe = new JTextArea();
spillerListe.setEditable (false);
spillerListe.setBackground(new Color(228,240,250));
spillerListe.setFont(new Font("Arial", Font.BOLD, 14) );
JScrollPane spillerListeScrollPane = new JScrollPane(spillerListe);
spillerListeScrollPane.setBorder(BorderFactory.createLineBorder(Color.black));
spillerListe.setToolTipText("Liste med spillere og deres point....");
spillerListeScrollPane.setBounds(620,175,160,160);
// JTextArea Slut!!
// JLabel Start!!
// Label til "QuickWord" (Overskrift)
overskriftLabel = new JLabel();
overskriftLabel.setText("QuickWord");
overskriftLabel.setFont(new Font("Arial", Font.BOLD, 42));
overskriftLabel.setForeground(new Color(255,186,0));
overskriftLabel.setBounds(10,10,300,50);
// Label til "Tilgængelige bogstaver : "
bogstavOutputLabel = new JLabel();
bogstavOutputLabel.setText("Tilgængelige bogstaver : ");
bogstavOutputLabel.setFont(new Font("Arial", Font.BOLD, 12));
bogstavOutputLabel.setForeground(new Color(255,186,0));
bogstavOutputLabel.setBounds(10,75,160,20);
// Label til "Indtast ord : "
indtastOrdLabel = new JLabel();
indtastOrdLabel.setText("Indtast ord : ");
indtastOrdLabel.setFont(new Font("Arial", Font.BOLD, 12));
indtastOrdLabel.setForeground(new Color(255,186,0));
indtastOrdLabel.setBounds(10,150,160,20);
// Label til "Dannede ord : "
ordFeltLabel = new JLabel();
ordFeltLabel.setText("Dannede ord : ");
ordFeltLabel.setFont(new Font("Arial", Font.BOLD, 12));
ordFeltLabel.setForeground(new Color(255,186,0));
ordFeltLabel.setBounds(10,215,160,20);
// Label til "Spillere : "
spillerLabel = new JLabel();
spillerLabel.setText("Spillere : ");
spillerLabel.setFont(new Font("Arial", Font.BOLD, 12));
spillerLabel.setForeground(new Color(255,186,0));
spillerLabel.setBounds(620,150,160,20);
// Label til "Tiden : "
tidsOutputLabel = new JLabel();
tidsOutputLabel.setText("Tiden : ");
tidsOutputLabel.setFont(new Font("Arial", Font.BOLD, 12));
tidsOutputLabel.setForeground(new Color(255,186,0));
tidsOutputLabel.setBounds(620,345,160,20);
// JLabel SLUT!!
// JButton START!!
// Knap til at starte spillet
HandlingsLytter knapLytter = new HandlingsLytter();
startSpilKnap = new JButton();
startSpilKnap.setText("Start Spillet");
startSpilKnap.setFont(new Font("Arial", Font.PLAIN, 14));
startSpilKnap.setBorder(BorderFactory.createLineBorder(Color.black));
startSpilKnap.setBounds(620,420,160,30);
startSpilKnap.setToolTipText("Tryk her for at starte spillet....");
startSpilKnap.setMnemonic('S');
startSpilKnap.addActionListener(knapLytter);
// Knap til at forlade spillet
forladSpilKnap = new JButton();
forladSpilKnap.setText("Forlad Spillet");
forladSpilKnap.setFont(new Font("Arial", Font.PLAIN, 14));
forladSpilKnap.setBorder(BorderFactory.createLineBorder(Color.black));
forladSpilKnap.setBounds(620,470,160,30);
forladSpilKnap.setToolTipText("Tryk her for at forlade spillet....");
forladSpilKnap.setMnemonic('F');
forladSpilKnap.addActionListener(knapLytter);
// JButton SLUT!!
Container c = getContentPane();
c.setLayout(null);
c.add(overskriftLabel);
c.add(bogstavOutputLabel);
c.add(bogstavOutputFelt);
c.add(indtastOrdLabel);
c.add(ordInputFelt);
c.add(ordFeltLabel);
c.add(ordListeScrollPane);
c.add(spillerLabel);
c.add(spillerListeScrollPane);
c.add(tidsOutputLabel);
c.add(tidsOutputFelt);
c.add(startSpilKnap);
c.add(forladSpilKnap);
c.setBackground(new Color(51,102,153));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addWindowListener(new WindowAdapter()
{
public void windowClosing (WindowEvent ev)
{
try
{
rmiKlient.fjernSpiller(getNavn());
}
catch (Exception ex)
{
exceptionHandler.fejl(ex);
}
rmiKlient = null;
index_ord = 0;
spillere = new Hashtable();
stop();
System.exit(1);
}
} // end of WindowAdapter
);
setVisible (true);
}
/**
* Dette er start-metoden til at starte tråden
**/
public synchronized void start()
{
try
{
if (updater == null)
{
tid = rmiKlient.getSpilTid();
updater = new Thread (this);
updater.start ();
}
}
catch(RemoteException ex)
{
exceptionHandler.fejl(ex);
}
}
/**
* Dette er stop-metoden til at lukke tråden
**/
public synchronized void stop()
{
if(updater != null)
{
updater.interrupt ();
updater = null;
}
}
/**
* Dette er run-metoden som tråden køre i
**/
public void run()
{
try
{
index_ord = 0;
rmiKlient.tilfoejSpiller(handle);
spillere = rmiKlient.hentSpillere();
ordArray = rmiKlient.getOrdListe(index_ord);
System.out.println("StartSpilKnap Enabled = " + !rmiKlient.getSpilStatus());
startSpilKnap.setEnabled(!rmiKlient.getSpilStatus());
System.out.println("StartSpilKnap Visible = " + rmiKlient.getSpilstyre(handle));
startSpilKnap.setVisible(rmiKlient.getSpilstyre(handle));
tid = rmiKlient.getSpilTid();
tidsOutputFelt.setText(Integer.toString(tid));
while(!Thread.interrupted())
{
spillere = rmiKlient.hentSpillere();
ordArray = rmiKlient.getOrdListe(index_ord);
startSpilKnap.setEnabled(!rmiKlient.getSpilStatus());
startSpilKnap.setVisible(rmiKlient.getSpilstyre(handle));
spillerListe.setText(opdaterSpillerFelt(spillere));
for (int i = 0; i < ordArray.length; ++ i)
ordListe.append (" " + ordArray[i] + "\n");
if(rmiKlient.getSpilStatus())
{
tid=tid-1;
bogstavOutputFelt.setText(lavMellemrum(rmiKlient.getBogstav().toUpperCase()));
tidsOutputFelt.setText(Integer.toString(tid));
ordInputFelt.setEditable(true);
ordInputFelt.setBackground(new Color(228,240,250));
ordInputFelt.requestFocus();
}
if(!rmiKlient.getSpilStatus())
{
bogstavOutputFelt.setText("");
ordInputFelt.setEditable(false);
ordInputFelt.setBackground(new Color(150,150,150));
ordListe.requestFocus();
tid = rmiKlient.getSpilTid();
}
if(tid==0)
{
rmiKlient.setSpilStatus(false);
}
index_ord += ordArray.length;
Thread.sleep(Opdateringshastighed);
System.out.println(counter);
counter++;
}//end while
}
catch (InterruptedException ignored)
{
}
catch(RemoteException ex)
{
exceptionHandler.fejl(ex);
}
}
private String opdaterSpillerFelt(Hashtable spillere)
{
spl = "";
Enumeration e = spillere.keys();
while( e.hasMoreElements() )
{
Object a = e.nextElement();
spl = spl + " " + a + " (" + spillere.get(a) + " point)\n";
}
return spl;
}
private class HandlingsLytter implements ActionListener
{
public void actionPerformed (ActionEvent ev)
{
try
{
Object source =ev.getSource();
if(rmiKlient != null)
if(source==startSpilKnap)
{
System.out.println("Status er " + rmiKlient.getSpilStatus());
rmiKlient.startNytSpil();
rmiKlient.setSpilStatus(true);
tid = rmiKlient.getSpilTid();
}
if(source==forladSpilKnap)
{
rmiKlient.fjernSpiller(getNavn());
stop ();
System.exit(1);
}
}
catch(RemoteException ex)
{
exceptionHandler.fejl(ex);
}
}
}
private class FeltLytter implements ActionListener
{
public void actionPerformed (ActionEvent ev)
{
try
{
if (rmiKlient != null)
{
rmiKlient.tjekOrd(ev.getActionCommand().toLowerCase(),handle);
ordInputFelt.setText ("");
}
}
catch(RemoteException ex)
{
exceptionHandler.fejl(ex);
}
}
}
/**
* Dette er metode til at centrerer GUI´en på skærmen
* @param vindue Tager et vindue af typen JFrame som parameter
**/
public void centrer(JFrame vindue)
{
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x=(int)((d.getWidth()-vindue.getWidth())/2);
int y=(int)((d.getHeight()-vindue.getHeight())/2);
vindue.setLocation(x,y);
}
/**
* Dette er metode lave mellemrum i en streng
* @param streng Tager en String som parameter
* @return Strengen med mellemrum mellem hver bogstav
**/
public String lavMellemrum(String streng)
{
String mStreng = "";
for(int i = 0; i < streng.length();i++)
mStreng += " " + streng.charAt(i);
return mStreng;
}
}//end class RMIClient