java - 通过 JMenuBar 控制变量的 Java 定时器
问题描述
我对 java 编码比较陌生,并且正在尝试制作我的第一个游戏。我目前遇到的问题是试图让游戏以不同的速度运行。我试图通过让用户选择他们想要的速度设置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 的延迟永远不会更新。如果您希望在用户单击菜单项时更新 Timer 的延迟,则必须在菜单项的操作侦听器中执行此操作。
推荐阅读
- javascript - html2canvas 下载图像仅返回带有白色和右行的 png 文件?
- swift - 如何以编程方式将根视图控制器添加到 macOS?
- c - 代码块上的 GDB 调试器不起作用(C 语言)
- python - 使用 CPLEX 在 python 中使用 timelimit 是否存在错误?
- android - Azure Pipelines – Release Gradle Pipeline 找不到 gradlew
- binding - 无法转换“Int”类型的值?到预期的参数类型'绑定
' 斯威夫特 - c# - 在视图中填充下拉列表
- c - ['{'标记之前的错误预期表达式
- javascript - 需要 Promise.all 但没有并行运行
- azure-active-directory - 使用带有客户端凭据流的 Graph API .NET SDK 创建 hello-world 团队时出现“未经授权”错误