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 如何逐个刷新标签? 公共类测试{ 公共静态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中调用一个方法来重新绘制它。这就是原因

}

如果使用ActionListener,则标签仅显示数组的最后一个元素。如果没有btn.addActionListener,它的工作将无法完成。我如何用按钮解决它?我希望在单击方法ausgabe时,代码会逐步显示标签中的各个数组字段


谢谢,这是因为您必须重新绘制组件(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);
        }

    }
}