无法在JPanel中绘制Circle(扩展JComponent)

时间:2017-01-24 13:58:26

标签: java swing

我正在尝试向JPanel添加自定义圈子,请参阅:

    graphicPanel = new GraphicPanel();
    JTextArea text = new JTextArea("1233", 5, 10);
    graphicPanel.add(text);

    Circle circle = new Circle();
    circle.setX(30);
    circle.setY(30);
    circle.setDiameter(30);
    graphicPanel.add(circle);
    graphicPanel.repaint();
    graphicPanel.revalidate();

GraphicPanel只是一个自定义的JPanel,它还没有做任何有趣的事情(只保留一个尚未使用的列表)

GraphicPanel.java

public class GraphicPanel extends JPanel {

    private static final long serialVersionUID = -3813468764873993369L;
    private List<Node> nodes = new ArrayList<Node>();

    public GraphicPanel() {
    }

    public void addNode(Node node) {
        nodes.add(node);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.CYAN);
        g.fillOval((30 - 30 / 2), (30 - 30 / 2), 30, 30);
    }
}

Circle.java

public class Circle extends JComponent {
    private static final long serialVersionUID = 628299863960706428L;
    private int x;
    private int y;
    private int diameter;
    private Color color;

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getDiameter() {
        return diameter;
    }

    public void setDiameter(int diameter) {
        this.diameter = diameter;
    }

    public Color getColor() {
        return color;
    }

    public void setColor(Color color) {
        this.color = color;
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(color);
        g.fillOval((x - diameter / 2), (y - diameter / 2), diameter, diameter);
    }
}

出现JTextArea,圆圈没有。如果我将圆的绘图代码直接添加到graphicPanel的paintComponent(),则会出现一个圆圈:

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.CYAN);
        g.fillOval((30 - 30 / 2), (30 - 30 / 2), 30, 30);
}

所以绘制代码本身应该没问题(我认为可能是圆圈被绘制在我无法看到的地方,但事实并非如此)。 我需要更改以使圆圈出现?我想像这样绘制它,而不是在GraphicPanel的paintComponent()中使用g.fillOval()。 我正在使用Java 8

1 个答案:

答案 0 :(得分:4)

首先,FlowLayout有一个FlowLayout作为默认布局管理器。

Component尊重Circle的首选大小,但getPreferredSize没有特定的大小,因此其大小为(0,0)。

您可能希望覆盖Circle为其提供一个,或者使用仍会为BorderLayout提供尺寸的布局管理器(例如,您添加组件的CENTER getMaximumSize)。 以后,您可能还想覆盖getMinimumSizegetX

第二件事是getYJComponent是来自Circle的现有方法,您的代码会覆盖(可能不是故意的)。 这些方法告诉该组件在其容器中的位置,如果你玩它们会弄乱布局(这里你的GraphicPanel位于x内的30,30,并被textarea隐藏起来。

  

getX()

     

组件原点的当前x坐标

在以下示例中,我更改了ygetX的名称和访问者方法,以避免覆盖getYgetPreferredSize(实际上无需更改x和y变量的名称,只是为了与那些访问者方法名称保持一致。)

还通过添加覆盖import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import javax.swing.JComponent; public class Circle extends JComponent { private static final long serialVersionUID = 628299863960706428L; private int xCoo; private int yCoo; private int diameter; private Color color; @Override public Dimension getPreferredSize() { return new Dimension(diameter + xCoo, diameter + yCoo); } /* @Override public Dimension getMinimumSize() { return new Dimension(diameter + xCoo, diameter + yCoo); } @Override public Dimension getMaximumSize() { return new Dimension(diameter + xCoo, diameter + yCoo); }*/ public int getXCoo() { return xCoo; } public void setXCoo(final int xCoo) { this.xCoo = xCoo; } public int getYCoo() { return yCoo; } public void setYCoo(final int yCoo) { this.yCoo = yCoo; } public int getDiameter() { return diameter; } public void setDiameter(final int diameter) { this.diameter = diameter; } public Color getColor() { return color; } public void setColor(final Color color) { this.color = color; } public void paintComponent(final Graphics g) { super.paintComponent(g); g.setColor(color); g.fillOval((xCoo - diameter / 2), (yCoo - diameter / 2), diameter, diameter); } } 方法设置“首选大小”,计算其最佳大小。

JComponent

另请注意,Color已设置/ getBackground和set / getForeground方法,您可能会发现这些方法可用于设置和获取背景和前景{{1}}。