Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GUI程序无法更新_Java_Swing_User Interface_Jlabel_Event Dispatch Thread - Fatal编程技术网

Java 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

我对我的家庭作业——硬币计划有疑问

我们需要写一个小的GUI程序,可以抛硬币,可以显示当前的钱

我写了几乎所有的东西,但我仍然有一些问题来更新两个
JLabel
状态,似乎在我使用
System.out.println
进行测试后,两个下注按钮和重置按钮都可以正常工作,但当我们单击按钮时,标签不会同时更新

这是我的代码,它包含四个类:
coin.java
player.java
coinpanel.java
coinPanelMain.java

  • player.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;
    }
    
    }

  • coinPanel.java

    导入javax.swing。; 导入java.awt.event。; 导入java.awt。; /*

    • coin panel类显示硬币游戏的结果
    • 它包含三个按钮,当前货币和当前翻转
    • 一旦用户点击重置按钮,当前货币将返回到10。 * * */
  • 公共类CoinPanel扩展了JPanel{

    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
      中肯定不好(删除此行):

    • 另外,只要在
      事件调度线程上创建
      JPanel
      实例,我看不到它不会更新,但正如@Mad所说的(+1对他和try-catch),调用
      invalidate()
      将确保它会更新

    更新:

    根据评论:

    try-catch块将围绕一个可能引发
    异常的方法调用:

    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();
        }
    
    }