2013-05-31 3 views
0

간단한 빨리 감기 버튼을 사용하려고합니다. 나의 이해는스윙 타이머 빨리 감기 버튼

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이며 속도 카운터는 타이머의 실제 속도 (setspeed)를 변경하는 데 사용되는 수정 자입니다. 타이머에 관한 모든 것이 잘 돌아갑니다. 나는 단순히 이벤트가 얼마나 빨리/천천히 발생 하는지를 변경하려고하고 있으며, 내가 읽은 모든 것은 사용이라고 말했다. timer.setDelay (DesiredTime); 이렇게해야하지만, 분명히 나는 ​​뭔가를 놓치고 있습니다. – Terryn

+0

무엇을하고 있는지에 대한 의견으로서 기본적으로 아무것도 없습니다. 나는 이벤트를 타임 아웃했고, "Fast Forward"버튼을 누르거나 올리거나 오랜 시간이 걸린다. – 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

관련 문제