【问题标题】:Transferring Integers from one class to another将整数从一个类转移到另一个类
【发布时间】:2015-04-06 09:32:38
【问题描述】:

我有以下问题:

在我的主要课程中,我有以下几行:

Integer i;

update.addActionListener(new RewardUpdater(this));

if (argument) {
    i++;
}

在 RewardUpdater 类中我有这个:

int i;
this.i = frame.i;

rewardButtonAddition.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            updateCenterPanel.removeAll();
            c.repaint();
            text.setText("Test: " + i);
            c.add(beschriftung);
            updateCenterPanel.add(additionReward1);
            updateCenterPanel.add(additionReward2);
            updateCenterPanel.add(additionReward3);

        }
    });

但无论我多久完成一次 i++ 的 if 迭代;

我的 i 总是打印为 0。

对不起,有限的代码,整个事情很混乱,我试图只把必要的东西放在这里。如果需要更多,我可以提供。

感谢您提供简短而快速的答复!

真诚的 莫里茨

【问题讨论】:

  • i 在哪里初始化?
  • 不确定你所说的初始化是什么意思(我对编程很抱歉:/)
  • 为什么用“Integer”而不是“int”——看看stackoverflow.com/questions/3815173/…
  • 是的,变量的命名是“不幸”,并且缺少一点“范围”,但试一试:将"Test: " + i替换为"Test: "+frame.i ...行为?
  • @racraman 一位朋友建议我 @xerx693 不会改变任何东西

标签: java


【解决方案1】:

actionPerformed方法是您应该从框架中获取 i 值的地方。否则,该值仅在构造侦听器时从帧中获取一次,并且永远不会更改。

所以,简而言之,替换

text.setText("Test: " + i);

通过

text.setText("Test: " + frame.i);

并从RewardUpdater 中删除无用的i 字段。

【讨论】:

  • 然后发布一个最小的可重现测试用例。很难说您发布的不完整代码到底有什么问题。
【解决方案2】:

如果您希望您的Action(例如JButton 点击)增加值,您只需在ActionListener 内添加i++

另一方面,如果您想在其他地方增加值,我建议您像这样创建一个新类:

public class RewardValue {
  private int value;

  public RewardValue(int startValue) {
    this.value = startValue;
  }

  public void increment() {
    value++;
  }

  public int getValue() {
    return value;
  }
}

然后您可以继续创建RewardValue 并将其传递到您需要的地方。你基本上用RewardValue交换你的i。公共方法increment 应该在您拥有i++ 的地方调用。公共方法get 在那里,因此您可以读取新i 的值。一个小例子如下所示:

public class MainClass {
  private final RewardValue rewardValue = new RewardValue(0);

  public MainClass() {
    //initiate update 
    //...

    update.addActionListener(new RewardUpdater(rewardValue));

    //of cause the next lines don't need to be in the constructor
    if (argument) {
      rewardUpdater.increment();
    }
  }
}

public class RewardUpdater implements ActionListener {
  private final RewardValue rewardValue;

  public RewardUpdater(RewardValue rewardValue) {
    this.rewardValue = rewardValue;
  }

  public void actionPerformed(AcionEvent e) {
    //... the other lines
    text.setText("Test: "+rewardValue.get());
    // ... the other lines
  }
}

【讨论】:

  • 感谢您的详细解答。由于我对编程还很陌生,所以我并没有安静地赶上您的代码。我不知道 increment 是做什么的或者 final 是做什么用的。我也不完全理解getValue()。我会尽力实现它,非常感谢!
  • P.S:我在创建类 RewardValue 时遇到错误,就像您建议的那样。 public void getValue() { return value; } 它告诉我将 void 更改为 int
  • 哎呀,应该是 int 而不是 void。如果你不为那么长的决赛编程并不那么重要,我只是习惯使用它。我会相应地编辑我的答案。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多