public class UserInterface {
OpenFile of = new OpenFile();
JFrame jf = new JFrame("File Manager");
JButton jb1 = new JButton("Open File");
JLabel jl1 = new JLabel("Recommendations appear here");
JLabel jl2 = new JLabel();
JList<String> list;
public void build() {
DefaultListModel<String> str = new DefaultListModel<String>();
for (int i = 0; i < of.f.length; i++) {
str.addElement(of.f[i].getAbsolutePath());
}
list = new JList<String>(str);
Border b = BorderFactory.createLineBorder(Color.black, 2);
Font f = new Font("Arial", Font.BOLD, 20);
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
of.OpenFileMethod(list.getSelectedValue());
}
});
jl1.setFont(f);
jl1.setBorder(b);
list.setFont(f);
jf.add(jl1).setBounds(30, 100, 300, 200);
jf.add(list).setBounds(400, 100, 300, 300);
jf.add(jb1).setBounds(250, 300, 100, 50);
jf.setLayout(null);
jf.setSize(800, 800);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
for (int i = 0; i < 100; i++) {
jl1.setText("Loading.");
jl1.setText("Loading...");
}
}
}
for循环中的问题,仅将最后的“正在加载...”文本设置为JLabel 我希望它进入循环并打印100次。可能是循环在启动swing应用程序之前结束了。有什么解决办法吗?
答案 0 :(得分:2)
对此有什么解决办法?
这里没有什么错,这段代码可以完美地工作,但是这里的问题是当循环执行时,眨眼就可以完成!
在这种情况下,您最好的朋友是javax.swing.Timer
类
,该示例将向您展示如何使用它,并有望解决您的问题,
计时器具有自己的共享Thread
,因此您不必担心它会在不挂起ui或阻止代码的情况下运行。
//this int determines the time delay for each time it executes it's actions
private int delay = 20;
private int times = 0;
private String text = "Loading ";
private Timer textTimer;
private class TimerAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
times++;
String theSetText = text;
for (int i = 0; i < times; i++) {
theSetText += ".";
}
if (times == 3) {
times = 0;
}
}
}
您始终可以通过timer.addActioListener
方法添加更多的动作侦听器,该方法也将在那里循环。
对于您的问题,只需将以上代码添加到您的类中,然后在代码中添加替换循环即可
textTimer = new Timer (delay,new TimerAction ());
textTimer.start();
,当时间合适时(根据需要),当您希望停止时,只需致电
textTimer.stop();
停止计时器运行。 这是获取有关主题How to Use Swing Timers
的更多信息的链接