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--
现在所有类都与原始代码完全相同。
这段代码有很多结构性的问题,但最重要的问题是你有两个Cointracker实例漂浮。只有GUI实例正在由处理程序更新,并且RollProgress没有对该实例的引用。为RollProgress创建一个构造函数,并传递GUI中使用的CoinTracker。
CoinTracker ctorp ;//= new CoinTracker();
public RollProgress(CoinTracker ct){
this.ctorp = ct;
}
处理程序正在工作,否则。
您能否指出一些这些结构性问题? – Tertles 2014-10-20 08:24:38
Button和TextFields类没有真正的用途,除非您计划重用GUI的那部分。 Button类更加令人困惑,因为它扩展了JFrame,但并没有将该扩展用于任何东西(而Button是一个令人困惑的名字)。为什么不将Button和Textfields折叠到GUI中?每个领域都是公开的,它们在封装的情况下飞行。 – Dylan 2014-10-20 17:22:19
我明白了,我将Button和TextFields更改为自己的类的原因是因为前一个问题的人告诉我这样做,我相信我在JavaProgrammingForums上提出了这个问题。说实话,这对我来说更容易一些,因为如果我想改变一些按钮,我只是去了那里,我知道我会找到它,我也知道我会再次使用相同的按钮或文本字段名称在这个程序中,因为它是一个非常简单的程序,但我知道你从哪里来,我一定会考虑到我未来的项目!谢谢。 :-) – Tertles 2014-10-20 20:17:38
发布一个[最小可编译示例](http://stackoverflow.com/help/mcve)更快得到更好的帮助 – Reimeus 2014-10-17 14:17:33
没有人会想要阅读那么多的代码。尝试并将代码缩减为更小的示例..可能有100行代码 – 2014-10-17 14:18:17
您是否在输出中遇到任何异常? – 2014-10-17 14:24:50