尝试创建一个使用参数方程绘制椭圆的程序,但线条没有显示。为什么? (JAVA)

时间:2015-08-25 23:43:14

标签: java

我正在尝试创建一个程序,使用参数方程,可以在线之间绘制线条并创建椭圆。这是我的代码:

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.util.ArrayList;

import javax.swing.JFrame;


public class test extends JFrame{

    ArrayList<Line2D> lines = new ArrayList<>();
    public test(){
        this.setTitle("test");
        this.setSize(800, 600);
        this.setLocationRelativeTo(null);
        this.setLayout(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        drawCircle(3,3.0,3.0);

        this.setVisible(true);


        System.out.println(lines.size());
    }

    public void drawCircle(int radio, double xCenter, double yCenter) {
        double t = 0;
        double xPoint;
        double yPoint;
        double xActual = xCenter;
        double yActual = yCenter + radio*Math.sin(0);
        t += 0.01;

        while(t < 360) {
            xPoint = xCenter + radio*Math.cos(t);
            yPoint = yCenter + radio*Math.sin(t);

           lines.add(new Line2D.Double(xActual, yActual, xPoint, yPoint));
           this.repaint();

            t += 0.01;
            xActual = xPoint;
            yActual = yPoint;
        }
    }

     public void paint(Graphics g) {
         super.paint(g);

         for(Line2D s : lines){
             ((Graphics2D) g).draw(s);
         }
     }
}

我没有收到任何错误,但这些线条似乎没有出现在框架中。我做错了什么?

3 个答案:

答案 0 :(得分:2)

在所有情况下,在paintComponent(Graphics)中完成绘图,而不是article中描述的paint。我建议你使用JPanel或任何其他非物质组件进行绘画 - 这是常见的习惯。 并且

...
lines.add(new Line2D.Double(xActual, yActual, xPoint, yPoint));
this.repaint();
...

这种重复调用会导致一些非常丑陋的行为,并且相当浪费资源(每增加一个形状36000个无用的重绘)。

答案 1 :(得分:2)

欢迎来到这个奇妙的世界,为什么你不应该从JFrame延伸,以及为什么你不应该覆盖paint等顶级容器JFrame

主要问题是,框架有边框。如果您覆盖paint的{​​{1}}并在JFrame绘画,则实际上您将在框架下绘画。你的圆圈(比例为3)足够小,可以完全涂在窗口的标题栏下。

有关此问题的示例以及您不应覆盖0x0顶级容器的原因,请参阅How to get the EXACT middle of a screen, even when re-sizedHow can I set in the midst?Java AWT drawString() does not display on window

相反,请使用paint之类的组件并覆盖它JPanel并将自定义绘画放在那里。然后将其放在paintComponent的实例中,例如......

Panel in frame

JFrame

你的下一个问题是,import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.HeadlessException; import java.awt.geom.Line2D; import java.util.ArrayList; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class Test extends JFrame { public static void main(String[] args) { new Test(); } public Test() throws HeadlessException { 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("Test"); frame.add(new TestPane()); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { ArrayList<Line2D> lines = new ArrayList<>(); public TestPane() { drawCircle(3, 3.0, 3.0); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); g2d.setColor(Color.RED); System.out.println(lines.size()); for (Line2D s : lines) { g2d.draw(s); } g2d.dispose(); } public void drawCircle(int radio, double xCenter, double yCenter) { double t = 0; double xPoint; double yPoint; double xActual = xCenter; double yActual = yCenter + radio * Math.sin(0); t += 0.01; while (t < 360) { xPoint = xCenter + radio * Math.cos(t); yPoint = yCenter + radio * Math.sin(t); // System.out.println(xActual + "x" + yActual + "x" + xPoint + "x" + yPoint); lines.add(new Line2D.Double(xActual, yActual, xPoint, yPoint)); t += 0.01; xActual = xPoint; yActual = yPoint; } } } } (或足够接近它)是圆圈的中心点。生成形状时,您需要能够计算0x0 / x偏移量,以便圆圈的左上角位于y而不是

例如,在测试代码时,我将0x0增加到radio(看看它是否有所不同,这就是我发现你在框架下绘画的方式)并生成类似......

Offset

答案 2 :(得分:0)

创建Graphics2D对象。它有助于。例如:

Graphics2D g2 = (Graphics2D)g;

一旦你有了,你需要设置颜色。你没做的。例如:

g2.setColor(Color.BLACK);

也只是一个提示,覆盖paintComponent(Graphics g)并且不要覆盖paint()。