使用ArrayList进行故障绘制

时间:2013-11-12 01:11:21

标签: java user-interface arraylist jcomponent

我在创建的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()但似乎没有任何效果。还有没有其他的东西可以放一个我刚丢失的重绘()吗?

2 个答案:

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

考虑将FaceShortCode扩展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);
    }
}

答案 1 :(得分:0)

您的设计有点令人困惑。不需要ArrayList。使用组件时,只需将组件直接添加到面板即可。通常,在通过绘制非组件的对象进行自定义绘制时,您将只使用ArrayList,例如,当您想要绘制Shape时。有关此方法的示例,请查看Custom Painting Approaches

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

因此,您需要做的是更改自定义组件的绘制方式。所有绘画都应在组件的位置(0,0)完成。然后,您将组件的位置设置为x / y值。这意味着组件将在相对于添加组件的面板的x / y位置处绘制。然后,您需要设置组件的大小,即宽度/高度。