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 に答える