参见英文答案 >
Loop doesn’t see changed value without a print statement1个
我一直在制作倒计时节目,我想出了这个.
我一直在制作倒计时节目,我想出了这个.
package main; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.DataLine; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.UnsupportedAudioFileException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; public class Gatoo extends JFrame implements ActionListener { private int sec,min,secTot,since = 999; private long lastTime; private JTextField mm = new JTextField(2),ss = new JTextField(2); private JLabel minLab = new JLabel("Minutes:"),secLab = new JLabel( "Seconds:"); private JButton start = new JButton("Start"); private Clip done; private boolean started = false; private static final long serialVersionUID = 4277921337939922028L; public static void main(String[] args) { Gatoo cake = new Gatoo("Title"); cake.pack(); cake.setSize(800,600); cake.setLocationRelativeTo(null); cake.setDefaultCloSEOperation(3); cake.setVisible(true); cake.run(); } public Gatoo(String s) { super(s); setLayout(new FlowLayout()); start.addActionListener(this); add(minLab); add(mm); add(secLab); add(ss); add(start); } @Override public void actionPerformed(ActionEvent e) { started = true; } public void play(File file) throws MalformedURLException,UnsupportedAudioFileException,IOException,LineUnavailableException { AudioInputStream ais = AudioSystem.getAudioInputStream(new File( "lib/done.wav")); DataLine.Info info = new DataLine.Info(Clip.class,ais.getFormat()); done = (Clip) AudioSystem.getLine(info); done.open(ais); done.start(); } public void run() { while (true) { System.out.print("");// needed? if (started) { try { min = Integer.parseInt(mm.getText()); sec = Integer.parseInt(ss.getText()); secTot = (min * 60) + sec; lastTime = System.currentTimeMillis(); while (secTot > 0) { since = (int) (System.currentTimeMillis() - lastTime); if (since > 998) { lastTime = System.currentTimeMillis(); secTot--; } } play(new File("done.wav")); } catch (NumberFormatException exception) { System.out.println("Minutes and seconds must be numbers."); return; } catch (Exception exception) { exception.printStackTrace(); } started = false; } } } }
在最后的while循环中,如果没有print / println语句,倒计时代码就不会执行.怎么会?尽管如此,该程序与print语句完美配合.