使用滑块在JPanel上绘制二次方程 [英] Drawing the Quadratic formula with sliders on a JPanel

查看:293
本文介绍了使用滑块在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>



附录:您的代码的此变体可能会指导你向前走。注意




  • 覆盖 graphPanel 中的相关方法。


  • 缩放和取消坐标,如此处所示。 p>


  • 考虑 JSpinner 的小数值。



  • 使用常见的命名惯例清楚。

  • >另请参阅 初始主题




  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆