2013-05-31 3 views
0

Я пытаюсь получить простую кнопку быстрой перемотки вперед для работы. Мое понимание инициализация таймера в качестве такогоSwing Timer Кнопка FastForward

timer = new Timer(setspeed, listener); 

устанавливает задержку между событиями таймера к INT SetSpeed ​​в миллисекундах.

У меня есть кнопка быстрого продвижения вперед, который имеет следующий код:

public void doFastForward() 
    { 
     speedcounter++; 
     setspeed = speed/speedcounter; 
     System.out.print(speedcounter + " " + setspeed + ". "); //checker 
     timer.stop(); 
     timer.setDelay((setspeed)); 
     timer.start(); 
     System.out.print(timer.getDelay() + ".. "); //checker 
    } 

, который, как предполагается сократить скорость вдвое, третьего, четвертого и т.д., с каждым нажатием кнопки. Проблема заключается в том, что он не делает этого с моей симуляцией. Здесь что-то не хватает?

+1

Что он делает вместо этого? Нам нужна дополнительная информация. У вас есть инструкции System.out': что они печатают? Как вы объявляете/инициализируете 'speedcounter',' speed' и т. Д.? – DannyMo

+0

Эти системные выходы предназначены только для проверки значений счетчика скорости, который печатается как правильное значение. Скорость - это статическое значение int, объявленное в классе, а счетчик скорости - это модификатор, используемый для изменения скорости ACTUAL (это значение времени) таймера. Все, что касается таймера работает нормально, но это. Я просто пытаюсь изменить, как быстро/медленно запускаются события, и все, что я прочитал, сказал использовать timer.setDelay (DesiredTime); для этого, но, видимо, я что-то пропустил. – Terryn

+0

В качестве комментария к тому, что он делает, в принципе ничего. Я приурочил это событие, и он занимает столько времени или не нажимает кнопку «Быстрая перемотка вперед». – Terryn

ответ

0

timer.setDelay() работает для меня. Вот быстрый пример, который перемещает красный квадрат по экрану. При нажатии на кнопку быстрой перемотки вперед делает его двигаться быстрее, вызывая setDelay по таймеру (вы заметите логику в моем ActionListener идентична вашей, хотя и разные имена переменных):

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class TimerTest extends JFrame { 
    public static void main(String[] args) { new TimerTest().setVisible(true); } 

    private static final int DEFAULT_SPEED = 500; 
    private int speedCounter = 1; 
    private int currentSpeed = DEFAULT_SPEED/speedCounter; 
    private int squareX = 150; 

    public TimerTest() { 
    super("Test"); 
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    setMinimumSize(new Dimension(300, 200)); 
    setLayout(new BorderLayout()); 
    setLocationRelativeTo(null); 

    JPanel displayPanel = new JPanel(null) { 
     @Override 
     public void paintComponent(Graphics g) { 
     g.setColor(Color.RED); 
     g.fillRect(squareX, getHeight()/2, 25, 25); 
     } 
    }; 

    final Timer timer = new Timer(currentSpeed, new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     squareX = (squareX + 15) % getWidth(); 
     repaint(); 
     } 
    }); 
    timer.setRepeats(true); 

    JButton fastForwardButton = new JButton(new AbstractAction(">>") { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     speedCounter++; 
     currentSpeed = DEFAULT_SPEED/speedCounter; 

     timer.stop(); 
     timer.setDelay(currentSpeed); 
     timer.start(); 
     } 
    }); 
    add(displayPanel, BorderLayout.CENTER); 
    add(fastForwardButton, BorderLayout.SOUTH); 
    timer.start(); 
    } 
} 

Одним заметным недостатком этого подхода что запуск/остановка таймера вызовет дополнительную задержку. Например, скажем, что таймер был настроен на стрельбу каждые 2 секунд, и это было 1.5 секунд с момента последнего кадра. Если вы установите задержку на 1 и перезапустите таймер, 2.5 секунд пройдут перед тем, как начнется следующий кадр. Это может объяснить, почему «это не сработало» для вас.

Чтобы избежать этой проблемы, вы можете создать таймер, который срабатывает при фиксированной скорости , но выполняет вашу логику только в том случае, если прошло достаточно времени. Затем измените, что «достаточно времени», когда пользователь быстро переходит вперед. Например, таймер может запускать каждый 50ms, но вы выполняете только свою логику, если прошло 500ms с момента последнего выполнения. Когда пользователь быстро переходит вперед, вы можете выполнить свою логику, если вместо этого прошло 250ms (и так далее).

+0

По какой-то причине повторная запись снова похожа на вашу работу (хотя мой более или менее тот же XD) Спасибо! – Terryn

+0

Рад, что я мог помочь! – DannyMo