JLabel 不断加快每个列表选择
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);
任何解释将不胜感激谢谢
every time an item in the JList is selected, the speed of the JLabel will increase.
因为您的代码会在每次选择时启动另一个计时器。
计时器将保持 运行 直到您停止它。由于您永远不会停止它,因此您将同时拥有多个计时器 运行。
您想在 ListSelectionListener 之外定义定时器。
那么监听器内部的逻辑就变成了这样:
(if !timer.isRunning())
timer.start();
或者问题是您甚至需要 ListSelectionListener 吗?
您可以在创建 class 时自动启动计时器。每次触发时,逻辑都会获得选定的值。
当然,使用这种方法,您需要确保 getSelectedValue() 方法不 return null(因为首次显示 GUI 时不会选择任何项目)。
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);
任何解释将不胜感激谢谢
every time an item in the JList is selected, the speed of the JLabel will increase.
因为您的代码会在每次选择时启动另一个计时器。
计时器将保持 运行 直到您停止它。由于您永远不会停止它,因此您将同时拥有多个计时器 运行。
您想在 ListSelectionListener 之外定义定时器。
那么监听器内部的逻辑就变成了这样:
(if !timer.isRunning())
timer.start();
或者问题是您甚至需要 ListSelectionListener 吗?
您可以在创建 class 时自动启动计时器。每次触发时,逻辑都会获得选定的值。
当然,使用这种方法,您需要确保 getSelectedValue() 方法不 return null(因为首次显示 GUI 时不会选择任何项目)。