Таймер Java с переменным управлением через JMenuBar

Я относительно новичок в 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;
}

2 ответа

Решение

Ниже мой код пытается изменить задержку таймера:

Ну, если вы хотите изменить "задержку" Timerтогда вам нужно вызвать setDelay(..) метод TImer,

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.

Как я понимаю, начальное значение delay (который равен 0) установлен на Таймер, и Таймер запускается. И задержка таймера никогда не обновляется. Если вы ожидаете, что задержка таймера будет обновлена, когда пользователь щелкает элемент меню, вы должны сделать это в обработчиках действий пунктов меню.

Другие вопросы по тегам