Java GUI程序无法更新
我对我的家庭作业——硬币计划有疑问 我们需要写一个小的GUI程序,可以抛硬币,可以显示当前的钱 我写了几乎所有的东西,但我仍然有一些问题来更新两个Java GUI程序无法更新,java,swing,user-interface,jlabel,event-dispatch-thread,Java,Swing,User Interface,Jlabel,Event Dispatch Thread,我对我的家庭作业——硬币计划有疑问 我们需要写一个小的GUI程序,可以抛硬币,可以显示当前的钱 我写了几乎所有的东西,但我仍然有一些问题来更新两个JLabel状态,似乎在我使用System.out.println进行测试后,两个下注按钮和重置按钮都可以正常工作,但当我们单击按钮时,标签不会同时更新 这是我的代码,它包含四个类:coin.java,player.java,coinpanel.java和coinPanelMain.java player.java: 公开课选手{ /** * @pa
JLabel
状态,似乎在我使用System.out.println
进行测试后,两个下注按钮和重置按钮都可以正常工作,但当我们单击按钮时,标签不会同时更新
这是我的代码,它包含四个类:coin.java
,player.java
,coinpanel.java
和coinPanelMain.java
/**
* @param ownMoney is currently the player own money
* @param coin is new Coin object;
*/
private int currMoney;
private Coin coin;
/**
* no-args parameter
* default constructor
*/
public Player(){
currMoney = 10;
coin = new Coin();
}
/**
* a bet method that takes in a bet and the side of coin
* it will filp the coin and change the player's money
* depend on whether the player won or lost the bet
*/
public void bet(){
coin.flip();
System.out.println("filp over");
if(coin.getFace().equals ("Heads")){
currMoney ++;
}
else if(coin.getFace().equals("Tails")){
currMoney --;
}
System.out.println("filp over2");
}
/**
* a getter for getting current money
* @return currMoney
*/
public int getCurrMon(){
System.out.println("money is" + currMoney);
return currMoney;
}
/**
* a reset method make current money return to 10;
* @return currMoney to 10
*/
public void reset(){
currMoney = 10;
}
}- coin panel类显示硬币游戏的结果
- 它包含三个按钮,当前货币和当前翻转
- 一旦用户点击重置按钮,当前货币将返回到10。 * * */
private Player player = new Player();
private Coin coin = new Coin();
private JLabel label3 = new JLabel("Enter a bet");
private JTextField text;
private int value = 0;
public int getVal(){
return value;
}
public CoinPanel(){
JLabel label= new JLabel("Current Money:"+player.getCurrMon());
JLabel label2 = new JLabel("Current Flip:" + coin.getFace());
JLabel label4 = new JLabel("");
text = new JTextField(30);
//JTextField text = new JTextField(30);
//String betNum = text.getText();
//int betNumber = Integer.parseInt(betNum);
JButton headsBt = new JButton("Bet Heads");
JButton tailsBt = new JButton("Bet Tails");
JButton reset = new JButton("Reset");
setLayout(new GridLayout(5,1,10,10));
add(label);
add(label2);
add(headsBt);
add(tailsBt);
add(text);
add(reset);
add(label3);
headsBt.addActionListener(new BetButtonListener());
tailsBt.addActionListener(new BetButtonListener());
reset.addActionListener(new RESETButtonListener());
}
public class RESETButtonListener implements ActionListener{
public void actionPerformed(ActionEvent e){
player.reset();
System.out.println("reset button");
}
}
public class BetButtonListener implements ActionListener{
public void actionPerformed(ActionEvent e){
//value = Integer.parseInt(text.getText());
player.bet();
int value = Integer.parseInt(text.getText());
//catch (NumberFormatException e){
if(value > player.getCurrMon()){
label3.setText("You are out of money");
repaint();
}
}
}
}
非常感谢你。我真的非常感谢你的帮助
重新编辑代码后,再加上指令
下面是一些错误显示,应用程序无法运行。我不知道为什么。
错误是:
"
钱是10
面部表情
线程“main”java.lang.NullPointerException中出现异常
位于java.awt.Container.addImpl(未知源)
位于java.awt.Container.add(未知源)
在CoinPanel。(CoinPanel.java:48)
位于CoinPanelMain.main(CoinPanelMain.java:17)
"
上面的问题解决了。我忘了在课堂上初始化label3
很抱歉给您带来了太多问题。。。
无论用户在文本字段中输入什么(我指的是数字),当前的货币标签总是增加2或减少2。我认为它应该随着用户输入而改变?- 这是一个问题:
if(coin.getFace() == "Heads"){ currMoney ++; } else if(coin.getFace() == "Tails"){ currMoney --; }
=
比较字符串
。使用等于(..)
方法进行字符串
比较:
if(coin.getFace().equals("Heads")){
currMoney ++;
}
else if(coin.getFace().equals("Tails")){
currMoney --;
}
我还建议在比较多个字符串
时使用开关
块,从而降低使用=
比较字符串的风险(仅限Java 7,谢谢):
- 将
添加到ActionListener
中肯定不好(删除此行):JTextField
- 另外,只要在
事件调度线程上创建
实例,我看不到它不会更新,但正如@Mad所说的(+1对他和try-catch),调用JPanel
将确保它会更新invalidate()
异常的方法调用:
int i=...;
try {
//call a method that can throw NumberFormatExecption
i=...;
}catch(NumberFormatException nfe) {
System.err.println(nfe.getMessage());
}
阅读这些,了解更多关于和块的信息Swing在重新绘制时非常聪明,但有时可能有点太聪明了
我的期望是,在调用类似于Label#setText
的东西之后,会提出重新绘制请求,并更新标签,但这种情况并不总是发生
您可能需要提示Swing重新绘制
if(value > player.getCurrMon()) {
label3.setText("You are out of money");
repaint();
}
在您的情况下不太可能,但是您可能需要调用invalidate()
来继续repaint
请求,以鼓励容器层次结构更新其布局
还有
int value = Integer.parseInt(text.getText());
应包装在NumberFormatException
中,以确保用户实际输入了一个数字。否则将导致程序无法按预期进行更新
扩展答案
因此,在rest方法中,您需要更新所有不同的ui元素
public void actionPerformed(ActionEvent e){
player.reset();
System.out.println("reset button");
label3.setText(""); // assuming no new messages..
label.setText("Current Money:"+player.getCurrMon());
text.setEnabled(true);
invalidate();
repaint();
}
在您的“打赌”按钮中,您有许多问题
用户输入的内容和扣除的内容之间没有任何联系,也没有检查玩家是否可以支付赌注
try {
int value = Integer.parseInt(text.getText());
if (value > player.getCurrMon()) {
label3.setText("You don't have enough money to cover the bet");
} else {
player.bet();
label.setText("Current Money:"+player.getCurrMon());
if(player.getCurrMon() == 0){
label3.setText("You are out of money");
text.setEnabled(false);
} else if (player.getCurrMon() < 0) {
label3.setText("We'll be sending the boys around shortly");
text.setEnabled(false);
}
}
} catch (NumberFormatException exp) {
label3.setText(text.getText() + " is an invalid bet");
}
invalidate();
repaint();
然后在构造函数中,您只需要初始化它
public CoinPanel(){
label= new JLabel("Current Money:"+player.getCurrMon());
已更新
基本上,我们需要检查按下了哪个按钮,并相应地更改“脸”赌注
public class BetButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
try {
int value = Integer.parseInt(text.getText());
if (value > player.getCurrMon()) {
label3.setText("You don't have enough money to cover the bet");
} else {
String face = "Heads";
if (e.getSource().equals(tailsBt)) {
face = "Tails"
}
player.bet(face, value);
label.setText("Current Money:" + player.getCurrMon());
if (player.getCurrMon() == 0) {
label3.setText("You are out of money");
text.setEnabled(false);
} else if (player.getCurrMon() < 0) {
label3.setText("We'll be sending the boys around shortly");
text.setEnabled(false);
}
}
} catch (NumberFormatException exp) {
label3.setText(text.getText() + " is an invalid bet");
}
invalidate();
repaint();
}
}
公共类BetButtonListener实现ActionListener{
已执行的公共无效操作(操作事件e){
试一试{
int value=Integer.parseInt(text.getText());
如果(值>player.getCurrMon()){
标签3.setText(“你没有足够的钱来支付赌注”);
}否则{
字符串面=“头”;
如果(例如getSource()等于(tailsBt)){
face=“Tails”
}
玩家。赌注(面值、价值);
label.setText(“当前货币:+player.getCurrMon());
if(player.getCurrMon()==0){
标签3.setText(“你没钱了”);
text.setEnabled(false);
}else if(player.getCurrMon()<0){
标签3.setText(“我们很快就会把孩子们送到各处”);
text.setEnabled(false);
}
}
}捕获(NumberFormatException exp){
label3.setText(text.getText()+“是无效的赌注”);
}
使无效();
重新油漆();
}
}
注意,我可能已经将参数切换到了bet
方法。顺序只对您声明方法的方式很重要,因此您可能需要切换我的参数如果您想获得此类问题的帮助,您应该阅读stackoverflow的FAQ。这将指出您应该只发布相关的代码位,而不是用模糊的问题描述转储整个程序。是否尝试了repaint()方法?查看字符串比较。并缩小问题范围。大家好,我编辑了我的问题,只留下了上面的一些相关代码。我的问题是:1.我想玩家类中的bet方法有s
try {
int value = Integer.parseInt(text.getText());
if (value > player.getCurrMon()) {
label3.setText("You don't have enough money to cover the bet");
} else {
player.bet();
label.setText("Current Money:"+player.getCurrMon());
if(player.getCurrMon() == 0){
label3.setText("You are out of money");
text.setEnabled(false);
} else if (player.getCurrMon() < 0) {
label3.setText("We'll be sending the boys around shortly");
text.setEnabled(false);
}
}
} catch (NumberFormatException exp) {
label3.setText(text.getText() + " is an invalid bet");
}
invalidate();
repaint();
private JLabel label3 = new JLabel("Enter a bet");
private JLabel label;
public CoinPanel(){
label= new JLabel("Current Money:"+player.getCurrMon());
public class BetButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
try {
int value = Integer.parseInt(text.getText());
if (value > player.getCurrMon()) {
label3.setText("You don't have enough money to cover the bet");
} else {
String face = "Heads";
if (e.getSource().equals(tailsBt)) {
face = "Tails"
}
player.bet(face, value);
label.setText("Current Money:" + player.getCurrMon());
if (player.getCurrMon() == 0) {
label3.setText("You are out of money");
text.setEnabled(false);
} else if (player.getCurrMon() < 0) {
label3.setText("We'll be sending the boys around shortly");
text.setEnabled(false);
}
}
} catch (NumberFormatException exp) {
label3.setText(text.getText() + " is an invalid bet");
}
invalidate();
repaint();
}
}