Передача переменных в другие классы (Java)

1

У меня есть Java-программа, которая содержит несколько классов, все из которых расширяют JPanel (кроме класса, содержащего основной метод). Я пытаюсь передать переменные int из одного класса в другой и, используя некоторые ранее заданные вопросы, придумал следующее:

Класс RollPanel

    public int getbrainCount()
    {
    return brainCount;
    }

Класс BrainsPanel (где я пытаюсь отправить переменную)

   void setbrainCount()
   {
   RollPanel rollpanel = new RollPanel();
   brainCount = rollpanel.getbrainCount();
   }

Это не дает никаких ошибок, но когда я добавляю brainCount на ярлык, чтобы увидеть его значение, оно всегда равно 0.

brainCount объявляется на уровне класса RollPanel, затем задается значение с помощью этого кода, который находится в прослушивателе кнопок:

        value1 = generator.nextInt(3) + 1;
        value2 = generator.nextInt(3) + 1;
        value3 = generator.nextInt(3) + 1;
        //rollTotal++;

        //Counts how many brains were rolled.
        if (value1 == 1)
            brainCount++;
        if (value2 == 1)
            brainCount++;
        if (value3 == 1)
            brainCount++;

Я понимаю, что просто объявление переменной автоматически будет означать, что ее значение сначала будет нулевым (что я предполагаю, почему оно отображается как ноль), но как я могу передать его обновленное значение после вышеописанного кода для brainsPanel, чтобы я мог добавить его значение на ярлык в мозгеPanel? Будет ли getBrainCount() приходить после прослушивания кнопки? Мне кажется, что я пропустил здесь что-то простое...

EDIT: Я думаю, что проблема заключается не в сеттер, а в том, что это геттер. Так как в RollPanel (где есть геттер) я объявляю brainCount как int, его начальное значение равно 0, поэтому, когда получатель получает значение, он всегда остается равным 0, хотя brainCount должен быть изменен в прослушивателе кнопок. Вот RollPanel полностью. Как я могу заставить getter получить обновленное значение brainCount вместо его начального 0?

package zombiedice;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class RollPanel extends JPanel
{
JLabel die1Label, die2Label, die3Label, testLabel;
JButton rollButton, sortButton;
JPanel dicePanel, buttonPanel;
ImageIcon die1, die2, die3;
int rollTotal, value1, value2, value3;
int brainCount, blastCount;
Random generator = new Random();



public RollPanel()
{
    setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 
    setBackground(Color.black);

    dicePanel = new JPanel();
    dicePanel.setBackground(Color.black);

    //Creates blank ImageIcons to be used later to display dice.
    die1 = new ImageIcon(); 
    die2 = new ImageIcon(); 
    die3 = new ImageIcon(); 

    //A panel just to hold the buttons.
    buttonPanel = new JPanel();

    //Creates and links roll button to RollListener.
    rollButton = new JButton("Roll");
    rollButton.addActionListener(new RollListener());
    buttonPanel.add(rollButton);

    //After a roll, this button will need to be clicked so brain and blast
    //die can be sorted into their proper catergories. 
    sortButton = new JButton("Sort");
    sortButton.addActionListener(new SortListener());


    //Creates labels out of the dice images.
    die1Label = new JLabel(die1);
    die2Label = new JLabel(die2);
    die3Label = new JLabel(die3);

    //Adds image labels to the panel that holds the dice.
    dicePanel.add(die1Label);
    dicePanel.add(die2Label);
    dicePanel.add(die3Label);

    add(dicePanel);
    add(buttonPanel);
} //Closes constructor



//Roll button listener.
private class RollListener implements ActionListener
{
    public void actionPerformed(ActionEvent event)
    {
        rollButton.setEnabled(false);
        repaint();
        buttonPanel.add(sortButton);
        repaint(); 
        sortButton.setEnabled(true);
        repaint();

        value1 = generator.nextInt(3) + 1;
        value2 = generator.nextInt(3) + 1;
        value3 = generator.nextInt(3) + 1;
        //rollTotal++;

        //Counts how many brains were rolled.
        if (value1 == 1)
            brainCount++;
        if (value2 == 1)
            brainCount++;
        if (value3 == 1)
            brainCount++;

        //Updates the dice
        die1Label.setIcon(new ImageIcon(value1 + ".png"));
        die2Label.setIcon(new ImageIcon(value2 + ".png"));
        die3Label.setIcon(new ImageIcon(value3 + ".png")); 



    } //Closes actionPerformed
} //Closes the listener for the roll button



//Sort button listener.
private class SortListener implements ActionListener
{
    public void actionPerformed(ActionEvent event)
    {
        sortButton.setEnabled(false);
        repaint();
        rollButton.setEnabled(true);
        repaint();



    } //Closes actionPerformed.

}//Closes sort button listener. 
public int getBrainCount()
{
return brainCount;
} 

} //Closes class

BrainsPanel

package zombiedice;
import javax.swing.*;
import java.awt.*;

public class BrainsPanel extends JPanel
{
ImageIcon icon1 = new ImageIcon();
ImageIcon icon2 = new ImageIcon();
JLabel brainTotal, label1, label2;
JPanel brainPanel;
int brainCount;


void setbrainCount(int count)
{
   // RollPanel rollpanel = new RollPanel();
   brainCount = count;
   //brainCount = count;
}

public BrainsPanel()
{


setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 

setBackground(Color.black);


icon1 = new ImageIcon("1.png");
icon2 = new ImageIcon("1.png");
label1 = new JLabel(icon1);
label2 = new JLabel(icon2);
brainTotal = new JLabel ("Brains eaten: " + brainCount);

add(label1);
add(label2);
add(brainTotal);



} //Closes constructor
} //Closes class
  • 0
    Пока не ясно , что ваш setbrainCount метод предназначен делать. Обычно «установщик» принимает новое значение, поэтому оно будет следующим: public void setBrainCount(int count) { brainCount = count; }
  • 0
    Также неясно, что вы видите, и как фрагменты кода взаимодействуют друг с другом. Короткая, но полная программа облегчила бы понимание того, что происходит - и в идеале, без графического интерфейса, если это действительно не нужно. (Консольные приложения гораздо проще отслеживать и диагностировать.)
Показать ещё 3 комментария
Теги:
variables

2 ответа

0

Я считаю, вы должны попробовать следующее:

void setbrainCount(RollPanel rollPanel)
{
    brainCount = rollpanel.getbrainCount();
}

Таким образом, вы не будете пытаться использовать новое инициализированное значение, которое всегда равно 0.

Althozuh технически, было бы разумнее просто отправить счет и установить, что

void setbrainCount(int brainCount)
{
    this.brainCount = brainCount;
}
0

В этом мире кода:

void setbrainCount() {
    RollPanel rollpanel = new RollPanel();
    brainCount = rollpanel.getbrainCount();
}

Вы всегда создаете новый объект RollPanel перед тем, как получить brainCount. Конечно, это 0, если он объявлен как поле в RollPanel. Переменная была вновь инициализирована созданием объекта только в строке.

Вы должны убедиться, что всегда используете один и тот же объект RollPanel, например, сохраняйте его как поле в BrainsPanel. Трудно сказать с данным кодом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню