简体   繁体   English

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

[英]I'm really having trouble figuring out how to make my GUI window display the values in the array

f somebody could nudge me in the right direction that would be great. 如果有人可以向正确的方向推动我,那将是很棒的。

Or tell me if I have to redo a chunk or something. 或告诉我是否需要重做一些内容。

This is a program for rolling dice. 这是掷骰子的程序。 I'm trying to make each individual 'roll' display in the eDieField. 我正在尝试在eDieField中显示每个“卷”。

here is the class: 这是课程:

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*/];
  }
}

here is the GUIWindow: 这是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);  
      }
   }
}

and the main: 主要:

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);
   }
}

I hope this is not bad conduct or anything, I just have no idea what to do. 我希望这不是坏行为,也不是什么,我只是不知道该怎么办。 (And my stupid textbook is useless) Say you enter 4 dice with 4 sides and the numbers that would be on if you rolled them by hand were 2, 4, 3, 4. added that would be 13. 13 goes in 'totField' and 2 4 3 4 go in 'eDieField'. (而我那愚蠢的教科书是没有用的)假设您输入4个骰子,每个骰子有4个面,并且如果您用手滚动它们,则该数字将是2、4、3、4。相加后的数字为13。在“ totField”中输入13和2 4 3 4进入“ eDieField”。 I cant get that to work. 我不能让它工作。 I keep getting nullPointerException and I don't know how to keep the array each[] so I can get the numbers for eDieField (or something else like a list or whatever). 我一直在获取nullPointerException,并且我不知道如何保持数组each [],因此我可以获取eDieField的数字(或诸如列表之类的东西)。

There are a few problems with your approach, but the one that is causing your main problem is: 您的方法存在一些问题,但是导致您的主要问题的是:

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

you created a local variable called "each", but you never actually instantiate the one in the dice class. 您创建了一个名为“ each”的局部变量,但是您实际上并未实例化dice类中的局部变量。 Once the function leaves its scope, your local "each" is lost, causing your null pointer error. 一旦函数离开作用域,本地“每个”将丢失,从而导致空指针错误。 You think you're setting the class variable when you did not. 您认为自己在设置类变量时没有设置。

Get rid of the local definition of the each variable (the int[] portion). 摆脱每个变量的本地定义(int []部分)。

The next part is your getEach function. 下一部分是您的getEach函数。 I see what you're trying to do but that's not what the code will do. 我知道您要尝试执行的操作,但这不是代码要执行的操作。 Try something like this (though you may want to change the name to something like getRollList()): 尝试这样的事情(尽管您可能想将名称更改为类似getRollList()的名字):

  public String getEach()
   {
     StringBuffer sb = new StringBuffer();

     for (int i : each) {
       sb.append(i).append(",");
     }

     return sb.toString();
   }

and change the GUIWindow class dieListener actionEvent to: 并将GUIWindow类dieListener actionEvent更改为:

String eachd = dices.getEach();

(yes, i'll leave it to you to figure out the last comma, heh, you could just use space instead of a comma). (是的,我留给您找出最后一个逗号,呵呵,您可以只使用空格而不是逗号)。 I was able to get your code to work with these changes. 我能够让您的代码使用这些更改。

Something else you should change. 您应该更改的其他内容。 The general convention for naming a java class is to make the first character of your class name a capital letter. 命名Java类的常规约定是将类名称的第一个字符大写。 The "dice" class should be changed to "Dice". “骰子”类应更改为“骰子”。

Can you post the exception text? 您可以张贴例外文字吗? That would make it easier to help you. 这样可以更轻松地为您提供帮助。

One thing that seems confusing to me is that in your dice class you have a global each[] and you redeclare it inside getRoll(). 对我来说似乎令人困惑的一件事是,在您的骰子类中,您有一个全局each [],然后在getRoll()中重新声明了它。 If you're trying to fill each[] you should remove the inner declaration... and your return method should look like this: 如果您要填充each [],则应删除内部声明...,并且return方法应如下所示:

public int[] getEach()
  {
    return each;
  }

or 要么

public int getEach(int pos)
{
      return each[pos];
} 

EDIT: 编辑:

this is how you should start you getRoll() if you're trying to fill each[]: 如果您要填充每个[],则应该以这种方式开始getRoll():

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

You should change your initialization of each from 您应该更改each的初始化

int[] each = new int[times];

to

this.each = new int[times];

It would be a good idea to write a constructor for your dice class. 为您的dice类编写一个构造函数是一个好主意。 Initialize your variables in the constructor to avoid NullPointerException s and other accidental use of uninitialized variables: 在构造函数中初始化变量,以避免NullPointerException以及其他意外使用未初始化变量的情况:

public Dice(int times)
{
    this.times = times;
    this.each = new int[times];
    // ...
}

Also try changing your getEach method to return an array of integers. 也可以尝试更改getEach方法以返回整数数组。 Now its return type is just int : 现在它的返回类型就是int

public int[] getEach()
{
    return each;
}

To make the array of ints into a string to be displayed in eDieField , you could do this: 要将整数数组转换为要显示在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM