java - ChangeListener 未触发

标签 java swing jslider changelistener

我正在学习更改监听器,并想了解为什么我的部分代码在用户移动 slider 时没有触发更改监听器。

这是监听器。一切都在同一个方法中:

ChangeListener lst = new ChangeListener() {
    public void stateChanged(ChangeEvent e) {
        showDate();
    }
};

这里是一些添加监听器的代码:

m_slDay = new JSlider(JSlider.HORIZONTAL, 1, maxDays,
    m_calendar.get(Calendar.DAY_OF_MONTH));
m_slDay.setPaintLabels(true);
m_slDay.setMajorTickSpacing(5);
m_slDay.setMinorTickSpacing(1);
m_slDay.setPaintTicks(true);

// This line of code seems to work.  
m_slDay.addChangeListener(lst);

p = new JPanel();
p.setBorder(new TitledBorder(new EtchedBorder(), "Day"));
p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
p.add(Box.createRigidArea(RIGID_DIMENSION));
p.add(m_slDay);
p.add(Box.createRigidArea(RIGID_DIMENSION));
p1.add(p);

此代码基于上述代码块,但当用户移动 slider 时没有任何反应:

m_slDayOfWeek = new JSlider(JSlider.HORIZONTAL, 1, maxDaysOfTheWeek,
    m_calendar.get(Calendar.DAY_OF_WEEK));
m_slDayOfWeek.setPaintLabels(true);
m_slDayOfWeek.setMajorTickSpacing(1);
m_slDayOfWeek.setMinorTickSpacing(1);
m_slDayOfWeek.setPaintTicks(true);

// This one is not working and I'm not sure why it's happening.
m_slDayOfWeek.addChangeListener(lst);

p = new JPanel();
p.setBorder(new TitledBorder(new EtchedBorder(), "Day of Week"));
p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
p.add(Box.createRigidArea(RIGID_DIMENSION));
p.add(m_slDayOfWeek);
p.add(Box.createRigidArea(RIGID_DIMENSION));
p1.add(p);

最佳答案

似乎您的代码部分有问题,正如您的 showDate() 方法中的注释所指出的,这件事在此代码中完美地工作:

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class SliderChangeEffect extends JFrame
{
    private JSlider slider;
    private int count = 0;
    private ChangeListener changeListener = new ChangeListener()
    {
        public void stateChanged(ChangeEvent ce)
        {
            System.out.println(count++);
        }
    };

    private void createAndDisplayGUI()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationByPlatform(true);

        JPanel contentPane = new JPanel();
        contentPane.setOpaque(true);

        slider = new JSlider(0, 10, 5);
        slider.setMajorTickSpacing(2);
        slider.setMinorTickSpacing(1);
        slider.addChangeListener(changeListener);

        contentPane.add(slider);

        getContentPane().add(contentPane);
        pack();
        setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new SliderChangeEffect().createAndDisplayGUI();
            }
        });
    }
}

关于java - ChangeListener 未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9824639/

相关文章:

java - JPanel显示大量文本

java - 修改 ArrayList<JPanel> 中所有 JPanel 的字体大小

java - 具有接近双值的 JSlider

java - 如何在多个线程中运行一个 jar 文件?

java - Swing:无法在带有图像的面板内设置 jtextfield 的颜色

java - 如何设置 JSlider 的大小?

java - 为什么使用 .getSource() 方法时将 ChangeEvent 对象转换为 JSlider?

java - 如何打包包含哈希​​映射的类对象? Kotlin

java - 如何在 Bundle-A jar 文件安装到 OSGi 容器后调用其中的方法之一

java - Apache POI 启用 excel 编辑