为什么我的Java定时器程序不能在Mac上运行?
在Mac上使用java是否有任何原因导致我下面的代码无法工作?它正在Windows上工作。但是它不会在Mac上显示GUI,我已经尝试过更新java并重新启动机器。它仍然没有显示带有计时器的GUI。有可能是我用来编写代码的程序(Eclipse)吗为什么我的Java定时器程序不能在Mac上运行?,java,Java,在Mac上使用java是否有任何原因导致我下面的代码无法工作?它正在Windows上工作。但是它不会在Mac上显示GUI,我已经尝试过更新java并重新启动机器。它仍然没有显示带有计时器的GUI。有可能是我用来编写代码的程序(Eclipse)吗 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TimerApplication extends JFrame implements Acti
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TimerApplication extends JFrame implements ActionListener{
private javax.swing.Timer timer;
private JTextField seconds;
private JTextField minutes;
private int nTimeDelay = 50;
private int ticks = 0;
public static void main(String[] args) {
TimerApplication frame = new TimerApplication();
frame.setSize(300, 100);
frame.createGUI();
frame.setVisible(true);
}
private void createGUI(){
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container window = getContentPane();
window.setLayout(new FlowLayout());;
seconds = new JTextField();
minutes = new JTextField();
window.add(minutes);
window.add(seconds);
timer = new javax.swing.Timer(50, this);
timer.start();
ticks=0;
}
@Override
public void actionPerformed(ActionEvent event) {
if(event.getSource()==timer)
{
minutes.setText(String.format("%02d", (ticks*(nTimeDelay)/1000) / 60));
seconds.setText(String.format("%02d",(ticks*(nTimeDelay)/1000) % 60));
ticks++;
}
}
}
这闻起来像是一个多线程错误 我认为,初始化
TimerApplication
并为timer
赋值的“主”线程与将执行touractionPerformed
方法调用的Swing事件调度程序线程(EDT)之间的同步不足。这意味着actionPerformed
调用可能永远看不到另一个线程中分配给timer
的值
净结果:event.getSource()==timer
将始终为false
纠正此问题的一种方法是进行以下更改:
synchronized (this) {
timer = new javax.swing.Timer(50, this);
timer.start();
ticks = 0;
}
及
它在我的OSX机器上工作。那么当你执行它时会发生什么呢?没有例外吗?该过程是否完成?当我尝试运行文档时,它会打开一个java窗口,但没有出现GUI,等待20分钟后,它仍然没有显示或关闭,向我建议它正在后台运行,但不会显示。什么是“java窗口”?我正在使用Eclipse IDE编写代码,因此,当我运行一个程序时,它会将Java作为一个单独的应用程序窗口打开
synchronized (this) {
if (event.getSource() == timer) {
minutes.setText(String.format("%02d", ticks * nTimeDelay / 1000 / 60));
seconds.setText(String.format("%02d", ticks * nTimeDelay / 1000 % 60));
ticks++;
}
}