Java 将文本从一种内容更改为另一种内容的JLabel

Java 将文本从一种内容更改为另一种内容的JLabel,java,swing,jframe,jlabel,Java,Swing,Jframe,Jlabel,我正在做这个项目,我遇到了另一个问题。我有一个Jframe和一个JLabel,我希望它能将文本从一件事更改为另一件事。然而,当我尝试这样做时,它不会显示文本的变化,而是显示我设置的最后一个文本 如何让我的JLabel在文本中缓慢循环 我正在尝试一种等待方法,让程序运行得很慢,这样我就可以看看是否可以让它循环运行,但这似乎不起作用 如果有人可以编辑我的代码或制作他们自己的示例,这将是非常有帮助的,谢谢 public class CreditGraphics { public String

我正在做这个项目,我遇到了另一个问题。我有一个Jframe和一个JLabel,我希望它能将文本从一件事更改为另一件事。然而,当我尝试这样做时,它不会显示文本的变化,而是显示我设置的最后一个文本

如何让我的JLabel在文本中缓慢循环

我正在尝试一种等待方法,让程序运行得很慢,这样我就可以看看是否可以让它循环运行,但这似乎不起作用

如果有人可以编辑我的代码或制作他们自己的示例,这将是非常有帮助的,谢谢

public class CreditGraphics {

    public String cardNum;
    public JFrame frame;
    public JPanel panel;
    public JLabel label;
    public JTextField text;

    public CreditGraphics() {
    synchronized(this){
    try {


        frame = new JFrame("HI");
        panel = new JPanel();
        label = new JLabel();

        text = new JTextField(16);

        panel.add(label);
        panel.add(text);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel.setPreferredSize(new Dimension(500, 500));
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true); 

        wait(4000);
        label.setText("Hi");
        wait(4000);
        frame.revalidate();
        frame.repaint();
        label.setText("Hello");
        frame.revalidate();
        frame.repaint();


        text.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                cardNum = text.getText();

            }

        });

         }
         catch(InterruptedException e) {
    e.printStackTrace();
    }}

    }

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


                new CreditGraphics();

               }




        });
    }

    public void checkCard(){


    }

}

不要使用Thread.sleep()或wait(),因为它会冻结Swing应用程序

相反,您应该使用
javax.swing.Timer


有关更多信息和示例,请参阅Java教程和。

不要使用Thread.sleep()或wait(),因为它将冻结Swing应用程序

相反,您应该使用
javax.swing.Timer


有关更多信息和示例,请参阅Java教程和。

正如@trashgod建议的那样,使用更适合swing应用程序在延迟后执行一次任务或重复执行任务

示例代码:

private Timer timer;
...
label.setText("Hi");
// delay of 4 seconds
timer=new Timer(4000,new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
        label.setText("Hello");
        // timer.stop(); // stop the timer if repeated mode is on
    }
});
timer.setRepeats(false); // you can turn-on it if needed
timer.start();
JPanel panel = new JPanel() {

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(..., ...);
    }
};
注意:

  • 在这种情况下,不需要调用
    frame.repaint()
    frame.revalidate()
  • 覆盖
    getPreferredSize()
    以设置自定义绘制时
    JPanel
    的首选大小
示例代码:

private Timer timer;
...
label.setText("Hi");
// delay of 4 seconds
timer=new Timer(4000,new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
        label.setText("Hello");
        // timer.stop(); // stop the timer if repeated mode is on
    }
});
timer.setRepeats(false); // you can turn-on it if needed
timer.start();
JPanel panel = new JPanel() {

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(..., ...);
    }
};

正如@trashgod所建议的,更适合swing应用程序在延迟后执行一次任务或重复执行任务

示例代码:

private Timer timer;
...
label.setText("Hi");
// delay of 4 seconds
timer=new Timer(4000,new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
        label.setText("Hello");
        // timer.stop(); // stop the timer if repeated mode is on
    }
});
timer.setRepeats(false); // you can turn-on it if needed
timer.start();
JPanel panel = new JPanel() {

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(..., ...);
    }
};
注意:

  • 在这种情况下,不需要调用
    frame.repaint()
    frame.revalidate()
  • 覆盖
    getPreferredSize()
    以设置自定义绘制时
    JPanel
    的首选大小
示例代码:

private Timer timer;
...
label.setText("Hi");
// delay of 4 seconds
timer=new Timer(4000,new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
        label.setText("Hello");
        // timer.stop(); // stop the timer if repeated mode is on
    }
});
timer.setRepeats(false); // you can turn-on it if needed
timer.start();
JPanel panel = new JPanel() {

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(..., ...);
    }
};

不要在EDT上睡觉;使用
SwingUtilities请参见.1。invokeLater
不要在EDT上睡眠;使用
SwingUtilities,请参见.1。invokeLater
这与其说是答案,不如说是评论。这与其说是答案,不如说是评论。谢谢,这和david发布的内容看起来非常有用。为了澄清这一点,我可以使用这些方法来创建一个jlabel,首先说“您好,欢迎使用我的程序”,然后在几秒钟后循环使用“请输入您的数据”(不泄露我的程序;))谢谢,这和david发布的内容看起来非常有用。因此,为了澄清问题,我可以使用这些方法创建一个jlabel,首先说“您好,欢迎使用我的程序”,然后在几秒钟后循环到“请输入您的数据”(在不泄露我的程序的情况下,按照这些思路做的事情;)