当我每次点击“充电治疗”按钮时,它不会改变我拥有的治疗数量。当你运行 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/