簡體   English   中英

無法在JPanel中繪制Circle(擴展JComponent)

[英]Unable to draw Circle (extends JComponent) inside JPanel

我正在嘗試向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

首先, JPanel具有FlowLayout作為默認布局管理器。

FlowLayout Component的首選大小,但是Circle沒有特定的大小,因此其大小為(0,0)。

您可能需要重寫getPreferredSize來為其指定一個值,或者使用仍會為您的Circle賦予大小的布局管理器(例如,將組件添加到CENTERBorderLayout )。 以后,您可能還想覆蓋getMaximumSizegetMinimumSize

第二件事是getXgetYJComponent現有方法,您的代碼將覆蓋它們(可能不是故意的)。 這些方法告訴該組件在其容器中的位置,並且如果您使用它們,將會弄亂布局(此處, Circle位於GraphicPanel內部的30,30 GraphicPanel ,並被文本區域隱藏了)。

getX()

組件原點的當前x坐標

在下面的示例中,我更改了xy的名稱和訪問器方法,以避免覆蓋getXgetY (實際上,無需更改x和y變量的名稱,只是保持與這些訪問器方法名稱的一致性)。

通過添加重寫的getPreferredSize方法並計算其最佳大小,也可以設置“首選大小”。

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具有set / getBackground和set / getForeground方法,您可能會發現它們對於設置和獲取背景Color和前景Color很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM