在java中制作一个可玩的jslider

我通过使用eclipse和windowbuilder从用户那里获得数学表达式(例如ADD(MUL(X,Y),Z))并且一度要求用户将其变量之一指定为时间,从而制作了一个grapher。 然后将要求用户选择该变量的起点和范围。 然后程序将显示一个框架(和一个面板),它有一个jslider和一个播放按钮。当用户点击按钮时,程序应该开始绘制表达式。 它应该看起来像Gapminder图表 。

我已经检查了有关更新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的值。 使用附加到JSliderChangeListener来驱动图形,例如……

滑块

 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(">"); } } } 

有关更多详细信息,请参见如何使用摆动计时器和如何使用滑块