【问题标题】:Variable Controlled Java Timer through JMenuBar通过 JMenuBar 控制变量的 Java 定时器
【发布时间】:2018-12-27 15:44:23
【问题描述】:

我对 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;
}

【问题讨论】:

标签: java swing timer jmenubar


【解决方案1】:

下面是我的代码现在尝试更改计时器延迟的地方:

好吧,如果你想改变Timer的“延迟”,那么你需要调用TImersetDelay(..)方法。

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”方法不应返回值。 “setter”方法的重点是设置类的属性。然后,如果您需要访问该值,您还将创建一个“getter”方法。虽然在这种情况下,这两种方法都不需要,因为您可以直接从 Timer 对象设置/获取/延迟。

【讨论】:

  • 这很完美!谢谢你。正是我想要完成的。我不知道如何使用 setDelay(),我从 oracle/java api 页面找到的信息是使用 public void setDelay(int delay),所以我想我必须创建一个方法来设置延迟,我的搜索没有显示 timer.setDelay(int) 的信息;这是我缺少的关键部分。
  • @OptimusPront,很高兴它有帮助。不要忘记通过单击复选标记“接受”答案,这样人们就知道问题已经解决了。
【解决方案2】:

如我所见,delay(即 0)的初始值设置为 Timer 并启动 Timer。并且 Timer 的延迟永远不会更新。如果您希望在用户单击菜单项时更新 Timer 的延迟,则必须在菜单项的操作侦听器中执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2020-02-26
    • 1970-01-01
    相关资源
    最近更新 更多