[英]I'm really having trouble figuring out how to make my GUI window display the values in the array
如果有人可以向正确的方向推动我,那将是很棒的。
或告诉我是否需要重做一些内容。
这是掷骰子的程序。 我正在尝试在eDieField中显示每个“卷”。
这是课程:
import java.util.Random;
public class dice
{
private int times;
private int roll;
private int side;
public int[] each;
Random roller = new Random();
public void setTimes(int rolls)
{
times = rolls;
}
public void setSides(int die)
{
side = die;
}
public int getRoll()
{
int[] each = new int[times];
int total = 0;
int c = 0;
int i = 0;
while (c < times)
{
c = c + 1;
roll = roller.nextInt(side);
roll = roll + 1;
each[i] = roll;
total = total + roll;
System.out.print(each[i] + " ");
i = i + 1;
}
return total;
}
public int getEach()
{
return each[/*each number in the array*/];
}
}
这是GUIWindow:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class GUIWindow extends JFrame
{
private dice dices = new dice();
private JLabel dice = new JLabel("# of Dice");
private JLabel sides = new JLabel("# of Sides");
private JLabel total = new JLabel("Total:");
private JTextField diceField = new JTextField("");
private JTextField sideField = new JTextField("");
private JTextField totField = new JTextField("");
private JButton button = new JButton ("Roll!");
private JTextField eDieField = new JTextField("");
private JLabel empt = new JLabel("Here is each roll");
// Constructor
public GUIWindow()
{
JPanel dataPanel = new JPanel(new GridLayout(2, 2, 12, 6));
dataPanel.add(dice);
dataPanel.add(sides);
dataPanel.add(diceField);
dataPanel.add(sideField);
JPanel rPanel = new JPanel(new GridLayout(1, 3, 12, 6));
rPanel.add(button);
rPanel.add(total);
rPanel.add(totField);
JPanel eDiePan = new JPanel(new GridLayout(2, 1, 12, 6));
eDiePan.add(empt);
eDiePan.add(eDieField);
Container container = getContentPane();
container.add(dataPanel, BorderLayout.WEST);
container.add(rPanel, BorderLayout.EAST);
container.add(eDiePan, BorderLayout.SOUTH);
button.addActionListener(new dieListener());
}
// >>>>>>> The controller <<<<<<<<
private class dieListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
try
{
String input = diceField.getText();
int die = Integer.parseInt(input);
dices.setTimes(die);
String inputa = sideField.getText();
int side = Integer.parseInt(inputa);
dices.setSides(side);
int tot = dices.getRoll();
totField.setText("" + tot);
}
catch(Exception ex)
{
JOptionPane.showMessageDialog(GUIWindow.this,
"Sorry,\nyou can do that with dice.",
"Dice Fail",
JOptionPane.ERROR_MESSAGE);
}
int eachd = dices.getEach();
eDieField.setText("" + eachd);
}
}
}
主要:
import javax.swing.*;
public class diceRoller
{
public static void main(String[] args)
{
GUIWindow theGUI = new GUIWindow();
theGUI.setTitle("Dice Roller");
theGUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
theGUI.pack();
theGUI.setVisible(true);
}
}
我希望这不是坏行为,也不是什么,我只是不知道该怎么办。 (而我那愚蠢的教科书是没有用的)假设您输入4个骰子,每个骰子有4个面,并且如果您用手滚动它们,则该数字将是2、4、3、4。相加后的数字为13。在“ totField”中输入13和2 4 3 4进入“ eDieField”。 我不能让它工作。 我一直在获取nullPointerException,并且我不知道如何保持数组each [],因此我可以获取eDieField的数字(或诸如列表之类的东西)。
您的方法存在一些问题,但是导致您的主要问题的是:
public int getRoll()
{
int[] each = new int[times];
您创建了一个名为“ each”的局部变量,但是您实际上并未实例化dice类中的局部变量。 一旦函数离开作用域,本地“每个”将丢失,从而导致空指针错误。 您认为自己在设置类变量时没有设置。
摆脱每个变量的本地定义(int []部分)。
下一部分是您的getEach函数。 我知道您要尝试执行的操作,但这不是代码要执行的操作。 尝试这样的事情(尽管您可能想将名称更改为类似getRollList()的名字):
public String getEach()
{
StringBuffer sb = new StringBuffer();
for (int i : each) {
sb.append(i).append(",");
}
return sb.toString();
}
并将GUIWindow类dieListener actionEvent更改为:
String eachd = dices.getEach();
(是的,我留给您找出最后一个逗号,呵呵,您可以只使用空格而不是逗号)。 我能够让您的代码使用这些更改。
您应该更改的其他内容。 命名Java类的常规约定是将类名称的第一个字符大写。 “骰子”类应更改为“骰子”。
您可以张贴例外文字吗? 这样可以更轻松地为您提供帮助。
对我来说似乎令人困惑的一件事是,在您的骰子类中,您有一个全局each [],然后在getRoll()中重新声明了它。 如果您要填充each [],则应删除内部声明...,并且return方法应如下所示:
public int[] getEach()
{
return each;
}
要么
public int getEach(int pos)
{
return each[pos];
}
编辑:
如果您要填充每个[],则应该以这种方式开始getRoll():
public int getRoll()
{
each = new int[times];
您应该更改each
的初始化
int[] each = new int[times];
至
this.each = new int[times];
为您的dice
类编写一个构造函数是一个好主意。 在构造函数中初始化变量,以避免NullPointerException
以及其他意外使用未初始化变量的情况:
public Dice(int times)
{
this.times = times;
this.each = new int[times];
// ...
}
也可以尝试更改getEach方法以返回整数数组。 现在它的返回类型就是int
:
public int[] getEach()
{
return each;
}
要将整数数组转换为要显示在eDieField
的字符串,可以执行以下操作:
int[] eachDice = dice.getEach();
String eachStr = "";
for(int d : eachDice) // for each member of eachDice as d
{
eachStr += d + " ";
}
eDieField.setText(eachStr);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.