gpt4 book ai didi

java - 我真的很难弄清楚如何让我的 GUI 窗口显示数组中的值

转载 作者:行者123 更新时间:2023-11-30 11:55:38 25 4
gpt4 key购买 nike

如果有人能将我推向正确的方向,那就太好了。

或者告诉我是否必须重做一个 block 或其他东西。

这是一个掷骰子的程序。我试图让每个单独的“滚动”显示在 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*/];
}
}

这是 GUI 窗口:

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。13 进入“totField”和 2 4 3 4 进入“eDieField”。我无法让它工作。我不断收到 nullPointerException,而且我不知道如何保留数组 each[] 以便我可以获得 eDieField 的数字(或其他类似列表或其他内容)。

最佳答案

您的方法存在一些问题,但导致您出现主要问题的是:

public int getRoll()
{
int[] each = new int[times];

您创建了一个名为“each”的局部变量,但实际上您从未实例化 dice 类中的变量。一旦函数离开它的范围,你的本地“each”就会丢失,导致你的空指针错误。您认为自己正在设置类变量,但实际上并没有。

摆脱每个变量的局部定义(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 类的一般约定是使类名的第一个字符为大写字母。 “骰子”类应更改为“骰子”。

关于java - 我真的很难弄清楚如何让我的 GUI 窗口显示数组中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4904340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com