我正在爲模擬創建一個簡單的「播放/倒帶」界面,使用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);
如果更新依賴於來自更改處理程序內的更改,那麼您的代碼很糟糕,並且很容易被捕獲 - 這是個不好的主意。首先嚐試將'while'改爲'if',看看是否有幫助。 – Nolo
在你的'CurrentFrame'值的while循環中放一個print語句,看它是否有效。這將有助於弄清楚這是否是同步問題。 – LiverpoolFTW
@LiverpoolFTW剛剛嘗試了你所取得的。它絕對不會看到while循環,有什麼想法? – Terryn