Я читаю носитель с vlcj и хочу отображать прошедшее и оставшееся время в некоторых JLabels. Я написал некоторый код, но кажется, что мой JLabel.setText не обновляется чаще, чем 2 раза в секунду.
Чтобы сделать еще одну попытку и быть уверенным, что это не поток vlcj, у которого будут проблемы, я написал очень код с JLabel. Цель этого простого кода — обновлять JLabel 10 раз в секунду.
Вот мой код:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class TestLabel extends JFrame implements Runnable{
JLabel label = new JLabel("0");
int i=0;
TestLabel() {
this.setTitle("Test");
this.setSize(200, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setContentPane(label);
this.setVisible(true);
}
public static void main(String[] args) {
TestLabel tLabel = new TestLabel();
Thread t1 = new Thread(tLabel);
t1.start();
}
@Override
public void run() {
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
i+=1;
System.out.println(i);
label.setText(String.valueOf(i));
}
}, 0, 100, TimeUnit.MILLISECONDS);
}
}
Результат: в консоли я получаю 1, 2, 3, 4... Но в JLabel у меня что-то вроде: 1, 2, 3 (...) 32, 37, 42, 47. Кажется, что System.out.println записывает каждую букву «i», а JLabel — нет. Зачем мне этот артефакт?
Спасибо за все ваши ответы. С уважением.