[EDIT]: I am going to just insert all of my code into this now, as I am getting desperate and I have no idea how to fix my problems. Not only that, it seems to me (judging from earlier comments), that seeing the entire code could be helpful for the amazing people who try to help me out with this.
[Start of original post]: I'm currently making a game in Eclipse to practise for school. However, I've got 2 problems that I just can't seem to figure out (at least one of them) and I could really use some help.
I have a project with 3 classes; the main creates a frame and nothing more, really. The second class creates a panel with components and uses a JTextField to get a number from the user; the number is between 1 and 20 and I can catch any exception with that for as far as I know. No problems there. The third class is a second panel with components that gets opened by clicking 'continue'. What I need to do at the moment, are 2 things - these are also my problems. 1: I need the specified number (it has already been converted to int) to be passed from class 2 to class 3. 2: I need 2 lists to be added, with sizes specified by the number.
I believe I fixed problem 1 after trying for 5 hours, but I don't see a quick way to check, so I'm continuing with problem 2 and after clicking 'continue', my third class causes the program to crash and throw a NullPointerException. I know it has to do with the lists, but I can't for the life of me find out what the problem is/problems are!
Here are some pieces of code:
Class 1:
package gedigitaliseerd;
import javax.swing.JFrame; //javax = java extra
public class StartFrame extends JFrame //zeg dat het een systeemklasse is.
{
public StartFrame() //constructor
{
setSize(400, 250); //bepaal de grootte
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //met dit is afsluiten van een progje nooit een probleem
setTitle("Game 2-cousins"); //geef een titel mee in de titelbalk
setResizable(false); //nu kan de gebruiker het venster niet vergroten of verkleinen
//centreer het frame op je monitor
setLocationRelativeTo(null);
//hoe laadt je het paneel in het frame?
//maak een paneelklasse om dat te doen
//dit is dus om een koppeling te maken tussen frame en paneel
add(new StartFramePaneel(this /* deze this is nodig voor het paneel en het sluiten van dit frame. this is de class waar hij op dit moment in zit*/)); //waarom ook alweer al die haken?
setVisible(true);
}
public static void main(String[] args) //main method
{
new StartFrame(); //maak nieuw object. je hoeft niet te zeggen frame pietje is new frame. je hoeft geen naam te gebruiken
}
}
// header, constructor, de rest. is makkelijker voor het oog
[The entire class now] Class 2 (StartFramePaneel) method at the bottom, with aantalCharacters
being what needs to be passed. The parsing, which happens in the ActionEvent
, isn't included in what I pasted below, because it parses without a problem. I can even get a pop-up asking if you wish to continue with your specified number of characters; if you click the continue button. If you then click 'yes', without all my passing and list stuff it shows the next panel perfectly fine, but if I add all the stuff I pasted below, it crashes after continue-->yes
package gedigitaliseerd;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; //voor eventafhandeling
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class StartFramePaneel extends JPanel implements ActionListener
{
private JTextField invoerVeld; //goede naamgeving is heel belangrijk
private JLabel vraagVeld1;
private JLabel vraagVeld2;
private JButton rulesButton;
private JButton stopButton;
private JButton continueButton;
private JPanel gridPanel1;
private JPanel gridPanel2;
private JFrame errorFrame;
private JFrame areUSureFrame;
private JFrame main; //nieuw JFrame met de naam main. voor het sluiten van de main OpstartFrame
private JFrame selectionFrame;
private int continueVraag;
private int stopVraag;
public static int aantalCharacters = 0;
//constructor
public StartFramePaneel(JFrame main)
{
setLayout(new GridLayout(2,1)); //verander de layoutmanager naar GridLayout, van 3x3 even grote cellen
//setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); //laat de Grid opvullen van 1,1 naar 1,2 naar 1,3 naar 2,1 etc
//initialiseren (stappenplan punt 2)
this.main = main; //de mainframe wordt nu toegekend aan de thispanel in de hoofdklasse.
stopButton = new JButton ("Stop");
stopButton.addActionListener(this); //(stappenplan punten 3 en 4; this geeft aan dat dit kopieerpaneel hem afhandeld.)
rulesButton = new JButton ("Rules");
rulesButton.addActionListener(this);
continueButton = new JButton ("Continue");
continueButton.addActionListener(this); //"this" betekent dat dit paneel de zaken afhandeld
//initialisatie
invoerVeld = new JTextField(5); //13 is maximale aantal karakters... meestal werkt dat zo. het is in kolommen. een tekst in quites kun je er ook in neerzetten.
invoerVeld.setHorizontalAlignment(JTextField.CENTER); //centreer de text in het invoerveld
vraagVeld1 = new JLabel("How many characters between 1 and 20 should each player have?");
vraagVeld1.setHorizontalAlignment(JLabel.CENTER); //centreer de JLabel in de layout
vraagVeld2 = new JLabel("(If you don't specify a number, 1 will be the default value)");
vraagVeld2.setHorizontalAlignment(JLabel.CENTER);
gridPanel1 = new JPanel(new GridLayout(3,1)); //object gridPanel1 aanmaken, met dezelfde GridLayout als het hoofdpaneel
gridPanel2 = new JPanel(new GridLayout(1,3));
//zichtbaar maken op het eerste (hoofd)paneel .. een paneel heeft een default en een FlowLayout, nu een GridLayout
add (gridPanel1); //in grid rij 1
add (gridPanel2); //in grid rij 2
//voeg Label en TextField toe aan gridPanel1
gridPanel1.add(vraagVeld1);
gridPanel1.add(vraagVeld2);
gridPanel1.add(invoerVeld);
//voeg de knoppen toe aan gridPanel2
gridPanel2.add (stopButton);
gridPanel2.add (rulesButton);
gridPanel2.add (continueButton);
}
//Deze methode MOET opgenomen worden, omdat er gebruik wordt gemaakt van een ActionListener
public void actionPerformed (ActionEvent ae)
{
if (ae.getSource() == continueButton)
{
try //maak een 'try' blokje aan om ongeldige invoeren tegen te gaan.
{
aantalCharacters = Integer.parseInt(invoerVeld.getText()); //het aantal karakters wordt in aantalCharacters opgeslagen,
//wanneer op continue wordt geklikt. Ook wordt de text eerst in een nummer omgezet
}
catch (NumberFormatException ongeldigeInvoer) //specificeer de exception voor ongeldige invoer
{
//JOptionPane.showMessageDialog(errorFrame, "You must use numbers"); //maak een error aan, zodat het progje niet crasht
invoerVeld.setText("");
aantalCharacters = 1;
}
if (invoerVeld.getText() == "0" || aantalCharacters == 0)
{
JOptionPane.showMessageDialog(errorFrame, "You must use numbers between 1 and 20");
invoerVeld.setText("");
}
else if (invoerVeld.getText() == "" || aantalCharacters == 0)//hier zit het probleem
{
invoerVeld.setText("");
aantalCharacters = 0;
//JOptionPane.showMessageDialog(errorFrame, "You must use numbers between 1 and 20");
}
else if (aantalCharacters < 1 || aantalCharacters > 20)
{
JOptionPane.showMessageDialog(errorFrame, "You must use numbers between 1 and 20"); //maak een error aan, zodat het progje niet crasht
invoerVeld.setText("");
aantalCharacters = 0;
}
else
{//hier wordt er een are you sure neergezet, met een actie die volgt op een ja-optie
continueVraag = JOptionPane.showConfirmDialog(areUSureFrame, "Are you sure you want to continue? You selected "+ aantalCharacters + " character(s)");
if (continueVraag == JOptionPane.YES_OPTION)
{
main.setVisible(false); //main is de thispanel in de hoofdklasse en beide worden ze onzichtbaar... geloof ik
selectionFrame = new JFrame();
selectionFrame.setSize(1000, 600);
selectionFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
selectionFrame.setLocationRelativeTo(null);
selectionFrame.setTitle("Game 2-cousins");
selectionFrame.add(new SelectionFramePaneel());
selectionFrame.setVisible(true);
}
if (continueVraag == JOptionPane.NO_OPTION)
{
invoerVeld.setText("");
}
if (continueVraag == JOptionPane.CANCEL_OPTION)
{
invoerVeld.setText("");
}
}
//lege vakjes moeten natuurlijk ingevuld zijn!
//nu moet StartFrame sluiten
//nu moet SelectionFrame opstarten
}
if (ae.getSource() == rulesButton)
{
//hier moet iets met de regelknop worden gedaan. Een nieuw frame met regels moet toevoorschijn komen. Die heb ik nog niet gemaakt.
}
if (ae.getSource() == stopButton)
{
/*stopVraag = JOptionPane.showConfirmDialog(areUSureFrame, "Are you sure you want to exit?");
if (stopVraag == JOptionPane.YES_OPTION)
{
*/System.exit(0); //het programma sluit af door op 'Stop' the drukken
/*}
if (continueVraag == JOptionPane.NO_OPTION)
{
invoerVeld.setText("");
}
if (continueVraag == JOptionPane.CANCEL_OPTION)
{
invoerVeld.setText("");
}*/
}
}
public static void passCharacters(int aantalCharacters) //maak passCharacters aan, zodat deze aangeroepen kan worden in de 3e class
{
int passCharacters = 0;
passCharacters = aantalCharacters;
}
}
[Entire class 3 now] Class 3 (SelectionFramePaneel) declarations (not all of them)
package gedigitaliseerd;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; //voor eventafhandeling
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
public class SelectionFramePaneel extends JPanel implements ActionListener
{
//declareer de componenten (stappenplan punt 1)
private JButton rulesButton;
private JButton stopButton;
private JButton continueButton;
private JCheckBox evenTheFieldP1;
private JCheckBox evenTheFieldP2;
private JPanel northPanel;
private JPanel southPanel;
private JPanel centerPanel;
private JPanel eastPanel;
private JPanel westPanel;
private JLabel player1Label;
private JLabel player2Label;
private JButton player1DiceButton;
private JButton player2DiceButton;
private JLabel player1DiceLabel;
private JLabel player2DiceLabel;
private JLabel dummyLabel1;
private JLabel dummyLabel2;
private JLabel dummyLabel3;
private JList<String> player1List;
private JList<String> player2List;
private static String[] characterArray;
private JLabel kant;
private JLabel ras;
private JLabel basisCharacter;
private JLabel speciaalCharacter1;
private JLabel speciaalCharacter2;
private JLabel speciaalCharacter3;
private JLabel extraVeld1;
private JLabel extraVeld2;
private JLabel extraVeld3;
private JLabel extraVeld4;
private int stopVraag;
private int continueVraag;
public static int gekregenCharacters;
public static int index;
public static void newStartFramePaneel() //maak methode voor het startframepaneel, om passCharacters aan te roepen.
{
StartFramePaneel.passCharacters(gekregenCharacters);
//int gezetteCharacters = gekregenCharacters; //hopelijk krijgt gekregenCharacters hier de waarde van aantalCharacters mee
characterArray = new String[gekregenCharacters];
for (int fill = 0; fill < gekregenCharacters; fill++)
{
characterArray[index]="Character "+index+1;
index++;
}
}
//constructor
public SelectionFramePaneel()
{
setLayout(new BorderLayout()); //verander de layoutmanager naar GridLayout, van 3x3 even grote cellen
//setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); //laat de Grid opvullen van 1,1 naar 1,2 naar 1,3 naar 2,1 etc
//initialiseren (stappenplan punt 2)
stopButton = new JButton ("Stop")
{
public Dimension getPreferredSize()
{
return new Dimension(200,100);
}
};
stopButton.addActionListener(this); //(stappenplan punten 3 en 4; this geeft aan dat dit kopieerpaneel hem afhandeld.)
rulesButton = new JButton ("Rules")
{
public Dimension getPreferredSize()
{
return new Dimension(200,100);
}
};
rulesButton.addActionListener(this);
continueButton = new JButton ("Continue")
{
public Dimension getPreferredSize()
{
return new Dimension(200,100);
}
};
continueButton.addActionListener(this); //"this" betekent dat dit paneel de zaken afhandeld
player1Label = new JLabel ("Player 1");
player1Label.setHorizontalAlignment(JLabel.CENTER);
player2Label = new JLabel ("Player 2");
player2Label.setHorizontalAlignment(JLabel.CENTER);
player1DiceLabel = new JLabel ("0");
player1DiceLabel.setHorizontalAlignment(JLabel.CENTER);
player2DiceLabel = new JLabel ("0");
player2DiceLabel.setHorizontalAlignment(JLabel.CENTER);
dummyLabel1 = new JLabel ("");
dummyLabel2 = new JLabel ("");
dummyLabel3 = new JLabel ("");
player1DiceButton = new JButton ("P1 Roll Dice")
{
public Dimension getPreferredSize()
{
return new Dimension(100,50);
}
};
player1DiceButton.addActionListener(this);
player2DiceButton = new JButton ("P2 Roll Dice")
{
public Dimension getPreferredSize()
{
return new Dimension(100,50);
}
};
player2DiceButton.addActionListener(this);
evenTheFieldP1 = new JCheckBox ("Even the playing field P1");
evenTheFieldP2 = new JCheckBox ("Even the playing field P2");
evenTheFieldP2.setHorizontalTextPosition(SwingConstants.LEFT);
evenTheFieldP2.setHorizontalAlignment(SwingConstants.RIGHT);
player1List = new JList<String>(characterArray); //maak de lijsten aan met (hopelijk) de arrays van grootte aantalCharacters->gekregenCharacters
player1List.setVisibleRowCount(10); //zorg dat er standaard 10 regels in del ijsten te zien zijn
player1List.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); //zorg dat altijd maar 1 element geselecteerd kan worden
player2List = new JList<String>(characterArray);
player2List.setVisibleRowCount(10);
player2List.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
extraVeld1 = new JLabel();
extraVeld2 = new JLabel();
extraVeld3 = new JLabel();
extraVeld4 = new JLabel();
kant = new JLabel("Side");
kant.setHorizontalAlignment(JLabel.CENTER);
ras = new JLabel("Category");
ras.setHorizontalAlignment(JLabel.CENTER);
basisCharacter = new JLabel("Character");
basisCharacter.setHorizontalAlignment(JLabel.CENTER);
speciaalCharacter1 = new JLabel("");
speciaalCharacter1.setHorizontalAlignment(JLabel.CENTER);
speciaalCharacter2 = new JLabel("");
speciaalCharacter2.setHorizontalAlignment(JLabel.CENTER);
speciaalCharacter3 = new JLabel("");
speciaalCharacter3.setHorizontalAlignment(JLabel.CENTER);
northPanel = new JPanel(new GridLayout(3,3));
southPanel = new JPanel(new GridLayout(1,5));
centerPanel = new JPanel(new GridLayout(6,1));
eastPanel = new JPanel(new GridLayout(3,1));
westPanel = new JPanel(new GridLayout(3,1));
southPanel.setSize(999,150);
northPanel.setSize(999,150); //deze grootte aanpassen als het scherm vergroot wordt.
add (northPanel, BorderLayout.NORTH); //een grid met nieuwe panels, met daarin de dobbelsteenvakjes en player labels en Roll Dice knoppen gaan hierin
add (southPanel, BorderLayout.SOUTH); //de knoppen gaan hierin
add (centerPanel, BorderLayout.CENTER); //de selectionlabels gaan hierin
add (eastPanel, BorderLayout.EAST); //het selectievak met aantal characters voor player 2 gaat hierin
add (westPanel, BorderLayout.WEST); //het selectievak met aantal characters voor player 1 gaat hierin
northPanel.add(player1Label);
northPanel.add(dummyLabel1);
northPanel.add(player2Label);
northPanel.add(player1DiceLabel);
northPanel.add(dummyLabel2);
northPanel.add(player2DiceLabel);
northPanel.add(player1DiceButton);
northPanel.add(dummyLabel3);
northPanel.add(player2DiceButton);
southPanel.add(evenTheFieldP1);
southPanel.add(stopButton);
southPanel.add(rulesButton);
southPanel.add(continueButton);
southPanel.add(evenTheFieldP2);
westPanel.add(player1List);
westPanel.add(extraVeld1);
westPanel.add(extraVeld2);
eastPanel.add(player2List);
eastPanel.add(extraVeld3);
eastPanel.add(extraVeld4);
centerPanel.add(kant);
centerPanel.add(ras);
centerPanel.add(basisCharacter);
centerPanel.add(speciaalCharacter1);
centerPanel.add(speciaalCharacter2);
centerPanel.add(speciaalCharacter3);
}
//Deze methode MOET opgenomen worden, omdat er gebruik wordt gemaakt van een ActionListener
public void actionPerformed (ActionEvent ae)
{
if (ae.getSource() == continueButton)
{
}
if (ae.getSource() == rulesButton)
{
//hier moet iets met de regelknop worden gedaan. Een nieuw frame met regels moet toevoorschijn komen. Die heb ik nog niet gemaakt.
}
if (ae.getSource() == stopButton)
{
/*stopVraag = JOptionPane.showConfirmDialog(areUSureFrame, "Are you sure you want to exit?");
if (stopVraag == JOptionPane.YES_OPTION)
{
*/System.exit(0); //het programma sluit af door op 'Stop' the drukken
/*}
else
{
}*/
}
}
}