ActionListener只能工作一次而其他人从来没有

问题描述:

我想要做一个简单的项目,根据您的rollProgress的数量生成随机数量的“铜”。无论何时获得100个铜,您都可以将其转换为银色,并将100个银转换为金色。要增加rollProgress,你需要点击一个按钮来添加一个,两个,五个或十个,并“支付”一定数量的银和铜。ActionListener只能工作一次而其他人从来没有

生成按钮每次都起作用,以及copperToSilver按钮,所以我删除了它的代码以使其压缩。我还从GUI类中删除了显示您当前拥有的铜/银/金量的文本字段。

问题是,addRoll ActionListener只在第一次按下时才起作用,之后它不起作用,无论它是否满足要求。该项目没有完成,但其余的完成的东西似乎并没有工作。

我删除了我的临时调试,但看起来RollProgressPlusTwo方法在您按下addTwoRoll按钮时根本不会运行。

我在网上查找,但找不到任何人有同样的问题,只有类似的没有人可以完全关联,没有人有任何解决方案。

下面的代码:

主类:

import javax.swing.JFrame; 

public class MainClass { 

public static void main(String args[]){ 

    GUI go = new GUI(); 
    go.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    go.setSize(350,300); 
    go.setResizable(true); 
    go.setLocationRelativeTo(null); 
    go.setVisible(true); 

} 
} 

GUI类:

import javax.swing.*; 
import javax.swing.event.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.Random; 

public class GUI extends JFrame{ 

Button bo = new Button(); 
CoinTracker cto = new CoinTracker(); 
TextFields tfo = new TextFields(); 
RollProgress rpo = new RollProgress(); 

public GUI(){ 

    super("yung mulah BABY"); 
    setLayout(new GridLayout(11,1,3,3)); 

    add(bo.generate); 

    add(tfo.currentCashField); 
    add(tfo.goldField); 
    add(tfo.silverField); 
    add(tfo.copperField); 

    add(bo.copperToSilver); 
    add(bo.silverToGold); 
    add(bo.addRoll); 
    add(bo.addTwoRoll); 
    add(bo.addFiveRoll); 
    add(bo.addTenRoll); 

    GenerateHandler ghandler = new GenerateHandler(); 
    bo.generate.addActionListener(ghandler); 

    ConvertToSilverHandler ctshandler = new ConvertToSilverHandler(); 
    bo.copperToSilver.addActionListener(ctshandler); 

    PlusOneHandler pohandler = new PlusOneHandler(); 
    bo.addRoll.addActionListener(pohandler); 

    PlusTwoHandler ptwhandler = new PlusTwoHandler(); 
    bo.addTwoRoll.addActionListener(ptwhandler); 


} 
private class GenerateHandler implements ActionListener{ 
    public void actionPerformed(ActionEvent event){ 
     Random roll = new Random(); 
     cto.copper = cto.copper+1+roll.nextInt(rpo.rollProgress); 
     tfo.copperField.setText(cto.copper + " copper"); 
     tfo.silverField.setText(cto.silver + " silver"); 
     tfo.goldField.setText(cto.gold + " gold"); 
    } 
} 

private class PlusOneHandler implements ActionListener{ 
    public void actionPerformed(ActionEvent event){ 
     rpo.RollProgressPlusOne(); 
     tfo.copperField.setText(cto.copper + " copper"); 
     tfo.silverField.setText(cto.silver + " silver"); 
     tfo.goldField.setText(cto.gold + " gold"); 
    } 
} 

private class PlusTwoHandler implements ActionListener{ 
    public void actionPerformed(ActionEvent event){ 
     rpo.RollProgressPlusTwo(); 
     tfo.copperField.setText(cto.copper + " copper"); 
     tfo.silverField.setText(cto.silver + " silver"); 
     tfo.goldField.setText(cto.gold + " gold"); 
    } 
} 

private class ConvertToSilverHandler implements ActionListener{ 
    public void actionPerformed(ActionEvent event){ 
     cto.toSilver(); 
     tfo.copperField.setText(cto.copper + " copper"); 
     tfo.silverField.setText(cto.silver + " silver"); 
     tfo.goldField.setText(cto.gold + " gold"); 
    } 
} 
} 

CoinTracker类:​​

import javax.swing.*; 
import javax.swing.event.*; 
import java.awt.*; 
import java.awt.event.*; 

public class CoinTracker { 

public int copper = 98; 
public int silver = 1; 
public int gold = 0; 

public void toSilver(){ 

    if(copper >= 100){ 
     copper -= 100; 
     silver++; 

    } 
} 
} 

按钮类:

import javax.swing.*; 
import javax.swing.event.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Button extends JFrame{ 

public JButton generate; 
public JButton copperToSilver; 
public JButton silverToGold; 
public JButton addRoll; 
public JButton addTwoRoll; 
public JButton addFiveRoll; 
public JButton addTenRoll; 

public Button(){ 

    generate = new JButton("Generate"); 
    copperToSilver = new JButton("Convert 100 copper to 1 silver"); 
    silverToGold = new JButton("Convert 100 silver to 1 gold"); 
    addRoll = new JButton("Pay 1 silver to add one number to the dice"); 
    addTwoRoll = new JButton("Pay 2 silver to add two numbers to the dice"); 
    addFiveRoll = new JButton("Pay 4 silver and 50 copper to add five numbers to the dice"); 
    addTenRoll = new JButton("Pay 9 silver to add ten numbers to the dice"); 


} 

} 

的TextField类:

import javax.swing.*; 
import javax.swing.event.*; 

import java.awt.*; 
import java.awt.event.*; 

public class TextFields { 

public JTextField currentCashField; 
public JTextField copperField; 
public JTextField silverField; 
public JTextField goldField; 
CoinTracker ctotf = new CoinTracker(); 

public TextFields(){ 

    currentCashField = new JTextField("Your current cash is:"); 
    copperField = new JTextField(ctotf.copper + " copper"); 
    silverField = new JTextField(ctotf.silver + " silver"); 
    goldField = new JTextField(ctotf.gold + " gold"); 

} 

} 

RollProgress类:

import javax.swing.*; 
import javax.swing.event.*; 

import java.awt.*; 
import java.awt.event.*; 

public class RollProgress { 

public int rollProgress = 1; 
CoinTracker ctorp = new CoinTracker(); 

public void RollProgressPlusOne(){ 
    if(ctorp.silver >= 1){ 
     rollProgress++; 
     ctorp.silver--; 
     System.out.println(rollProgress); 
    } 
} 

public void RollProgressPlusTwo(){ 
    if(ctorp.silver >= 2){ 
     rollProgress++; 
     rollProgress++; 
     ctorp.silver--; 
     ctorp.silver--; 
     System.out.println(rollProgress); 
    } 
} 
} 

有任何疑问请询问。 预先感谢任何解决方案/解决方案。

- EDIT--

现在所有类都与原始代码完全相同。

+2

发布一个[最小可编译示例](http://*.com/help/mcve)更快得到更好的帮助 – Reimeus 2014-10-17 14:17:33

+0

没有人会想要阅读那么多的代码。尝试并将代码缩减为更小的示例..可能有100行代码 – 2014-10-17 14:18:17

+0

您是否在输出中遇到任何异常? – 2014-10-17 14:24:50

这段代码有很多结构性的问题,但最重要的问题是你有两个Cointracker实例漂浮。只有GUI实例正在由处理程序更新,并且RollProgress没有对该实例的引用。为RollProgress创建一个构造函数,并传递GUI中使用的CoinTracker。

CoinTracker ctorp ;//= new CoinTracker(); 

public RollProgress(CoinTracker ct){ 
    this.ctorp = ct; 
} 

处理程序正在工作,否则。

+0

您能否指出一些这些结构性问题? – Tertles 2014-10-20 08:24:38

+0

Button和TextFields类没有真正的用途,除非您计划重用GUI的那部分。 Button类更加令人困惑,因为它扩展了JFrame,但并没有将该扩展用于任何东西(而Button是一个令人困惑的名字)。为什么不将Button和Textfields折叠到GUI中?每个领域都是公开的,它们在封装的情况下飞行。 – Dylan 2014-10-20 17:22:19

+0

我明白了,我将Button和TextFields更改为自己的类的原因是因为前一个问题的人告诉我这样做,我相信我在JavaProgrammingForums上提出了这个问题。说实话,这对我来说更容易一些,因为如果我想改变一些按钮,我只是去了那里,我知道我会找到它,我也知道我会再次使用相同的按钮或文本字段名称在这个程序中,因为它是一个非常简单的程序,但我知道你从哪里来,我一定会考虑到我未来的项目!谢谢。 :-) – Tertles 2014-10-20 20:17:38