1

我在从我创建的 ArrayList 中绘制组件时遇到了一些麻烦。如果我搞砸了,我可以得到第一个元素或第二个元素,如果我幸运的话,也不会出现!

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

}

我尝试在每次添加到 Container c 后加入 main.repaint(),在我的绘画方法中尝试了 repaint(),但似乎没有任何效果。还有其他东西可以放置我刚刚丢失的 repaint() 吗?

4

2 回答 2

0

你的设计有点混乱。不需要 ArrayList。当您使用组件时,您可以直接将组件添加到面板中。通常,当您通过绘制不是组件的对象进行自定义绘制时,例如当您想要绘制形状时,您只会使用 ArrayList。有关此方法的示例,请查看自定义绘画方法

使用组件时,组件需要大小和位置才能被 Swing 自动绘制。通常,您会让布局管理器确定这些属性。在您的情况下,您正在随机放置组件,因此您需要使用空布局,然后设置每个组件的大小/位置。

因此,您需要做的是更改绘制自定义组件的方式。所有绘画都应在组件的位置 (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 回答