[英]JLabel keeps speeding up on each List Selection
list.getSelectionModel().addListSelectionListener(e -> {
timer = new Timer( DELAY, new ActionListener()
{
@Override
public void actionPerformed(ActionEvent arg0) {
StockItem p = list.getSelectedValue();
label.setText(p.toString2());
label.setLocation(label.getLocation().x+1, label.getLocation().y);
if(label.getLocation().x >= frame.getWidth()) {
label.setLocation(0-label.getWidth(),label.getLocation().y);
}
}
});
timer.start();
});
我創建了一個列表選擇偵聽器來檢查在 JList 中選擇了哪些當前項目,並且無論選擇什么項目都將調用另一個 class 中的 toString() 方法並將其設置為 JLabel 的文本。 但是,我剛剛在我的 JLabel 上實現了移動文本,每次選擇 JList 中的一個項目時,JLabel 的速度都會增加。 我想要它,所以速度保持不變,但我不知道該怎么做。
控制速度的部分代碼為label.setLocation(label.getLocation().x+1, label.getLocation().y);
任何解釋將不勝感激謝謝
每次選擇 JList 中的一項時,JLabel 的速度就會增加。
因為您的代碼會在每次選擇時啟動另一個 Timer。
計時器將繼續運行,直到您停止它。 由於您從不停止它,因此您將同時運行多個計時器。
您想在 ListSelectionListener 之外定義您的 Timer。
那么監聽器內部的邏輯就變成了這樣:
(if !timer.isRunning())
timer.start();
或者問題是您甚至需要 ListSelectionListener 嗎?
您可以在創建 class 時自動啟動計時器。 每次觸發時,邏輯都會獲得選定的值。
當然,使用這種方法,您需要確保 getSelectedValue() 方法不返回 null (因為第一次顯示 GUI 時不會選擇任何項目)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.