Мне действительно трудно понять, как заставить мое окно графического интерфейса отображать значения в массиве - PullRequest
2 голосов
/ 05 февраля 2011

Если бы кто-нибудь мог подтолкнуть меня в правильном направлении, это было бы здорово.

Или скажите, нужно ли мне переделывать кусок или что-то в этом роде.

Это программа для игры в кости. Я пытаюсь сделать так, чтобы каждый отдельный ролик отображался в 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. и 2 4 3 4 перейти в «eDieField». Я не могу заставить это работать. Я продолжаю получать nullPointerException и не знаю, как сохранить массив каждый [], чтобы я мог получить числа для eDieField (или что-то еще, например, список или что-то еще).

Ответы [ 3 ]

1 голос
/ 05 февраля 2011

Есть несколько проблем с вашим подходом, но одна из причин, которая вызывает вашу основную проблему:

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

вы создали локальную переменную с именем "each", но вы никогда не создаете ее вкласс игры в кости.Как только функция выходит из области видимости, ваш локальный «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-класса заключается в том, чтобы первый символ вашего класса назывался заглавной буквой.Класс "кости" должен быть изменен на "Игра в кости".

0 голосов
/ 05 февраля 2011

Вы должны изменить инициализацию each с

int[] each = new int[times];

до

this.each = new int[times];

Было бы неплохо написать конструктор для вашего dice класса. Инициализируйте ваши переменные в конструкторе, чтобы избежать NullPointerException s и другого случайного использования неинициализированных переменных:

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);
0 голосов
/ 05 февраля 2011

Можете ли вы опубликовать текст исключения? Это помогло бы вам помочь.

Одна вещь, которая меня смущает, заключается в том, что в вашем классе игральных костей у вас есть глобальный each [], и вы переопределяете его внутри getRoll (). Если вы пытаетесь заполнить каждое [], вы должны удалить внутреннее объявление ... и ваш метод возврата должен выглядеть следующим образом:

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

или

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

EDIT:

это то, как вы должны запустить getRoll (), если вы пытаетесь заполнить каждый []:

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