Java 如何逐个刷新标签? 公共类测试{ 公共静态void main(字符串[]args){ Methode met=新Methode(); JFrame f=新JFrame(“标签示例”); jlabell1; JButton-btn; l1=新的JLabel(“开始”,SwingConstants.CENTER); btn=新的JButton(“Bestätigen”); JPanel面板=新的JPanel(); 字符串comboBoxListe[]={“1”、“2”、“3”、“4”、“5”};//1=300 2=250 3=200 4=150 5=100 JComboxBundeslandauswahl=新的JComboxBox(ComboxListe); 新增专家组(德国联邦陆军部); l1.立根(0,0,1800,800); l1.setFont(新字体(“衬线”,Font.PLAIN,100)); btn.立根(800,0,100,50); 面板立根(900,0,100,100); btn.addActionListener(新ActionListener(){ @凌驾 已执行的公共无效操作(操作事件e){ met.ausgabe(l1); } }); f、 添加(btn); f、 添加(l1); f、 添加(面板); f、 setLayout(空); f、 setVisible(真); f、 setLocationRelativeTo(空); f、 setExtendedState(JFrame.MAXIMIZED_两者); 定时器t=新定时器(); }} 类方法{ 无效ausgabe(JLabel l1){ 字符串temp=“”; 字符串[]arr2={“你好”,“世界”,“!”}; for(int i=0;i
} 如果使用ActionListener,则标签仅显示数组的最后一个元素。如果没有btn.addActionListener,它的工作将无法完成。我如何用按钮解决它?我希望在单击方法ausgabe时,代码会逐步显示标签中的各个数组字段Java 如何逐个刷新标签? 公共类测试{ 公共静态void main(字符串[]args){ Methode met=新Methode(); JFrame f=新JFrame(“标签示例”); jlabell1; JButton-btn; l1=新的JLabel(“开始”,SwingConstants.CENTER); btn=新的JButton(“Bestätigen”); JPanel面板=新的JPanel(); 字符串comboBoxListe[]={“1”、“2”、“3”、“4”、“5”};//1=300 2=250 3=200 4=150 5=100 JComboxBundeslandauswahl=新的JComboxBox(ComboxListe); 新增专家组(德国联邦陆军部); l1.立根(0,0,1800,800); l1.setFont(新字体(“衬线”,Font.PLAIN,100)); btn.立根(800,0,100,50); 面板立根(900,0,100,100); btn.addActionListener(新ActionListener(){ @凌驾 已执行的公共无效操作(操作事件e){ met.ausgabe(l1); } }); f、 添加(btn); f、 添加(l1); f、 添加(面板); f、 setLayout(空); f、 setVisible(真); f、 setLocationRelativeTo(空); f、 setExtendedState(JFrame.MAXIMIZED_两者); 定时器t=新定时器(); }} 类方法{ 无效ausgabe(JLabel l1){ 字符串temp=“”; 字符串[]arr2={“你好”,“世界”,“!”}; for(int i=0;i,java,swing,user-interface,label,Java,Swing,User Interface,Label,} 如果使用ActionListener,则标签仅显示数组的最后一个元素。如果没有btn.addActionListener,它的工作将无法完成。我如何用按钮解决它?我希望在单击方法ausgabe时,代码会逐步显示标签中的各个数组字段 谢谢,这是因为您必须重新绘制组件(l1)。在单线程程序中使用图形用户界面时,程序将在GUI代码中运行到while块中。因此,当正在执行的代码部分不是您的代码时,程序将在GUI人员中工作,如重新绘制窗口或图形组件。 您必须在l1中调用一个方法来重新绘制它。这就是原因
谢谢,这是因为您必须重新绘制组件(l1)。在单线程程序中使用图形用户界面时,程序将在GUI代码中运行到while块中。因此,当正在执行的代码部分不是您的代码时,程序将在GUI人员中工作,如重新绘制窗口或图形组件。 您必须在l1中调用一个方法来重新绘制它。这就是原因,因为最后一段文字是唯一显示的。这样就可以执行GUI代码,并更新您的界面。如果你这样做,你的问题就会解决。使用java文档查找此方法。首先查看此方法不起作用的原因,然后查看解决方案 “核心”问题是,Swing是单线程的,而不是线程安全的。这意味着,当您从
ActionListener
调用ausgabe
时,您正试图在事件调度线程的上下文中运行长时间运行/阻塞进程
但是,在该方法存在之前,EDT无法处理任何新绘制或其他事件,因此在完成之前不会更新任何内容
因为Swing也不是线程安全的,所以不建议使用线程来尝试解决该问题。相反,您应该使用Swing计时器
,它的作用类似于一个伪循环,但在EDT中被调用,从而可以安全地使用它来更新UI
例如
您还应该花时间学习如何使用各种布局管理器,这将为您节省大量时间、麻烦和麻烦
有关更多详细信息,请参阅
我可能会使用的一个技巧是使用两个标签。其中一个设置了全文,其文本颜色设置为与面板背景相同的颜色,第二个用于设置更新动画。每一个都要定位,以便彼此重叠
这样,您可以向布局管理器提供足够的信息,以确定组件需要多少空间
在上面的例子中,我只是作弊并覆盖了getPreferredSize
,同样,这可能只是计算了标签的最终大小,但这变得越来越复杂。首先看看这种方法不起作用的原因,然后再看看解决方案,您的容器层次结构和布局也会出现问题。Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作,在不同的地区使用不同的PLAF。因此,它们不利于像素完美布局。使用布局管理器,或者与布局填充和边框一起使用。你能告诉我如何以及在何处添加重绘吗?不,你没有<JLabel
的code>setText
是一个绑定属性,这意味着它将触发自己的属性update@R0land01除此之外,循环在事件调度线程中被调用,这意味着在方法退出之前,EDT不会处理任何新的绘制事件,因此,即使需要,还是不行work@MadPgrogrammer你是对的。EDT不会关注其他事件。
public class Test {
public static void main(String[] args) {
Methode met = new Methode();
JFrame f = new JFrame("Label Example");
JLabel l1;
JButton btn;
l1 = new JLabel("Start", SwingConstants.CENTER);
btn = new JButton("Bestätigen");
JPanel panel = new JPanel();
String comboBoxListe[] = { "1", "2", "3", "4", "5" }; // 1=300 2=250 3=200 4=150 5=100
JComboBox bundeslandAuswahl = new JComboBox(comboBoxListe);
panel.add(bundeslandAuswahl);
l1.setBounds(0, 0, 1800, 800);
l1.setFont(new Font("Serif", Font.PLAIN, 100));
btn.setBounds(800, 0, 100, 50);
panel.setBounds(900, 0, 100, 100);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
met.ausgabe(l1);
}
});
f.add(btn);
f.add(l1);
f.add(panel);
f.setLayout(null);
f.setVisible(true);
f.setLocationRelativeTo(null);
f.setExtendedState(JFrame.MAXIMIZED_BOTH);
Timer t = new Timer();
}}
class Methode {
void ausgabe(JLabel l1) {
String temp = "";
String[] arr2 = { "Hallo", "World", "!" };
for (int i = 0; i < arr2.length; i++) {
temp = arr2[i];
l1.setText(temp);
try {
Thread.sleep(800);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JLabel label;
private Timer timer;
private String text = "Hello World";
public TestPane() {
setLayout(new GridBagLayout());
label = new JLabel("");
add(label);
}
@Override
public void addNotify() {
super.addNotify();
if (timer != null) {
timer.stop();
timer = null;
}
timer = new Timer(1000, new ActionListener() {
private int counter;
@Override
public void actionPerformed(ActionEvent evt) {
if (counter >= text.length()) {
timer.stop();
timer = null;
}
label.setText(text.substring(0, counter));
counter += 1;
}
});
timer.setInitialDelay(1000);
timer.start();
}
@Override
public void removeNotify() {
super.removeNotify();
if (timer != null) {
timer.stop();
timer = null;
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
}