Avatar billede a-torsten Nybegynder
12. maj 2003 - 09:30 Der er 3 kommentarer og
1 løsning

Nullpointer og JButton

Hvorfor giver følgende nullpointer..??

System.out.println("StartSpilKnap Enabled = " + !rmiKlient.getSpilStatus());
System.out.println("StartSpilKnap Visible = " + rmiKlient.getSpilstyre(handle));


startSpilKnap.setEnabled(!rmiKlient.getSpilStatus());   
startSpilKnap.setVisible(rmiKlient.getSpilstyre(handle));

De 2 øverste bliver udskrevet korrekt, men de 2 nederste giver ofte nullpointer (ikk altid) ...

Hvordan kan det være..?

-Anders
Avatar billede arne_v Ekspert
12. maj 2003 - 09:40 #1
Kan startSpilKnap være null ?
Avatar billede a-torsten Nybegynder
12. maj 2003 - 09:41 #2
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
Avatar billede a-torsten Nybegynder
12. maj 2003 - 10:00 #3
Hæver lige point....
Avatar billede a-torsten Nybegynder
12. maj 2003 - 10:34 #4
Lukker...

Sætter bare tråden til at sleepe et 1 sek førdt så kommer den ikk..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester