Я думаю, что лучший вопрос: «Когда вы будете использовать @classmethod vs @staticmethod?»
@classmethod позволяет вам легко получить доступ к закрытым членам, которые связаны с определением класса. это отличный способ сделать одиночные игры или фабричные классы, которые контролируют количество экземпляров созданных объектов.
@staticmethod обеспечивает предельный прирост производительности, но мне еще предстоит увидеть продуктивное использование статического метод внутри класса, который не может быть выполнен как автономная функция вне класса.
Не зная полной степени того, что вы пытаетесь сделать, это не совсем возможно для вас точный ответ.
Из звуков вещей, которые вы пытаетесь запустить долго выполняемые задачи в контексте Событие Dispatching Thread.
Блокировка этой нити предотвращает перерисовку Swing.
Из того, что я могу сказать, вы хотите использовать SwingWorker . Это позволит вам выполнять свою работу в фоновом потоке, а повторная синхронизация обновлений обратно в EDT
Обновлена с помощью примера
Я знаю, что вы сказали, что не «хотите» использовать a SwingWorker
, но, честно говоря, это просто проще и безопаснее ...
[/g1]
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class LongRunningTask {
public static void main(String[] args) {
new LongRunningTask();
}
public LongRunningTask() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
new BackgroundWorker().start();
}
});
}
public class BackgroundWorker extends SwingWorker<Object, Object> {
private JFrame frame;
public BackgroundWorker() {
}
// Cause exeute is final :P
public void start() {
ImageIcon icon = new ImageIcon(getClass().getResource("/spinner.gif"));
JLabel label = new JLabel("This might take some time");
label.setIcon(icon);
frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridBagLayout());
frame.add(label);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
execute();
}
@Override
protected Object doInBackground() throws Exception {
System.out.println("Working hard...");
Thread.sleep(1000 + (((int)Math.round(Math.random() * 5)) * 1000));
System.out.println("Or hardly working...");
return null;
}
@Override
protected void done() {
frame.dispose();
}
}
}
Вы используете Timer Class в пакете java.util и планируете timertask, чтобы закрыть заставку через некоторое время, скажем, 2 минуты или задача завершена.
final Processing nc = new Processing();
nc.setVisible(true);
Timer timer = new Timer():
TimerTask task = new TimerTask() {
public void run() {
nc.setVisible( false );
// to do disposing nc
}
};
timer.schedule( task, 1000 * 3 ); // dispose the processing frame after 3 minutes