我正在研究这个程序,但遇到了另一个问题。我有一个带有 JLabel 的 Jframe,我希望它能将文本从一个事物更改为另一个事物。但是,当我尝试这样做时,它并没有向我显示正在更改的文本,而是显示我将其设置为的最后一个文本。
如何让我的 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(){
}
}
最佳答案
按照@trashgod 的建议使用 Swing Timer这更适合 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();
注意:
- 在这种情况下无需调用
frame.repaint()
和frame.revalidate()
。 - 覆盖
getPreferredSize()
以在自定义绘画的情况下设置JPanel
的首选大小。
示例代码:
JPanel panel = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(..., ...);
}
};
关于java - 将文本从一件事更改为另一件事的 JLabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25019050/