我在创建的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()但似乎没有任何效果。还有没有其他的东西可以放一个我刚丢失的重绘()吗?
答案 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位置处绘制。然后,您需要设置组件的大小,即宽度/高度。