1

作成した ArrayList からコンポーネントを描画するのに少し問題があります。私がそれをいじると、最初の要素または2番目の要素のどちらかを取得できますが、運が良ければ、どちらも表示されません!

import java.awt.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;

public class FaceShortCode {
ArrayList<CreateCircles> faceCircles = new ArrayList<CreateCircles>();

public FaceShortCode() {
    JFrame main = new JFrame();
    main.setTitle("Face Frame");
    main.setSize(new Dimension(600, 600));
    main.setLocationRelativeTo(null);
    main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    main.setVisible(true);

    Container c = main.getContentPane();
    // c.setLayout(null);

    faceCircles.add(0, new CreateCircles(100, 50, 400, 350, Color.red));
    faceCircles.add(1, new CreateCircles(200, 100, 65, 65, Color.black));
    c.add(faceCircles.get(0));
    c.add(faceCircles.get(1));

}

class CreateCircles extends JComponent {
    double x, y, width, height;
    Color myColor;

    public CreateCircles(double x, double y, double width, double height,
            Color myColor) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
        this.myColor = myColor;
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        Ellipse2D circle = new Ellipse2D.Double(x, y, width, height);
        g2.setColor(myColor);
        g2.fill(circle);

    }
}

static class Run {
    public static void main(String[] args) {
        new FaceShortCode();
    }
}

}

コンテナ c に追加するたびに main.repaint() を投入しようとしましたが、ペイント メソッドで repaint() を試しましたが、何も機能していないようです。私が行方不明になっている repaint() を配置するものは他にありますか?

4

2 に答える 2

0

あなたのデザインは少し混乱しています。ArrayList は必要ありません。コンポーネントを使用する場合は、コンポーネントをパネルに直接追加するだけです。通常、ArrayList を使用するのは、コンポーネントではないオブジェクトをペイントしてカスタム ペイントを行う場合だけです。たとえば、シェイプをペイントする場合などです。このアプローチの例については、カスタム ペインティング アプローチをご覧ください。

コンポーネントを使用する場合、Swing によって自動的にペイントされるように、コンポーネントにはサイズと場所が必要です。通常は、レイアウト マネージャーにこれらのプロパティを決定させます。あなたの場合、コンポーネントのランダムな配置を行っているため、null レイアウトを使用してから、各コンポーネントのサイズ/場所を設定する必要があります。

したがって、カスタム コンポーネントの描画方法を変更する必要があります。すべてのペイントは、コンポーネントの位置 (0, 0) で行う必要があります。次に、コンポーネントの位置を x/y 値に設定します。これは、コンポーネントを追加するパネルに対して相対的な x/y 位置にコンポーネントがペイントされることを意味します。次に、幅/高さになるコンポーネントのサイズを設定する必要があります。

于 2013-11-12T02:00:33.873 に答える
0

そうしないとsetVisible()、ロジックが実行される前にフレームが表示されます。

public FaceShortCode() {

    Container c = main.getContentPane();
    // c.setLayout(null);

    faceCircles.add(0, new CreateCircles(100, 50, 400, 350, Color.red));
    faceCircles.add(1, new CreateCircles(200, 100, 65, 65, Color.black));
    c.add(faceCircles.get(0));
    c.add(faceCircles.get(1));

    JFrame main = new JFrame();

    main.setTitle("Face Frame");
    main.setSize(new Dimension(600, 600));
    main.setLocationRelativeTo(null);
    main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    main.setVisible(true);
}

FaceShortCodeextendsの作成を検討してくださいJFrame

public class FaceShortCode extends JFrame {
    private ArrayList<CreateCircles> faceCircles = new ArrayList<CreateCircles>();

    public FaceShortCode {
        setLayout(new Girdlayout(1, 2));

        faceCircles.add(0, new CreateCircles(100, 50, 400, 350, Color.red));
        faceCircles.add(1, new CreateCircles(200, 100, 65, 65, Color.black));

        add(faceCircles.get(0));
        add(faceCircles.get(1))

        setTitle("Face Frame");
        setSize(new Dimension(600, 600));
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
}
于 2013-11-12T01:24:08.123 に答える