Я пытаюсь создать таймер с графическим интерфейсом без использования javax.swing.Timer
(странная задача), но у меня не получается заставить его работать. Предполагается, что поток приостанавливается на 1 секунду, добавляется 1 к seconds
и повторяется (бесконечно). Когда я запускаю свою программу, значок появляется, но окно не появляется. Я предполагаю, что моя ошибка находится в строке Thread.sleep(1000);
или в этой области, но я не уверен, почему это не работает. Является ли Thread.sleep(millis)
несовместимым с Swing-приложениями? Должен ли я использовать многопоточность? Вот моя программа:
import java.awt.*;
import javax.swing.*;
public class GUITimer extends JFrame {
private static final long serialVersionUID = 1L;
private int seconds = 0;
public GUITimer() {
initGUI();
pack();
setVisible(true);
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
private void initGUI(){
JLabel title = new JLabel("Timer");
Font titleFont = new Font(Font.SERIF, Font.BOLD, 32);
title.setFont(titleFont);
title.setHorizontalAlignment(JLabel.CENTER);
title.setBackground(Color.BLACK);
title.setForeground(Color.WHITE);
title.setOpaque(true);
add(title, BorderLayout.NORTH);
JLabel timeDisplay = new JLabel(Integer.toString(seconds));//this label shows seconds
add(timeDisplay, BorderLayout.CENTER);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
seconds++;
initGUI();
}
public static void main(String[] args) {
try {
String className = UIManager.getCrossPlatformLookAndFeelClassName();
UIManager.setLookAndFeel(className);
}
catch (Exception e) {}
EventQueue.invokeLater(new Runnable() {
public void run() {
new GUITimer();
}
});
}
}
EDIT:
Я заметил, что когда я печатаю seconds
в своем методе initGUI()
для консоли, он правильно печатает их с шагом в одну секунду. Итак, когда это выглядит так:
private void initGUI() {
System.out.println(seconds);
//...
он печатает значение seconds
через каждую секунду (как должно быть JLabel
). Это показывает, что мой цикл работает нормально, и мой Thread.sleep(1000)
тоже в порядке. Моя единственная проблема сейчас в том, что кадр не отображается.
Timer
. Вместо этого рассмотритеSwingWorker
. Осторожно,Thread.sleep
гарантирует только минимальную задержку; Swing НЕ является потокобезопасным, поэтому вам нужно убедиться, что вы обновляете пользовательский интерфейс только из контекста EDT, и вы рискуетеStackOverFlowException
- person MadProgrammer   schedule 22.05.2017I am practicing using recursion.
- это не практическое использование рекурсии. Определенно нет необходимости постоянно создавать компоненты и добавлять их во фрейм. - person camickr   schedule 22.05.2017getFiles()
. Затем метод перечисляет файлы. Когда if находит каталог, он снова вызываетgetFiles(...)
с новым каталогом. Это повторяется до тех пор, пока не будут перечислены все файлы и метод не завершится. - person camickr   schedule 22.05.2017