用java制作可玩的jslider

用java制作可玩的jslider,java,swing,windowbuilder,jslider,Java,Swing,Windowbuilder,Jslider,我正在使用eclipse和windowbuilder制作一个图示器,它从用户那里获取一个数学表达式,例如ADDMULX,Y,Z,并在某一点上要求用户指定一个变量作为时间。 然后,将要求用户选择该变量的起点和范围。然后程序将显示一个框架和一个面板,其中有一个jslider和一个play按钮。当用户单击按钮时,程序应该开始绘制表达式。 它应该看起来像一个小盒子 我已经检查了关于更新jsliders的其他问题,但它们通常是关于音乐播放器滑块或只随时间变化而没有图形部分的滑块 我的问题是关于滑块的更新,

我正在使用eclipse和windowbuilder制作一个图示器,它从用户那里获取一个数学表达式,例如ADDMULX,Y,Z,并在某一点上要求用户指定一个变量作为时间。 然后,将要求用户选择该变量的起点和范围。然后程序将显示一个框架和一个面板,其中有一个jslider和一个play按钮。当用户单击按钮时,程序应该开始绘制表达式。 它应该看起来像一个小盒子

我已经检查了关于更新jsliders的其他问题,但它们通常是关于音乐播放器滑块或只随时间变化而没有图形部分的滑块

我的问题是关于滑块的更新,间隔可以是1 但是如果你也能指导我如何制作可玩的滑块,它也可以用于绘图部分,那就太好了

这是迄今为止的守则:

package progGUI;

import java.awt.BorderLayout;

public class CanvasFrame extends JFrame {

private JPanel contentPane;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {

                CanvasFrame frame = new CanvasFrame();
                frame.setVisible(true);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public CanvasFrame() {
    setTitle("Graph");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 700, 542);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);

    JSlider slider = new JSlider();
    slider.setPaintLabels(true);
    slider.setMinorTickSpacing(1);
    slider.setMajorTickSpacing(5);
    slider.setPaintTicks(true);


    JLabel lblEnteredExpression = new JLabel("Entered Expression");

    JLabel lblVaraibles = new JLabel("Variables");

    JFormattedTextField formattedTextField = new JFormattedTextField();

    JFormattedTextField formattedTextField_1 = new JFormattedTextField();

    JPanel panel = new JPanel();
    panel.setBackground(Color.WHITE);

    JButton btnNewButton = new JButton("Play");
    GroupLayout gl_contentPane = new GroupLayout(contentPane);
    gl_contentPane.setHorizontalGroup(
        gl_contentPane.createParallelGroup(Alignment.LEADING)
            .addGroup(gl_contentPane.createSequentialGroup()
                .addContainerGap()
                .addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
                    .addGroup(gl_contentPane.createSequentialGroup()
                        .addComponent(panel, GroupLayout.PREFERRED_SIZE, 453, GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(ComponentPlacement.RELATED, 51, Short.MAX_VALUE)
                        .addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
                            .addComponent(lblEnteredExpression, Alignment.TRAILING)
                            .addComponent(lblVaraibles)
                            .addComponent(formattedTextField, GroupLayout.PREFERRED_SIZE, 119, GroupLayout.PREFERRED_SIZE)
                            .addComponent(formattedTextField_1, GroupLayout.PREFERRED_SIZE, 123, GroupLayout.PREFERRED_SIZE))
                        .addGap(57))
                    .addGroup(gl_contentPane.createSequentialGroup()
                        .addComponent(btnNewButton, GroupLayout.PREFERRED_SIZE, 87, GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(ComponentPlacement.RELATED)
                        .addComponent(slider, GroupLayout.PREFERRED_SIZE, 454, GroupLayout.PREFERRED_SIZE)
                        .addContainerGap())))
    );
    gl_contentPane.setVerticalGroup(
        gl_contentPane.createParallelGroup(Alignment.TRAILING)
            .addGroup(gl_contentPane.createSequentialGroup()
                .addGap(18)
                .addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
                    .addGroup(gl_contentPane.createSequentialGroup()
                        .addComponent(lblEnteredExpression)
                        .addPreferredGap(ComponentPlacement.RELATED)
                        .addComponent(formattedTextField_1, GroupLayout.PREFERRED_SIZE, 22, GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(ComponentPlacement.UNRELATED)
                        .addComponent(lblVaraibles)
                        .addPreferredGap(ComponentPlacement.RELATED)
                        .addComponent(formattedTextField, GroupLayout.PREFERRED_SIZE, 20, GroupLayout.PREFERRED_SIZE))
                    .addComponent(panel, GroupLayout.PREFERRED_SIZE, 350, GroupLayout.PREFERRED_SIZE))
                .addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
                    .addGroup(gl_contentPane.createSequentialGroup()
                        .addGap(31)
                        .addComponent(btnNewButton))
                    .addGroup(gl_contentPane.createSequentialGroup()
                        .addGap(18)
                        .addComponent(slider, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))
                .addGap(402))
    );
    contentPane.setLayout(gl_contentPane);
  }


}
使用javax.swing.Timer计划定期回调,这将更新JSlider的值。使用连接到JSlider的ChangeListener来驱动图形,例如

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private Timer timer;
        private JSlider slider;
        private JButton button;
        private JTextField field;

        public TestPane() {
            slider = new JSlider();
            field = new JTextField(4);
            button = new JButton(">");
            add(slider);
            add(button);
            add(field);

            slider.addChangeListener(new ChangeListener() {
                @Override
                public void stateChanged(ChangeEvent e) {
                    field.setText(Integer.toString(slider.getValue()));
                }
            });
            slider.setValue(0);

            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (timer.isRunning()) {
                        stopTheClock();
                    } else {
                        startTheClock();
                    }
                }
            });
            timer = new Timer(500, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    int value = slider.getValue() + 1;
                    if (value >= slider.getMaximum()) {
                        stopTheClock();
                    } else {
                        slider.setValue(value);
                    }
                }
            });
        }

        protected void startTheClock() {
            slider.setValue(0);
            timer.start();
            button.setText("[]");
        }

        protected void stopTheClock() {
            timer.stop();
            button.setText(">");
        }

    }

}
有关更多详细信息,请参见和

使用javax.swing.Timer计划定期回调,这将更新JSlider的值。使用连接到JSlider的ChangeListener来驱动图形,例如

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private Timer timer;
        private JSlider slider;
        private JButton button;
        private JTextField field;

        public TestPane() {
            slider = new JSlider();
            field = new JTextField(4);
            button = new JButton(">");
            add(slider);
            add(button);
            add(field);

            slider.addChangeListener(new ChangeListener() {
                @Override
                public void stateChanged(ChangeEvent e) {
                    field.setText(Integer.toString(slider.getValue()));
                }
            });
            slider.setValue(0);

            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (timer.isRunning()) {
                        stopTheClock();
                    } else {
                        startTheClock();
                    }
                }
            });
            timer = new Timer(500, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    int value = slider.getValue() + 1;
                    if (value >= slider.getMaximum()) {
                        stopTheClock();
                    } else {
                        slider.setValue(value);
                    }
                }
            });
        }

        protected void startTheClock() {
            slider.setValue(0);
            timer.start();
            button.setText("[]");
        }

        protected void stopTheClock() {
            timer.stop();
            button.setText(">");
        }

    }

}

有关更多详细信息,请参见和

什么是可播放?我的意思是它会更新,因此当您点击播放按钮时,它会从零开始,并添加到滑块旋钮每秒1的值。请查看gapminder链接,这就是我试图编写的内容降低JSlider以控制在图形中绘制的内容,使用Swing计时器定期更新JSliderthank以获得该解决方案,但如何在绘图时保留该值?每次滑块改变它的值时,都应该画一个点,这些点应该连接起来形成一个图形。什么是可播放的?我的意思是它会更新,所以当你点击播放按钮时,它会从零开始,并每秒增加滑块旋钮1的值。看看gapminder链接,这就是我试图编写的JSlider控制在图形中绘制的内容,使用Swing计时器定期更新JSLIDER以获得该解决方案,但如何保持该值以用于绘制?每次滑块改变其值时,都应该画一个点,这些点应该连接起来,形成一个图形感谢您的精彩答案!但是我无法将你的代码实现到我的代码中。我在最后一天尝试了很多次,但是代码没有在整个课程中识别滑块和计时器之类的对象。你能帮我将你的代码添加到我在问题中提出的代码中吗?谢谢你的回答!但是我不能将你的代码实现到我的代码中,我在最后一天尝试了很多次,但是代码没有在整个类中识别像滑块和计时器这样的对象。你能帮我将你的代码添加到我在问题中提出的代码中吗?