java - 如何更新 Java Gui 中的变量?

标签 java swing user-interface

当我每次点击“充电治疗”按钮时,它不会改变我拥有的治疗数量。当你运行 Gui 时,你会看到一个充电治疗按钮,当你点击它时,你的治疗效果应该会增加。但出于某种原因,它们不会改变。我该如何更改它,以便在单击该按钮时它会发生变化? 这是 GUI:

package Gui;
import Player.Player;

import java.awt.EventQueue;

import javax.swing.JFrame;

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

import javax.swing.*;

import java.beans.*;
import java.util.Random;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JLabel;
import javax.swing.JTextPane;
import javax.swing.LayoutStyle.ComponentPlacement;
public class Display {


private JFrame frame;

/**
 * Launch the application.
 */

public static void main(String[] args) {

    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Display window = new Display();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public Display() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
public void initialize() {

    Player playerhp = new Player();
    Player playerat = new Player();
    Player playerheal = new Player();
    Player playerdf = new Player();
    Player playerchargeheal = new Player();

    String hpdisplay = "Hp:" + playerhp.getplayerhp();
    String healdisplay = "Heals:" + playerheal.getplayerheal();
    String dfdisplay = "Defense" +playerdf.playerdf;
    String Text = "nothing"; 
    frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);



    JButton btnChargeHeals = new JButton("Charge Heals");//charge heal button
    btnChargeHeals.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            playerchargeheal.getplayerchargeheal();
        String Text = "You charged your heals";

        }

    });

    JLabel lblNewLabel = new JLabel(hpdisplay );

    JLabel lblNewLabel_1 = new JLabel(healdisplay);


    JLabel lblNewLabel_2 = new JLabel(dfdisplay);

    JLabel lblNewLabel_3 = new JLabel(Text);

    GroupLayout groupLayout = new GroupLayout(frame.getContentPane());
    groupLayout.setHorizontalGroup(
        groupLayout.createParallelGroup(Alignment.LEADING)
            .addGroup(groupLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                    .addGroup(groupLayout.createSequentialGroup()
                        .addComponent(lblNewLabel)
                        .addPreferredGap(ComponentPlacement.UNRELATED)
                        .addComponent(lblNewLabel_1)
                        .addGap(80)
                        .addComponent(lblNewLabel_3))
                    .addComponent(lblNewLabel_2)
                    .addComponent(btnChargeHeals))
                .addContainerGap(211, Short.MAX_VALUE))
    );
    groupLayout.setVerticalGroup(
        groupLayout.createParallelGroup(Alignment.LEADING)
            .addGroup(groupLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                    .addComponent(lblNewLabel)
                    .addComponent(lblNewLabel_1)
                    .addComponent(lblNewLabel_3))
                .addPreferredGap(ComponentPlacement.RELATED)
                .addComponent(lblNewLabel_2)
                .addPreferredGap(ComponentPlacement.UNRELATED)
                .addComponent(btnChargeHeals)
                .addContainerGap(182, Short.MAX_VALUE))
    );
    frame.getContentPane().setLayout(groupLayout);
}
}

这是播放器:

package Player;

public class Player {

public int playerhp;
public double playerat;
public int playerheal; 
public int playerdf;
public int playerchargeheal;
     public Player(){
        playerhp = 100;
        playerat = (int)(Math.random()*10);
        playerheal = (10 + (int)(Math.random()*10 -1));
        playerdf = (int)(Math.random()*10);
        playerchargeheal = (10 + (int)(Math.random()));
    }
     public int getplayerhp()
     {
         return playerhp;
     }
     public double getplayerat()
     {
         return playerat;
     }
     public int getplayerheal()
     {
         playerheal = playerheal -1;
         return playerheal;
     }
     public int getplayerdf()
     {
         return playerdf;
     }
     public int getplayerchargeheal()
     {
         playerheal = playerheal + playerchargeheal;
         return playerheal;
     }
}

最佳答案

您的按钮仅对未显示的玩家对象进行治疗:playerchargeheal。如果您想更改显示的播放器的状态,则按钮的 ActionListener 需要调用所选显示的播放器的方法(尽管我不确定您根据代码如何选择)。

另请注意,一旦创建了 String 对象,该对象就无法更改——字符串是不可变的。如果您想要更改 JLabel 显示的内容,则必须通过在 JLabel 上调用 setText(...) 来具体执行此操作。

举个简单的例子:

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

public class FooGui extends JPanel {
   private FooPlayer fooPlayer = new FooPlayer();
   private JLabel fooPlayerHealth = new JLabel();
   private JButton increaseHealthBtn = new JButton("Increase Health");

   public FooGui() {
      increaseHealthBtn.addActionListener(new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent e) {
            // change player's health
            fooPlayer.increaseHealth();

            // create String to display in JLabel
            String text = String.format("Health: %03d", fooPlayer.getHealth());
            fooPlayerHealth.setText(text); // change JLabel's text with new information  
         }
      });

      String text = String.format("Health: %03d", fooPlayer.getHealth());
      fooPlayerHealth.setText(text);
      add(fooPlayerHealth);
      add(increaseHealthBtn);
   }

   private static void createAndShowGUI() {
      FooGui paintEg = new FooGui();

      JFrame frame = new JFrame("FooGui");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(paintEg);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGUI();
         }
      });
   }
}

public class FooPlayer {
   private static final int INCREASE_AMOUNT = 10;
   private int health = 0;

   public int getHealth() {
      return health;
   }

   public void increaseHealth() {
      health += INCREASE_AMOUNT;
   }

   public void setHealth(int health) {
      this.health = health;
   }

}

关于java - 如何更新 Java Gui 中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30016357/

相关文章:

java - 在js或java中为twitter的pentaho客户端生成oauth签名

java - 项目中的 list 合并失败问题

java - java中的print方法不打印jtable的内容

java - 掌握Java程序的流程

java - 防止多次提交 Struts2 : Not Showing Success Message

java - Hibernate 抛出 SQLGrammarException

java - 在最后一次出现字符后删除字符串

java - 当 Pane 宽度超过指定值时,在 JTextPane 中换行文本

java - 使用 Java 查找简单的 Active Directory 信息

c# - GUI 设计 : Hide/Show controls at run time