JSlider changelistener не работает

Я пытаюсь реализовать список изменений на JSlider. Я пробовал два отдельных метода, ни один не работал. Раздел с комментариями является первой попыткой. Тот, который реализован сейчас, вероятно, лучше подходит для моих целей. Может кто-нибудь указать, что происходит с этим:

public class MixWindow extends JFrame implements ChangeListener{

    private JPanel contentPane;
    public static int uniA [] = new int [512];
    ChangeListener sizeAction;
    int level = 0;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MixWindow frame = new MixWindow();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        initUni();
    }

    public MixWindow() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 800, 600);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JSlider slider = new JSlider(0,255);
        slider.setOrientation(SwingConstants.VERTICAL);
        slider.setBounds(66, 275, 72, 140);
        slider.setPaintTicks(true);
        slider.setMajorTickSpacing(20);
        slider.setValue(uniA[0]);
        //slider.addChangeListener(sizeAction);
        contentPane.add(slider);


        final JLabel label = new JLabel("");
        label.setBounds(66, 262, 61, 16);
        contentPane.add(label);


        /*sizeAction=new ChangeListener()
        {
            public void stateChanged (ChangeEvent event)
            {
                System.out.println("This is getting silly");
                JSlider slider=(JSlider)event.getSource();

                level=slider.getValue();
                uniA[0] = level;
                String temp = String.valueOf(level); 
                label.setText(temp);



            }
        };*/
    }

    public static void initUni(){
        for(int i = 0; i < uniA.length; i++){
            uniA[i] = 0;
          }
    }

    @Override
    public void stateChanged(ChangeEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("Stuff has changed"); 
        Object source = arg0.getSource();
        System.out.println(arg0 + " has Changed");

    }
}

1 ответ

Решение

Причина ChangeListener не работает в вашем первом подходе, это то, что ваша ссылка на слушателя sizeAction является null когда вы регистрируете слушателя.

slider.addChangeListener(sizeAction);

Хотя это не вызовет исключения, оно не зарегистрирует слушателя при его создании. Просто дайте этой строке появиться после того, как вы определите слушателя, и она начнет работать. Если вы хотите использовать другой ChangeListener вместо реализации вы можете использовать:

slider.addChangeListener(this);
Другие вопросы по тегам