通过 JMenuBar 变量控制 Java 定时器
Variable Controlled Java Timer through JMenuBar
我对 java 编码比较陌生,正在尝试制作我的第一款游戏。我目前遇到的问题是试图以不同的速度让游戏达到 运行。我试图通过让用户 select 通过 JMenuBar
他们想要的速度设置然后控制定时器速度来实现这一点,但是,我无法找到一种方法用户控制他们延迟变量。
我已经尝试了几种不同的方法来改变延迟,但是延迟只有在括号之间有一个实际的 int 变量时才有效。
下面是我的代码现在尝试更改计时器延迟的位置:
private int speed, delay;
private JRadioButtonMenuItem fast, normal, slow;
private boolean speedSlow = false;
private boolean speedNorm = false;
private boolean speedFast = false;
public game()
{
frame = new JFrame("Simon");
renderer = new Renderer();
JMenuBar menuBar = setMenuBar();
frame.setSize(WIDTH + 8, HEIGHT + 30);
frame.setVisible(true);
frame.addMouseListener(this);
frame.setResizable(false);
frame.add(renderer);
frame.setJMenuBar(menuBar);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Timer timer = new Timer(setDelay(delay), this);
start();
timer.start();
}
public JMenuBar setMenuBar()
{
JMenuBar menuBar = new JMenuBar();
JMenu settings = new JMenu("Settings");
JMenu speedSet = new JMenu("Set Speed");
slow = new JRadioButtonMenuItem("Slow");
normal = new JRadioButtonMenuItem("Normal");
fast = new JRadioButtonMenuItem("Fast");
slow.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
speedSlow = true;
}
});
normal.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
speedNorm = true;
}
});
fast.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
speedFast = true;
}
});
speedSet.add(slow);
speedSet.add(normal);
speedSet.add(fast);
settings.add(speedSet);
menuBar.add(settings);
return menuBar;
}
public int setDelay(int delay)
{
if (speedSlow)
{
delay = 30;
}
if (speedNorm)
{
delay = 20;
}
if (speedFast)
{
delay = 10;
}
return delay;
}
public void start()
{
random = new Random();
indexShown = 0;
ticks = 0;
score = 0;
speed = delay;
}
如我所见, delay
的初始值(即0)设置为定时器并启动定时器。而 Timer 的延迟永远不会更新。如果您希望在用户单击菜单项时更新定时器的延迟,则必须在菜单项的动作侦听器中执行此操作。
Below is where my code is at now trying to change the timer delay:
嗯,如果你想改变Timer
的"delay",那么你需要调用TImer
的setDelay(..)
方法。
private boolean speedSlow = false;
private boolean speedNorm = false;
private boolean speedFast = false;
不需要那些变量。相反,您只想在单击菜单项时设置 Timer
的延迟。所以这意味着您需要将 Timer
变量设为实例变量,以便它可以在您的 ActionListeners
:
中引用
private Timer timer;
现在在您的构造函数中创建具有默认延迟的计时器:
timer = new Timer(30, this);
然后在您的 ActionListeners 中重置延迟。例如:
slow.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
//speedSlow = true;
timer.setDelay( 30 );
}
});
不需要您现有的 setDelay(...) 方法。此外,"setter" 方法不应 return 值。 "setter"方法的要点是设置class的属性。如果您需要访问该值,您还可以创建一个 "getter" 方法。虽然在这种情况下,这两种方法都不需要,因为您可以直接从 Timer 对象 set/get/ 延迟。
我对 java 编码比较陌生,正在尝试制作我的第一款游戏。我目前遇到的问题是试图以不同的速度让游戏达到 运行。我试图通过让用户 select 通过 JMenuBar
他们想要的速度设置然后控制定时器速度来实现这一点,但是,我无法找到一种方法用户控制他们延迟变量。
我已经尝试了几种不同的方法来改变延迟,但是延迟只有在括号之间有一个实际的 int 变量时才有效。
下面是我的代码现在尝试更改计时器延迟的位置:
private int speed, delay;
private JRadioButtonMenuItem fast, normal, slow;
private boolean speedSlow = false;
private boolean speedNorm = false;
private boolean speedFast = false;
public game()
{
frame = new JFrame("Simon");
renderer = new Renderer();
JMenuBar menuBar = setMenuBar();
frame.setSize(WIDTH + 8, HEIGHT + 30);
frame.setVisible(true);
frame.addMouseListener(this);
frame.setResizable(false);
frame.add(renderer);
frame.setJMenuBar(menuBar);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Timer timer = new Timer(setDelay(delay), this);
start();
timer.start();
}
public JMenuBar setMenuBar()
{
JMenuBar menuBar = new JMenuBar();
JMenu settings = new JMenu("Settings");
JMenu speedSet = new JMenu("Set Speed");
slow = new JRadioButtonMenuItem("Slow");
normal = new JRadioButtonMenuItem("Normal");
fast = new JRadioButtonMenuItem("Fast");
slow.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
speedSlow = true;
}
});
normal.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
speedNorm = true;
}
});
fast.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
speedFast = true;
}
});
speedSet.add(slow);
speedSet.add(normal);
speedSet.add(fast);
settings.add(speedSet);
menuBar.add(settings);
return menuBar;
}
public int setDelay(int delay)
{
if (speedSlow)
{
delay = 30;
}
if (speedNorm)
{
delay = 20;
}
if (speedFast)
{
delay = 10;
}
return delay;
}
public void start()
{
random = new Random();
indexShown = 0;
ticks = 0;
score = 0;
speed = delay;
}
如我所见, delay
的初始值(即0)设置为定时器并启动定时器。而 Timer 的延迟永远不会更新。如果您希望在用户单击菜单项时更新定时器的延迟,则必须在菜单项的动作侦听器中执行此操作。
Below is where my code is at now trying to change the timer delay:
嗯,如果你想改变Timer
的"delay",那么你需要调用TImer
的setDelay(..)
方法。
private boolean speedSlow = false;
private boolean speedNorm = false;
private boolean speedFast = false;
不需要那些变量。相反,您只想在单击菜单项时设置 Timer
的延迟。所以这意味着您需要将 Timer
变量设为实例变量,以便它可以在您的 ActionListeners
:
private Timer timer;
现在在您的构造函数中创建具有默认延迟的计时器:
timer = new Timer(30, this);
然后在您的 ActionListeners 中重置延迟。例如:
slow.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
//speedSlow = true;
timer.setDelay( 30 );
}
});
不需要您现有的 setDelay(...) 方法。此外,"setter" 方法不应 return 值。 "setter"方法的要点是设置class的属性。如果您需要访问该值,您还可以创建一个 "getter" 方法。虽然在这种情况下,这两种方法都不需要,因为您可以直接从 Timer 对象 set/get/ 延迟。