1

スライダーにボタンを追加しようとしています。私が欲しいのは、ボタンをクリックすると、スライダーの値が変数に保存されることです。しかし、ActionListenerの使用中に常にエラーが発生します。誰でも助けてください。これが私のスライダーのコードです:

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.util.Hashtable;

public class SliderSample {

    public static void main(final String args[]) {
        Runnable runner = new Runnable() {
            public void run() {
                JFrame frame = new JFrame("Sample Sliders");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                ChangeListener listener = new SliderChangeListener();

                JSlider js4 = new JSlider(1,5);
                Hashtable<Integer, JComponent> table = new Hashtable<Integer, JComponent>();
                table.put(1, new JLabel("1"));
                table.put(2, new JLabel("2"));
                table.put(3, new JLabel("3"));
                table.put(4, new JLabel("4"));
                table.put(5, new JLabel("5"));
                js4.setLabelTable(table);
                js4.setPaintLabels(true);
                js4.addChangeListener(listener);
                frame.add(js4, BorderLayout.CENTER);
                frame.setSize(400, 300);
                frame.setVisible(true);
            }
        };
        EventQueue.invokeLater(runner);
    }

    public static class SliderChangeListener implements ChangeListener {
        public void stateChanged(ChangeEvent changeEvent) {
            Object source = changeEvent.getSource();
            JSlider theJSlider = (JSlider)source;
            if (!theJSlider.getValueIsAdjusting()) {System.out.println ("Slider changed: " +         theJSlider.getValue());
            }
        }
    }
}
4

2 に答える 2

3

現在の Runnable をアドレス指定しているため、この時点では「this」は使用できません。次のように変更します。

public class SliderSample {
    private JSlider js4 = new JSlider(1, 5);
    private int state = js4.getValue();

    public static void main(final String args[]) {
         SwingUtilities.invokeLater(new Runnable() {
              @Override
              public void run() {
                  new SliderSample();
              }
         });
    }

    public SliderSample() {
        JFrame frame = new JFrame("Sample Sliders");
        ...

        JButton b = new JButton("Save");
        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                state = js4.getValue();
                System.out.println("new state: " + state);
            }
        });

        Hashtable<Integer, JComponent> table = new Hashtable<Integer, JComponent>();
        ...
        frame.setVisible(true);
}
于 2012-12-18T19:10:55.933 に答える
2

コードを変更しました。スライダーから変数に値を保存するボタンを1つ追加しました。

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.util.Hashtable;

public class SliderSample {
    private static JFrame frame = new JFrame("Sample Sliders");
    private static JSlider slider = new JSlider(1,5);
    private static JButton button =new JButton("Button");
    private static int saveNumberHere;


    public static void main(final String args[]) {
        Runnable runner = new Runnable() {
            public void run() {

                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                Hashtable<Integer, JComponent> table = new Hashtable<Integer, JComponent>();
                table.put(1, new JLabel("1"));
                table.put(2, new JLabel("2"));
                table.put(3, new JLabel("3"));
                table.put(4, new JLabel("4"));
                table.put(5, new JLabel("5"));
                slider.setLabelTable(table);
                slider.setPaintLabels(true);

                ChangeListener sliderListener = new SliderChangeListener();
                slider.addChangeListener(sliderListener);
                ChangeListener buttonListener = new ButthonChangeListener();
                button.addChangeListener(buttonListener);

                frame.add(slider, BorderLayout.CENTER);
                frame.add(button, BorderLayout.SOUTH);
                frame.setSize(400, 300);
                frame.setVisible(true);
            }
        };
        EventQueue.invokeLater(runner);
    }
    public static class SliderChangeListener implements ChangeListener {
        public void stateChanged(ChangeEvent changeEvent) {
            if (!slider.getValueIsAdjusting()) {
                System.out.println ("Slider changed: " +         slider.getValue());
            }            
        }
    }

    public static class ButthonChangeListener implements ChangeListener{
        public void stateChanged(ChangeEvent changeEvent) {
            saveNumberHere = slider.getValue();
        }
    }
}
于 2012-12-18T19:33:17.870 に答える