如何在运行时更新JLabel



JLabel的名称被设置为int类型,随着用户修改编号而改变。重新验证和标签。在用户更改int值后重新绘制。我看到类似的问题,人们建议创建一个新的jlabel每次,但我想知道是否有一个更简单的方法?代码很长,所以我将在需要时进行总结。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class officia {
static JFrame Frame;
static JPanel Panel;
static JTextField healthPlace;
static String health="0";
static JButton begin;
static JLabel heart;
static int loop;

public static void main(String[] args) {

Panel = new JPanel();

Frame = new JFrame();
Frame.setSize(500,1000);
Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Frame.add(Panel);
Panel.setLayout(null);
//adds panel and frame

healthPlace = new JTextField();
healthPlace.setBounds(170, 130, 165, 25);
Panel.add(healthPlace);

begin = new JButton("Begin");
begin.setBounds(217, 185, 70, 25);
Panel.add(begin);

while(loop==1)
loop=0;

heart = new JLabel(health);
heart.setBounds(150, -85, 500, 500);
Panel.add(heart);

Frame.setVisible(true); 
//inputs gui's


ActionListener beginPressed = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {

health = healthPlace.getText();
loop=1;
}
};
begin.addActionListener(beginPressed);
}
}

您在一个事件驱动的环境中工作,也就是说,发生了一些事情,您对它做出响应。

这意味着,你的while-loop是欠考虑的,可能是你的问题的根源。当循环运行时,如何添加按钮的ActionListener,但您似乎使用ActionListener退出循环…

我稍微修改了你的代码,所以当你按下按钮时,它会更新标签。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class officia {
static JFrame Frame;
static JPanel Panel;
static JTextField healthPlace;
static String health = "0";
static JButton begin;
static JLabel heart;
static int loop;
public static void main(String[] args) {
Panel = new JPanel();
Frame = new JFrame();
Frame.setSize(500, 1000);
Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Frame.add(Panel);
Panel.setLayout(null);
//adds panel and frame  
healthPlace = new JTextField();
healthPlace.setBounds(170, 130, 165, 25);
Panel.add(healthPlace);
begin = new JButton("Begin");
begin.setBounds(217, 185, 70, 25);
Panel.add(begin);
// This is ... interesting, but a bad idea
//        while (loop == 1) {
//            loop = 0;
//        }

heart = new JLabel(health);
heart.setBounds(150, -85, 500, 500);
Panel.add(heart);
Frame.setVisible(true);
//inputs gui's
ActionListener beginPressed = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
health = healthPlace.getText();
loop ++;
heart.setText(Integer.toString(loop));
}
};
begin.addActionListener(beginPressed);
}
}

JLabel#setText是所谓的有状态属性,也就是说,它会触发一个更新,将导致它被绘制,所以,如果它不更新,你做错了什么。

可能运行的例子(我认为你想做什么)

你正在做一个非常丰富的UI框架。布局管理框架是它的众多特性之一,你应该认真花时间去学习理解和使用它。

详细信息请参见在容器内布局组件。

下面是一个相对简单的例子,它展示了一种"切换"的方法。基于对用户输入的响应的视图之间

import java.awt.CardLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new BasePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class BasePane extends JPanel {
private CardLayout cardLayout;
public BasePane() {
cardLayout = new CardLayout();
setLayout(cardLayout);
StartPane startPane = new StartPane(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cardLayout.show(BasePane.this, "HeartPane");
}
});
HeartPane heartPane = new HeartPane();
add(startPane, "StartPane");
add(heartPane, "HeartPane");
}        
}
public class StartPane extends JPanel {
public StartPane(ActionListener actionListener) {
setBorder(new EmptyBorder(10, 10, 10, 10));
setLayout(new GridBagLayout());
JButton start = new JButton("Begin");
add(start);
start.addActionListener(actionListener);
}
}
public class HeartPane extends JPanel {
private JTextField heartTextField;
private JLabel heartLabel;
public HeartPane() {
setBorder(new EmptyBorder(10, 10, 10, 10));
setLayout(new GridBagLayout());
heartLabel = new JLabel("Heart");
heartTextField = new JTextField(10);
add(heartLabel);
add(heartTextField);
}
}
}

最新更新