Как я могу изменить размер и нарисовать компонент внутри рамки - PullRequest
1 голос
/ 30 сентября 2011

Напишите программу, которая заполняет окно эллипсом Larrge.Эллипс должен касаться границ окна, даже если размер окна изменяется.

У меня есть следующий код:

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 ]

6 голосов
/ 30 сентября 2011

в вашем EllipseComponent вы делаете:

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

Я бы также порекомендовал изменения, сделанные Hovercraft Full Of Eels. В этом простом случае это может не быть проблемой, но по мере усложнения метода paintComponent вы действительно хотите, чтобы как можно меньше вычислялось в методе paintComponent.

2 голосов
/ 30 сентября 2011

Не изменяйте размеры компонентов внутри компонента 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);
    }
}

Предостережение: код не запущен и не проверен

...