重置按钮 Dicetester 无法正常工作
Resetbutton Dicetester not working properly
我需要为学校制作一个骰子机。
该应用程序显示图形和掷出的数字的骰子,并将这些数字放入一个 int 数组中。重置按钮需要清除此数组并更新界面,但这似乎不起作用。
它给出了以下错误代码:
线程异常 "AWT-EventQueue-0" java.lang.NullPointerException
public class DiceModel extends Observable {
private int[] numbers;
private int totalThrows;
private int currentThrow;
private boolean diceEnabled;
private boolean graphView;
/**
* Initialize dice model
*/
public DiceModel() {
numbers = new int[6];
currentThrow = 0;
diceEnabled = false;
graphView = true;
}
//addObserver(view);
public void addObs(DiceView x){
addObserver(x);
}
public void addObs(DiceGraphView x){
addObserver(x);
}
public void addObs(DiceTableView x){
addObserver(x);
}
/**
*
* @return last thrown number
*/
public int getCurrentThrow() {
return currentThrow;
}
/**
* notifyObservers, add number to array
* @param x Number to add
*/
public void addNumber(int x) {
totalThrows++;
currentThrow = x;
//zet het randomnummer in de arraylist
int i = numbers[x];
numbers[x] = ++i;
setChanged();
notifyObservers();
}
public void clearArray(){
numbers = null;
setChanged();
}
/**
*
* @return the most thrown number
*/
public int getMaxNumber() {
int x = 0;
for(int i = 0; i < 6; i++)
if(numbers[i] > x)
x = numbers[i];
return x;
}
/**
*
* @param n
* @return Number of thrown n
*/
public int getNumber(int n) {
if(n >= 0 && n < 6)
return numbers[n];
else
return 0;
}
/**
*
* @return total thrown numbers
*/
public int getTotalThrows() {
return totalThrows;
}
/**
*
* @return average
*/
public int getAverage() {
int x = 0;
for(int i = 0; i < 6; i++)
if(numbers[i] > 0)
x += numbers[i]*(i+1);
return x/totalThrows;
}
/**
*
* @return boolean diceEnabled
*/
public boolean isDiceEnabled() {
return diceEnabled;
}
/**
* Switch diceEnabled and notifyObservers
*/
public void switchDiceEnabled() {
diceEnabled = !diceEnabled;
setChanged();
notifyObservers();
}
/**
*
* @return boolean graphView
*/
public boolean isGraphView() {
return graphView;
}
/**
* Switch frequency table and
*/
public void switchView() {
graphView = !graphView;
setChanged();
notifyObservers();
}
}
public class DiceView extends JPanel implements Observer {
private DiceModel model;
private DiceGraphView graphView;
private DiceTableView tableView;
private boolean isGraphView;
private BorderLayout layout;
private Panel panel;
/**
* Initialize dice view and add graphView
* @param model Add dice model for mvc
*/
DiceView(DiceModel model){
this.model = model;
isGraphView = model.isGraphView();
graphView = new DiceGraphView(model);
tableView = new DiceTableView(model);
model.addObs(graphView);
model.addObs(tableView);
setLayout(new BorderLayout());
panel = new Panel();
layout = new BorderLayout();
panel.setLayout(layout);
panel.add(graphView,BorderLayout.CENTER);
add(panel, BorderLayout.CENTER);
}
/**
* Check if view has changed from model
* @param obs
* @param x
*/
public void update(Observable obs, Object x)
{
if(isGraphView != model.isGraphView()) {
isGraphView = model.isGraphView();
switchView();
}
}
/**
* Removes views from panel and add graph or table view
* Revalidate panel and repaint panel.
*/
public void switchView() {
panel.removeAll();
if(isGraphView) {
panel.add(graphView, BorderLayout.CENTER);
} else {
panel.add(tableView,BorderLayout.CENTER);
}
panel.revalidate();
panel.repaint();
}
}
public class DiceControl extends JPanel implements ChangeListener,ActionListener {
private JButton start;
private JButton stop;
private JButton showDice;
private JButton switchView;
private JButton reset;
private JSlider delay;
private JTextField speed;
private DiceModel model;
private DiceControl control;
private Timer timer;
private Random randomGenerator;
private JLabel info;
/**
* Initialize dice control
* @param model Add dice model for mvc
*/
public DiceControl(DiceModel model)
{
this.model = model;
control = this; // timer needs control
randomGenerator = new Random(); //maak nieuwe random
//maak alle button's etc.
info = new JLabel("Total throws 0, average 0");
start = new JButton("Start");
stop = new JButton("Stop");
reset = new JButton("Reset");
showDice = new JButton("Show / hide dice");
switchView = new JButton("Switch view");
speed = new JTextField("500 ms");
speed.setEditable(false);
speed.setColumns(5);
delay = new JSlider(JSlider.HORIZONTAL, 1, 40,25);
delay.addChangeListener(this);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(5,5,5,5); //van alle kanten 5 van de kant.
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.gridx = 0;
gbc.gridy = 0;
add(start, gbc);
gbc.gridx++; //x as ++ anders overlappen de buttons.
add(stop, gbc);
gbc.gridx++;
add(reset, gbc);
gbc.gridx++;
add(showDice, gbc);
gbc.gridx++;
add(switchView, gbc);
gbc.gridx = 0;
gbc.gridy++;
gbc.gridwidth = 4;
gbc.fill = GridBagConstraints.HORIZONTAL;
Panel panel = new Panel();
panel.setLayout(new BorderLayout());
panel.add(delay, BorderLayout.CENTER);
panel.add(speed, BorderLayout.EAST);
add(panel, gbc);
gbc.gridy++;
gbc.gridx=3;
gbc.gridwidth=1;
add(info,gbc);
//connect de objecten met de button dmv addActionListener() method.
start.addActionListener(new Start());
stop.addActionListener(new Stop());
reset.addActionListener(new Reset());
showDice.addActionListener(new SwitchDice());
switchView.addActionListener(new SwitchView());
}
/**
* Slicer value has changed
* @param e
*/
public void stateChanged(ChangeEvent e) {
//als de slider value verandert is verander de snelheid weergegeven op het label
speed.setText((delay.getValue()*50)+" ms"); //maal 50 want jslider loopt van 1-40
}
public void update()
{
//update de info
info.setText("Total throws "+model.getTotalThrows()+", average "+model.getAverage());
}
/**
* Timer has triggered event
* add random number to model
* @param event
*/
public void actionPerformed(ActionEvent event)
{
int randomInt = randomGenerator.nextInt(6); //tussen de 0 inc en 6 ex
model.addNumber(randomInt);
//add het nummer in de arraylist in de class DiceModel
update();
System.out.println(randomInt+1);
}
class Start implements ActionListener
{
public void actionPerformed(ActionEvent event) {
if (timer == null || !timer.isRunning())
{
timer = new Timer(delay.getValue() * 50, control);
timer.start();
}
start.setEnabled(false);
stop.setEnabled(true);
}
}
class Stop implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
if(timer != null && timer.isRunning()) {
timer.stop();
}
start.setEnabled(true);
stop.setEnabled(false);
}
}
class Reset implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
timer.stop();
model.clearArray();
start.setEnabled(true);
stop.setEnabled(false);
}
}
class SwitchDice implements ActionListener
{
public void actionPerformed(ActionEvent event){
model.switchDiceEnabled();
}
}
class SwitchView implements ActionListener
{
public void actionPerformed(ActionEvent event) { model.switchView(); }
}
}
问题是:您在 clearArray() 中用空对象重置了数组。相反,您必须清除它或至少创建一个像这样的新数组:
numbers = new int[6];
我需要为学校制作一个骰子机。 该应用程序显示图形和掷出的数字的骰子,并将这些数字放入一个 int 数组中。重置按钮需要清除此数组并更新界面,但这似乎不起作用。
它给出了以下错误代码: 线程异常 "AWT-EventQueue-0" java.lang.NullPointerException
public class DiceModel extends Observable {
private int[] numbers;
private int totalThrows;
private int currentThrow;
private boolean diceEnabled;
private boolean graphView;
/**
* Initialize dice model
*/
public DiceModel() {
numbers = new int[6];
currentThrow = 0;
diceEnabled = false;
graphView = true;
}
//addObserver(view);
public void addObs(DiceView x){
addObserver(x);
}
public void addObs(DiceGraphView x){
addObserver(x);
}
public void addObs(DiceTableView x){
addObserver(x);
}
/**
*
* @return last thrown number
*/
public int getCurrentThrow() {
return currentThrow;
}
/**
* notifyObservers, add number to array
* @param x Number to add
*/
public void addNumber(int x) {
totalThrows++;
currentThrow = x;
//zet het randomnummer in de arraylist
int i = numbers[x];
numbers[x] = ++i;
setChanged();
notifyObservers();
}
public void clearArray(){
numbers = null;
setChanged();
}
/**
*
* @return the most thrown number
*/
public int getMaxNumber() {
int x = 0;
for(int i = 0; i < 6; i++)
if(numbers[i] > x)
x = numbers[i];
return x;
}
/**
*
* @param n
* @return Number of thrown n
*/
public int getNumber(int n) {
if(n >= 0 && n < 6)
return numbers[n];
else
return 0;
}
/**
*
* @return total thrown numbers
*/
public int getTotalThrows() {
return totalThrows;
}
/**
*
* @return average
*/
public int getAverage() {
int x = 0;
for(int i = 0; i < 6; i++)
if(numbers[i] > 0)
x += numbers[i]*(i+1);
return x/totalThrows;
}
/**
*
* @return boolean diceEnabled
*/
public boolean isDiceEnabled() {
return diceEnabled;
}
/**
* Switch diceEnabled and notifyObservers
*/
public void switchDiceEnabled() {
diceEnabled = !diceEnabled;
setChanged();
notifyObservers();
}
/**
*
* @return boolean graphView
*/
public boolean isGraphView() {
return graphView;
}
/**
* Switch frequency table and
*/
public void switchView() {
graphView = !graphView;
setChanged();
notifyObservers();
}
}
public class DiceView extends JPanel implements Observer {
private DiceModel model;
private DiceGraphView graphView;
private DiceTableView tableView;
private boolean isGraphView;
private BorderLayout layout;
private Panel panel;
/**
* Initialize dice view and add graphView
* @param model Add dice model for mvc
*/
DiceView(DiceModel model){
this.model = model;
isGraphView = model.isGraphView();
graphView = new DiceGraphView(model);
tableView = new DiceTableView(model);
model.addObs(graphView);
model.addObs(tableView);
setLayout(new BorderLayout());
panel = new Panel();
layout = new BorderLayout();
panel.setLayout(layout);
panel.add(graphView,BorderLayout.CENTER);
add(panel, BorderLayout.CENTER);
}
/**
* Check if view has changed from model
* @param obs
* @param x
*/
public void update(Observable obs, Object x)
{
if(isGraphView != model.isGraphView()) {
isGraphView = model.isGraphView();
switchView();
}
}
/**
* Removes views from panel and add graph or table view
* Revalidate panel and repaint panel.
*/
public void switchView() {
panel.removeAll();
if(isGraphView) {
panel.add(graphView, BorderLayout.CENTER);
} else {
panel.add(tableView,BorderLayout.CENTER);
}
panel.revalidate();
panel.repaint();
}
}
public class DiceControl extends JPanel implements ChangeListener,ActionListener {
private JButton start;
private JButton stop;
private JButton showDice;
private JButton switchView;
private JButton reset;
private JSlider delay;
private JTextField speed;
private DiceModel model;
private DiceControl control;
private Timer timer;
private Random randomGenerator;
private JLabel info;
/**
* Initialize dice control
* @param model Add dice model for mvc
*/
public DiceControl(DiceModel model)
{
this.model = model;
control = this; // timer needs control
randomGenerator = new Random(); //maak nieuwe random
//maak alle button's etc.
info = new JLabel("Total throws 0, average 0");
start = new JButton("Start");
stop = new JButton("Stop");
reset = new JButton("Reset");
showDice = new JButton("Show / hide dice");
switchView = new JButton("Switch view");
speed = new JTextField("500 ms");
speed.setEditable(false);
speed.setColumns(5);
delay = new JSlider(JSlider.HORIZONTAL, 1, 40,25);
delay.addChangeListener(this);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(5,5,5,5); //van alle kanten 5 van de kant.
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.gridx = 0;
gbc.gridy = 0;
add(start, gbc);
gbc.gridx++; //x as ++ anders overlappen de buttons.
add(stop, gbc);
gbc.gridx++;
add(reset, gbc);
gbc.gridx++;
add(showDice, gbc);
gbc.gridx++;
add(switchView, gbc);
gbc.gridx = 0;
gbc.gridy++;
gbc.gridwidth = 4;
gbc.fill = GridBagConstraints.HORIZONTAL;
Panel panel = new Panel();
panel.setLayout(new BorderLayout());
panel.add(delay, BorderLayout.CENTER);
panel.add(speed, BorderLayout.EAST);
add(panel, gbc);
gbc.gridy++;
gbc.gridx=3;
gbc.gridwidth=1;
add(info,gbc);
//connect de objecten met de button dmv addActionListener() method.
start.addActionListener(new Start());
stop.addActionListener(new Stop());
reset.addActionListener(new Reset());
showDice.addActionListener(new SwitchDice());
switchView.addActionListener(new SwitchView());
}
/**
* Slicer value has changed
* @param e
*/
public void stateChanged(ChangeEvent e) {
//als de slider value verandert is verander de snelheid weergegeven op het label
speed.setText((delay.getValue()*50)+" ms"); //maal 50 want jslider loopt van 1-40
}
public void update()
{
//update de info
info.setText("Total throws "+model.getTotalThrows()+", average "+model.getAverage());
}
/**
* Timer has triggered event
* add random number to model
* @param event
*/
public void actionPerformed(ActionEvent event)
{
int randomInt = randomGenerator.nextInt(6); //tussen de 0 inc en 6 ex
model.addNumber(randomInt);
//add het nummer in de arraylist in de class DiceModel
update();
System.out.println(randomInt+1);
}
class Start implements ActionListener
{
public void actionPerformed(ActionEvent event) {
if (timer == null || !timer.isRunning())
{
timer = new Timer(delay.getValue() * 50, control);
timer.start();
}
start.setEnabled(false);
stop.setEnabled(true);
}
}
class Stop implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
if(timer != null && timer.isRunning()) {
timer.stop();
}
start.setEnabled(true);
stop.setEnabled(false);
}
}
class Reset implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
timer.stop();
model.clearArray();
start.setEnabled(true);
stop.setEnabled(false);
}
}
class SwitchDice implements ActionListener
{
public void actionPerformed(ActionEvent event){
model.switchDiceEnabled();
}
}
class SwitchView implements ActionListener
{
public void actionPerformed(ActionEvent event) { model.switchView(); }
}
}
问题是:您在 clearArray() 中用空对象重置了数组。相反,您必须清除它或至少创建一个像这样的新数组:
numbers = new int[6];