我是编程新手,我遇到了一些麻烦。
问题是,我正在使用Swing调色板来创建一个赋值,我正在使用JDialog在另一帧的同一时间显示一个计时器,当我将此帧置于另一帧并返回到在前一个JDialog中的计时器与正在运行的第一个计时器重叠,我无法设法修复它。
这是代码。
MAIN
public static void main(String[] args) {
Panel0 screen=new Panel0();
screen.setTitle("");
screen.setLocationRelativeTo(screen);
screen.setVisible(true);
}
第1帧
public class Panel0 extends javax.swing.JFrame {
Panel s=new Panel();
private void fisica1ActionPerformed(java.awt.event.ActionEvent evt) {
s.time();
s.setTitle("FISIC I");
s.setLocationRelativeTo(s);
s.setVisible(rootPaneCheckingEnabled);
s.dialog.setVisible(rootPaneCheckingEnabled);
dispose();
}
第二帧
public class Panel extends javax.swing.JFrame {
private void EndActionPerformed(java.awt.event.ActionEvent evt) {
dialog.dispose();
dialog.setDefaultCloseOperation(0);
Panel0 pan=new Panel0();
pan.setLocationRelativeTo(p1);
pan.setVisible(rootPaneCheckingEnabled);
dispose();
}
void time(){
t=new Timer(1,new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (startTime<0) {
startTime=System.currentTimeMillis();
}
long now = System.currentTimeMillis();
long clockTime = now - startTime;
if (clockTime >= duration) {
clockTime = duration;
t.stop();
}
SimpleDateFormat sdf=new SimpleDateFormat("mm:ss:SS");
clock.setText(sdf.format(duration-clockTime));
}
});
t.setInitialDelay(0);
if (!t.isRunning()) {
startTime = -1;
t.start();
}
}
我省略了Timer的初始化等等,因为我认为这不是问题所在。
澄清一些事情:一旦我关闭第二帧,第一帧打开并给我选项反复重复此过程,每次名为“对话框”的JDialog与其数据重叠(您可以看到时钟重叠的数字) )。
答案 0 :(得分:0)
dispose()
并不意味着您将“销毁”对象或清除其状态。这意味着您将释放附加到该帧的图形资源(低级窗口句柄和东西)。它仍然可以与setVisible(true)
我认为你想要重复使用我们的弹出窗口 - 这很好,但我认为你忘记停止“处置”计时器,因此你在行动中创建的每个新计时器都将暴露于所谓的“赛车条件” 。
定时器是简单的后台任务,必须明确停止 - 它本身不会完成。
每次拨打s.time();
都会启动新的计时器而不会停止前一个计时器。
简单来说:您有多个计时器更新相同的文本字段。
解决方案:在运行新的OR重新启动前一个计时器之前停止上一个计时器。