繁体   English   中英

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);

任何解释将不胜感激谢谢

每次选择 JList 中的一项时,JLabel 的速度就会增加。

因为您的代码会在每次选择时启动另一个 Timer。

计时器将继续运行,直到您停止它。 由于您从不停止它,因此您将同时运行多个计时器。

您想在 ListSelectionListener 之外定义您的 Timer。

那么监听器内部的逻辑就变成了这样:

(if !timer.isRunning())
    timer.start();

或者问题是您甚至需要 ListSelectionListener 吗?

您可以在创建 class 时自动启动计时器。 每次触发时,逻辑都会获得选定的值。

当然,使用这种方法,您需要确保 getSelectedValue() 方法不返回 null (因为第一次显示 GUI 时不会选择任何项目)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM