使用JPanel上的滑块绘制二次公式

所以,我正在尝试制作一个程序,你可以通过滑块输入二次公式(ax ^ 2 + bx + c)。 然后在调整A,B和C时绘制图形。

问题:

我想要用超级油漆写的东西和滑块在一个地方。 当我运行滑块时,滑块就位。 有正确背景的空间我希望我的图表在面板中但没有实际的图形。

这是我的驱动程序类:

import java.awt.*; import javax.swing.*; public class quadraticslider { public static void main (String[] args) { JFrame frame = new JFrame ("Quadratic Slider"); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new pp109quadraticpanel()); frame.pack(); frame.setVisible(true); } } 

这是小组类:

 import java.awt.*; import javax.swing.*; import javax.swing.event.*; public class quadraticpanel extends JPanel { private JPanel controls, graphPanel; private JSlider ASlider, BSlider, CSlider; private JLabel ALabel, BLabel, CLabel; double A, B, C, x,Y; // //SLIDERS YO // public quadraticpanel() { ASlider = new JSlider (JSlider.HORIZONTAL, 0, 255, 0); ASlider.setMajorTickSpacing (50); ASlider.setMinorTickSpacing (10); ASlider.setPaintTicks (true); ASlider.setPaintLabels (true); ASlider.setAlignmentX (Component.LEFT_ALIGNMENT); BSlider = new JSlider (JSlider.HORIZONTAL, 0, 255, 0); BSlider.setMajorTickSpacing (50); BSlider.setMinorTickSpacing (10); BSlider.setPaintTicks (true); BSlider.setPaintLabels (true); BSlider.setAlignmentX (Component.LEFT_ALIGNMENT); CSlider = new JSlider (JSlider.HORIZONTAL, 0, 255, 0); CSlider.setMajorTickSpacing (50); CSlider.setMinorTickSpacing (10); CSlider.setPaintTicks (true); CSlider.setPaintLabels (true); CSlider.setAlignmentX (Component.LEFT_ALIGNMENT); SliderListener listener = new SliderListener(); ASlider.addChangeListener (listener); BSlider.addChangeListener (listener); CSlider.addChangeListener (listener); ALabel = new JLabel ("a: 0"); ALabel.setAlignmentX (Component.LEFT_ALIGNMENT); BLabel = new JLabel ("b: 0"); BLabel.setAlignmentX (Component.LEFT_ALIGNMENT); CLabel = new JLabel ("c: 0"); CLabel.setAlignmentX (Component.LEFT_ALIGNMENT); controls = new JPanel(); BoxLayout layout = new BoxLayout (controls, BoxLayout.Y_AXIS); controls.setLayout (layout); controls.add (ALabel); controls.add (ASlider); controls.add (Box.createRigidArea (new Dimension (0, 20))); controls.add (BLabel); controls.add (BSlider); controls.add (Box.createRigidArea (new Dimension (0, 20))); controls.add (CLabel); controls.add (CSlider); graphPanel = new JPanel(); graphPanel.setPreferredSize (new Dimension (500, 500)); graphPanel.setBackground (Color.white); add (controls); add (graphPanel); } //Here I'm taking the equation, running it through -10 to 10 //It takes the doubles from the equation, converts //it to int then draws the quadratic formula in dots. public void paintComponent(Graphics page) { super.paintComponent (page); for ( x=-10; x <= 10; x++) { Y = (A*(Math.pow(x,2)))+(B*x)+(C); int g = (int)Math.round(x); int h = (int)Math.round(Y); page.setColor (Color.black); page.fillOval (g, h, 1, 1); } } public class SliderListener implements ChangeListener { /// ///Reads the user input via slider. /// public void stateChanged (ChangeEvent event) { A = ASlider.getValue(); B = BSlider.getValue(); C = CSlider.getValue(); ALabel.setText ("a: " + A); BLabel.setText ("b: " + B); CLabel.setText ("c: " + C); } } } 

使用JFreeChart这些示例可能是有意义的。 如此处所示,您可以使用SwingWorker为渲染设置动画,此示例使用JSlider更新图表。

图片

附录:您的代码的这种变化可能会指导您前进。 注意,

  • 覆盖graphPanel相关方法。

  • 缩放和反转坐标,如下所示。

  • 考虑JSpinner的小数值。

  • 使用常量来保持一致性。

  • 为清晰起见,请使用通用命名约定。

  • 另请参见初始线程

图片

 import java.awt.*; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /** @see https://stackoverflow.com/a/20556929/230513 */ public class QuadraticSlider { private static final int N = 500; private static final int A = 1; private static final int B = 0; private static final int C = 0; public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { JFrame frame = new JFrame("Quadratic Slider"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new QuadraticPanel()); frame.pack(); frame.setVisible(true); } }); } private static class QuadraticPanel extends JPanel { private Box controls; private JPanel graphPanel; private JSlider aSlider, bSlider, cSlider; private JLabel aLabel, bLabel, cLabel; double a, b, c, x, y; public QuadraticPanel() { aSlider = new JSlider(JSlider.HORIZONTAL, -25, 25, A); aSlider.setMajorTickSpacing(10); aSlider.setMinorTickSpacing(5); aSlider.setPaintTicks(true); aSlider.setPaintLabels(true); aSlider.setAlignmentX(Component.LEFT_ALIGNMENT); bSlider = new JSlider(JSlider.HORIZONTAL, -10, 10, B); bSlider.setMajorTickSpacing(5); bSlider.setMinorTickSpacing(1); bSlider.setPaintTicks(true); bSlider.setPaintLabels(true); bSlider.setAlignmentX(Component.LEFT_ALIGNMENT); cSlider = new JSlider(JSlider.HORIZONTAL, -100, 100, C); cSlider.setMajorTickSpacing(50); cSlider.setMinorTickSpacing(10); cSlider.setPaintTicks(true); cSlider.setPaintLabels(true); cSlider.setAlignmentX(Component.LEFT_ALIGNMENT); SliderListener listener = new SliderListener(); aSlider.addChangeListener(listener); bSlider.addChangeListener(listener); cSlider.addChangeListener(listener); aLabel = new JLabel("a: 0"); bLabel = new JLabel("b: 0"); cLabel = new JLabel("c: 0"); controls = new Box(BoxLayout.Y_AXIS); controls.add(aLabel); controls.add(aSlider); controls.add(Box.createRigidArea(new Dimension(0, 20))); controls.add(bLabel); controls.add(bSlider); controls.add(Box.createRigidArea(new Dimension(0, 20))); controls.add(cLabel); controls.add(cSlider); graphPanel = new JPanel() { private static final int SCALE = 5; @Override public Dimension getPreferredSize() { return new Dimension(N, N); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); for (x = -10; x <= 10; x++) { y = a * x * x + b * x + c; g.setColor(Color.black); int w = (int) (x * SCALE) + N / 2; int h = (int) (-y * SCALE) + N / 2; g.fillOval(w, h, 5, 5); } } }; graphPanel.setBackground(Color.white); add(controls); add(graphPanel); listener.stateChanged(null); } class SliderListener implements ChangeListener { @Override public void stateChanged(ChangeEvent event) { a = aSlider.getValue() / 5d; b = bSlider.getValue(); c = cSlider.getValue(); aLabel.setText("a: " + a); bLabel.setText("b: " + b); cLabel.setText("c: " + c); repaint(); } } } } 

_“错误:可能失去精度Y =(A *(Math.pow(x,2)))+(B * x)+(C); ^必需:int found:double”_

你的所有int变量都是int A, B, C, x,Y; 。 让他们doubledouble A, B, C, x,Y;

我修改了代码,以便解决x给定的ab和c。 然后插入x并解决y问题。 我仍然没有得到它画。 我也取出了循环,因为滑块设置了导致x的ab和c值。 有谁知道为什么它不会画?

 package quadraticslider; import java.awt.*; import javax.swing.*; public class quadraticslider { public static void main (String[] args) { JFrame frame = new JFrame ("Quadratic Slider"); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new quadraticpanel()); frame.pack(); frame.setVisible(true); } } 

包quadraticslider;

 import java.awt.*; import javax.swing.*; import javax.swing.event.*; public class quadraticpanel extends JPanel { private JPanel controls, graphPanel; private JSlider ASlider, BSlider, CSlider; private JLabel ALabel, BLabel, CLabel; double A, B, C, x,Y; public quadraticpanel() { ASlider = new JSlider (JSlider.HORIZONTAL, -25, 25, 0); ASlider.setMajorTickSpacing (50); ASlider.setMinorTickSpacing (10); ASlider.setPaintTicks (true); ASlider.setPaintLabels (true); ASlider.setAlignmentX (Component.LEFT_ALIGNMENT); BSlider = new JSlider (JSlider.HORIZONTAL, -25, 25, 0); BSlider.setMajorTickSpacing (50); BSlider.setMinorTickSpacing (10); BSlider.setPaintTicks (true); BSlider.setPaintLabels (true); BSlider.setAlignmentX (Component.LEFT_ALIGNMENT); CSlider = new JSlider (JSlider.HORIZONTAL, -25, 25, 0); CSlider.setMajorTickSpacing (50); CSlider.setMinorTickSpacing (10); CSlider.setPaintTicks (true); CSlider.setPaintLabels (true); CSlider.setAlignmentX (Component.LEFT_ALIGNMENT); SliderListener listener = new SliderListener(); ASlider.addChangeListener (listener); BSlider.addChangeListener (listener); CSlider.addChangeListener (listener); ALabel = new JLabel ("a: 0"); ALabel.setAlignmentX (Component.LEFT_ALIGNMENT); BLabel = new JLabel ("b: 0"); BLabel.setAlignmentX (Component.LEFT_ALIGNMENT); CLabel = new JLabel ("c: 0"); CLabel.setAlignmentX (Component.LEFT_ALIGNMENT); controls = new JPanel(); BoxLayout layout = new BoxLayout (controls, BoxLayout.Y_AXIS); controls.setLayout (layout); controls.add (ALabel); controls.add (ASlider); controls.add (Box.createRigidArea (new Dimension (0, 20))); controls.add (BLabel); controls.add (BSlider); controls.add (Box.createRigidArea (new Dimension (0, 20))); controls.add (CLabel); controls.add (CSlider); graphPanel = new JPanel(); graphPanel.setPreferredSize (new Dimension (500, 500)); graphPanel.setBackground (Color.white); add (controls); add (graphPanel); } public void paintComponent(Graphics page) { super.paintComponent (page); x = (-B + (Math.sqrt((B*B - ((4 * A * C))))))/ (2 * A); Y = (A*(Math.pow(x,2)))+(B*x)+(C); int g = (int)Math.round(x); int h = (int)Math.round(Y); page.setColor (Color.black); page.drawOval (g, h, 1, 1); } public class SliderListener implements ChangeListener { /// ///Reads the user input via slider. /// public void stateChanged (ChangeEvent event) { A = ASlider.getValue(); B = BSlider.getValue(); C = CSlider.getValue(); ALabel.setText ("a: " + A); BLabel.setText ("b: " + B); CLabel.setText ("c: " + C); } 

}}