1

编写一个程序,用一个大椭圆填充窗口。即使调整了窗口大小,椭圆也应该接触窗口边界。

我有以下代码:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import javax.swing.JComponent;

public class EllipseComponent extends JComponent {
    public void paintComponent(Graphics g)
    {
        Graphics2D g2 = (Graphics2D) g;

        Ellipse2D.Double ellipse = new Ellipse2D.Double(0,0,150,200);
        g2.draw(ellipse);
        g2.setColor(Color.red);
        g2.fill(ellipse);
    }
}

主要课程:

import javax.swing.JFrame;

public class EllipseViewer {
   public static void main(String[] args)
   {
       JFrame frame = new JFrame();
       frame.setSize(150, 200);
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

       EllipseComponent component = new EllipseComponent();
       frame.add(component);

       frame.setVisible(true);
   }
}
4

2 回答 2

6

在你的 EllipseComponent 你做:

Ellipse2D.Double ellipse = new Ellipse2D.Double(0,0,getWidth(),getHeight());

我还推荐 Hovercraft Full Of Eels 所做的更改。在这个简单的情况下,它可能不是问题,但随着paintComponent 方法的复杂性增加,您真的希望在paintComponent 方法中尽可能少地计算。

于 2011-09-30T18:56:23.613 回答
2

不要在 paintComponent 中调整组件的大小。事实上,不要在此方法中创建对象或执行任何程序逻辑。该方法需要精益,尽可能快,绘制,仅此而已。您必须了解,您无法完全控制何时或什至何时调用此方法,并且您当然不希望向其中添加可能减慢速度的不必要的代码。

您应该在类的构造函数中创建椭圆。要根据 JComponent 的大小和大小更改调整它的大小,请使用 ComponentListener.:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import javax.swing.JComponent;

public class EllipseComponent extends JComponent {
    Ellipse2D ellipse = null;

    public EllipseComponent {
        ellipse = new Ellipse2D.Double(0,0,150,200);
        addComponentListener(new ComponentAdapter() {
           public void componentResized(ComponentEvent e) {
              // set the size of your ellipse here 
              // based on the component's width and height 
           }
        });
    }

    public void paintComponent(Graphics g)
    {
        Graphics2D g2 = (Graphics2D) g;
        g2.draw(ellipse);
        g2.setColor(Color.red);
        g2.fill(ellipse);
    }
}

警告:代码未运行或测试

于 2011-09-30T18:59:13.110 回答