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 时不会选择任何项目)。