一次绘制一个函数

时间:2017-05-15 04:35:37

标签: java swing graph

我有3个不同的功能叠加在一起,我试图添加单选按钮,这样当选择button1时,与之关联的功能将被绘制,而其他功能将不可见。 如果有更好的方法,我会这样做。

import java.awt.*;
import java.awt.geom.Path2D;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.*;

public class DrawingStuff extends JComponent {

    DrawingStuff(){
        JRadioButton line1 = new JRadioButton("F(x)");
        JRadioButton line2 = new JRadioButton("G(x)");
        JRadioButton line3 = new JRadioButton("Cos(2x)");

         ButtonGroup bG = new ButtonGroup();
         bG.add(line1);
         bG.add(line2);
         bG.add(line3);
         this.setLayout( new FlowLayout());
         this.add(line1);
         this.add(line2);
         this.add(line3);
         line1.setSelected(true);
         this.setVisible(true);
    }

    public void paintComponent(Graphics g)
    {   

        //w is x, and h is y (as in x/y values in a graph)
     int w = this.getWidth()/2;
     int h = this.getHeight()/2;

     Graphics2D g1 = (Graphics2D) g;
     g1.setStroke(new BasicStroke(2));
     g1.setColor(Color.black);
     g1.drawLine(0,h,w*2,h);
     g1.drawLine(w,0,w,h*2); 
     g1.drawString("0", w - 7, h + 13);

     Graphics2D g2 = (Graphics2D) g;
     g2.setStroke(new BasicStroke(2));
     g2.setColor(Color.red);

      int scale = 4;

      //Path2D path1 = new Path2D.Double();
      //path1.moveTo(w, h);

      Polygon p = new Polygon();
      for (int x = 0; x <= 4; x++) {
          //path1.lineTo(w+scale*x, h - scale*((x*x*x) + x - 3));
          p.addPoint(w+scale*x, h - scale*((x*x*x) + x - 3));

      }
      //g2.draw(path1);
     g2.drawPolyline(p.xpoints, p.ypoints, p.npoints);

      Polygon p1 = new Polygon();
      //Path2D path2 = new Path2D.Double();
      //path2.moveTo(w, h);
      for (int x = -10; x <= 10; x++) {
          //path2.lineTo(w+scale*x, h - scale * ((x*x*x)/100) - x + 10);
          p1.addPoint(w + scale * x, h - scale * ((x*x*x)/100) - x + 10);
      }
      //g2.draw(path2);
      g2.drawPolyline(p1.xpoints, p1.ypoints, p1.npoints); 


       Path2D path = new Path2D.Double();   
         for (int i = 0; i < 100; i++) {
            double theta = i * 2 * Math.PI / 100;
            double r = Math.cos(2 * theta);
            double dX = w * r * Math.cos(theta) + w;
            double dY = h * r * Math.sin(theta) + h;
            if (i == 0) {
               path.moveTo(dX, dY);
            } else {
               path.lineTo(dX, dY);
            }
         }
         path.closePath();
        g2.draw(path);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();

        frame.setSize(800, 600);
        frame.setTitle("Graphs");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);  
        DrawingStuff draw = new DrawingStuff();
        frame.add(draw);

        frame.setVisible(true);
    }
}

我不确定如何从构造函数中调用按钮,当我尝试为按钮设置一个函数时,只要我最大化或恢复窗口,它们就会复制。

我也不知道如何在绘制后删除一条线。

感谢。

1 个答案:

答案 0 :(得分:1)

  

我也不知道如何在绘制后擦除一条线。

秘诀是在paintComponent()实现中仅绘制可见行。为此,请将您的函数包装在一个维护名义visible字段的类中,并为该类提供获取和设置属性的方法。

public void paintComponent(Graphics g) {
    …
    if (x. getFunctionVisible()) {
        g2.drawPolyline(…);
    }
}

在此example中,VisibleAction使用getSeriesVisible()setSeriesVisible()进行更改;您的实施可能会声明getSeriesVisible()setSeriesVisible()以实现更改;相反,您的实施可能会定义getFunctionVisible()set getFunctionVisible sVisible()

image

可以看到相关示例here