2013-06-03 17 views
0

我正在爲模擬創建一個簡單的「播放/倒帶」界面,使用JSlider作爲進度條和滑塊,您可以將模擬移動到任何時間點模擬邊界。到時間點的滑動效果非常好,但我無法在模擬「正在播放」時獲得實際的滑塊移動。鏈接到GUI如下圖所示爲增加援助:正在從外部移動的JSlider對象

http://i.stack.imgur.com/7rAWf.png

我剛纔怎麼回事

主要對象的簡化版本具有2個對象,在GUI和控制器。 gui:創建滑塊/按鈕和控制器。滑塊和按鈕的變化/動作監聽器被設置爲控制器:控制器:執行播放/倒帶功能的各種按鈕。這是通過使用擺動計時器來處理的,每個「框架」重新繪製模擬。使用滑塊時,「CurrentFrame」會在您拖動滑塊時發生更改,並調用重繪函數。它沒有做的是在計時器運行時自行滑動。代號爲stateChanged低於:

public void stateChanged(ChangeEvent z) 
    { 
     JSlider source = (JSlider)z.getSource(); 

     //If statement that checks if the state of the slider is done changing when the change listener is evoked 
     if(!source.getValueIsAdjusting()) 
     { 
      CurrentFrame = (int)source.getValue(); 
      colladaRoot.setPosition(framePos[CurrentFrame]); 
      wwd.repaint(); 
     } 
     // My attempt at checking if the timer is running, and changing the value of the slider 
     // while it is. 
     while (timer.isRunning()) 
      source.setValue(CurrentFrame); 

    } 

在情況下,它的要求,這也是在GUI類中的滑塊創建:

  JSlider framecontroller = new JSlider(0, LastFrame, CurrentFrame); 
      framecontroller.addChangeListener(this.controller); 
      framecontroller.setMajorTickSpacing(200); 
      framecontroller.setMinorTickSpacing(1); 
      framecontroller.setPaintTicks(true); 
      framecontroller.setPaintLabels(true); 
+0

如果更新依賴於來自更改處理程序內的更改,那麼您的代碼很糟糕,並且很容易被捕獲 - 這是個不好的主意。首先嚐試將'while'改爲'if',看看是否有幫助。 – Nolo

+0

在你的'CurrentFrame'值的while循環中放一個print語句,看它是否有效。這將有助於弄清楚這是否是同步問題。 – LiverpoolFTW

+0

@LiverpoolFTW剛剛嘗試了你所取得的。它絕對不會看到while循環,有什麼想法? – Terryn

回答

1

你不想從ChangeEventListener檢查定時器狀態,只有當你移動滑塊時纔會被觸發。您需要將ActionListener添加到Timer並從那裏更新滑塊

+0

技巧是確保JSlider是正在創建的主類的一部分,所以所有的子類(GUI和控制器)都可以訪問它並可以修改它的數據值。 謝謝德文! – Terryn