使用滑块在JPanel上绘制二次方程 [英] Drawing the Quadratic formula with sliders on a 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二次滑块);
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
{
私有JPanel控件,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.setPaintLabel(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 = newJLabel(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);
}
//这里我使用等式,通过-10到10运行
//从方程中获取双精度值,将
//转换为int,然后以点为单位绘制二次方程。
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实现ChangeListener
{
///
///通过滑块读取用户输入。
///
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
更新图表。
img src =https://i.stack.imgur.com/nnEje.pngalt =image>
附录:您的代码的此变体可能会指导你向前走。注意
import java.awt。*;
import javax.swing。*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
/ ** @see http://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);
}
});
}
私人静态类QuadraticPanel扩展JPanel {
私人Box控件;
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.setPaintLabel(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);
}
类SliderListener实现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();
}
}
}
}
So, I'm trying to make a program where you can input the quadratic formula (ax^2+bx+c) via sliders. Then it draws a graph as you adjust for A, B, and C.
Issues:
I want the stuff I wrote in super paint and the sliders to be in one place. The sliders are in place when I run it. There's space with the correct background where I want my graph in the panel but no actual graph.
Here's my driver class:
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);
}
}
Here's the panel class:
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);
}
}
}
These examples using JFreeChart
may be of interest. As shown here, you can animate the rendering using SwingWorker
, and this example updates a chart using a JSlider
.
Addendum: This variation of your code may guide you going forward. Note,
Override relevant methods in your
graphPanel
.Scale and invert coordinates, as shown here.
Consider
JSpinner
for fractional values.Use constants for consistency.
Use common naming conventions for clarity.
See also Initial Threads.
import java.awt.*;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
/** @see http://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();
}
}
}
}
这篇关于使用滑块在JPanel上绘制二次方程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!