在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
的值。 使用附加到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(">"); } } }
有关更多详细信息,请参见如何使用摆动计时器和如何使用滑块
- 如何在javaFX中创建左,中,右部分的工具栏?
- 在实施基于GCM XMPP的App Server时,无法将XMPP服务器与smack:EOFexception连接
- Apple的pListforms的XML可以通过Android Java解析吗?
- Hibernate将用户模型保存到Postgres
- Java,Netty,TCP和UDP连接集成:没有可用于UDP连接的缓冲区空间
- 包括runnable jar文件中的源文件
- 输入字符串“1”的java.lang.NumberFormatException
- 有没有办法从Bean Validation字段级ConstraintValidator中访问目标bean?
- Tomcat 7强制取消注册JDBC驱动程序,为什么?