我想在某個時刻停止Timer
,然後從暫停點開始恢復。方法stop()
,start()
將不起作用。如何暫停Java Swing Timer?
是否有暫停Timer
然後恢復的功能?我想它不存在。
有沒有人有一個想法如何實現正確Timer
暫停?
我想在某個時刻停止Timer
,然後從暫停點開始恢復。方法stop()
,start()
將不起作用。如何暫停Java Swing Timer?
是否有暫停Timer
然後恢復的功能?我想它不存在。
有沒有人有一個想法如何實現正確Timer
暫停?
無法暫停計時器,只能停止並重新開始。
你想完成什麼?
javax.swing.Timer.setDelay(int);
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;
public class DelayedPaint {
private CenterPanel center;
private JFrame frame;
private JPanel panel;
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new DelayedPaint().createAndShowGUI();
}
});
}
void createAndShowGUI() {
frame = new JFrame("Delayed Paint");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(400, 400);
panel = new JPanel(new BorderLayout());
frame.setContentPane(panel);
NorthPanel north = new NorthPanel();
panel.add(north, BorderLayout.NORTH);
center = new CenterPanel();
panel.add(center, BorderLayout.CENTER);
frame.setVisible(true);
north.startTimer();
}
class NorthPanel extends JPanel {
private JLabel lb;
public NorthPanel() {
lb = new JLabel("Good morning");
add(lb);
}
public void startTimer() {
ActionListener taskPerformer = new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
setLayout(new FlowLayout(FlowLayout.LEFT));
lb.setText("Left");
// timer.stop(); // Not needed if setRepeats(false).
center.startTimer();
}
};
javax.swing.Timer timer = new javax.swing.Timer(2000, taskPerformer);
timer.setRepeats(false);
timer.start();
}
}
class CenterPanel extends JPanel {
private int icnt;
private Font boldFont = new Font("Dialog", Font.BOLD, 15);
private Properties centerProps;
private javax.swing.Timer timer;
public CenterPanel() {
centerProps = new Properties();
centerProps.setProperty("circle", "false");
centerProps.setProperty("lastString", "0");
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
if (Boolean.valueOf(centerProps.getProperty("circle"))) {
Dimension dim = frame.getSize();
g2.draw(new Arc2D.Double(50, 25, dim.height - 100, dim.width - 100, 0, 360, Arc2D.OPEN));
}
int j = Integer.parseInt(centerProps.getProperty("lastString"));
if (j > 0) {
g2.setFont(boldFont);
for (int i = 1; i <= j; i++) {
g2.drawString("" + (char) (i + 48), i * 10, 50);
}
}
}
public void startTimer() {
ActionListener taskPerformer = new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
repaint(); // in paintComponent(...) icnt is already icnt+1.
icnt++;
if (icnt == 1) {
centerProps.setProperty("circle", "true");
timer.setDelay(500);
} else if (icnt <= 10) {
centerProps.setProperty("lastString", String.valueOf(icnt - 1));
if (icnt == 10) {
timer.stop();
}
}
}
};
timer = new javax.swing.Timer(2000, taskPerformer);
timer.start();
}
}
}
沒有辦法,我知道真正的「暫停」一個Swing計時器,但也有簡單的方法來模擬它。我所知道的simplist方式是圍繞在定時器的所有操作有:
if(!paused) {
// place code here.
System.out.println("I am not Paused.");
} else {
System.out.println("I am Paused.");
}
的這個程序中使用的將是一個例子:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class ExampleClass implements ActionListener {
static boolean paused = false;
// delay in miliseconds.
static int delay = 5;
static Timer timer = new Timer(delay, new ExampleClass());
static JFrame jf = new JFrame();
static JPanel jp = new JPanel();
static JButton pause = new JButton("PAUSE");
static JButton unpause = new JButton("UNPAUSE");
public static void main(String[] args) {
System.out.println("Starting Program...");
pause.addActionListener(new ExampleClass());
unpause.addActionListener(new ExampleClass());
jp.add(pause);
jp.add(unpause);
jf.setSize(100, 100);
jf.setTitle("Window");
jf.setResizable(false);
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);
jf.add(jp);
jf.setVisible(true);
timer.start();
}
@Override
public void actionPerformed(ActionEvent e) {
if(!paused) {
System.out.println("IM NOT PAUSED!!! YAY!!!!");
if(e.getSource() == pause) {
paused = true;
}
} else {
System.out.println("urk... can't move... help me...");
if(e.getSource() == unpause) {
paused = false;
}
}
}
}
而且你去那裏。 而不是有按鈕來暫停和取消暫停你也可以(顯然)使用getters和setter。
當你使用stop()和start()方法時會發生什麼? – orien
http://stackoverflow.com/questions/3537484/swing-timer-how-to-pause-and-resume-it –
可能的副本我試過鏈接中的@yati提供的鏈接,它使用stop/start它在我的電腦上工作。 – toto2