如何在框架内调整大小和paintComponent

时间:2011-09-30 18:46:41

标签: java swing jframe jcomponent

编写一个用拉长椭圆填充窗口的程序。即使窗口调整大小,椭圆也会触摸窗口边界。

我有以下代码:

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);
   }
}

2 个答案:

答案 0 :(得分:6)

你在EllipseComponent中执行

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

我还建议Hovercraft Full Of Eels给出的改变。在这个简单的情况下,它可能不是一个问题,但是当paintComponent方法的复杂性增加时,你真的希望尽可能少地在paintComponent方法中计算。

答案 1 :(得分: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);
    }
}

警告:代码未运行也未经过测试