[英]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
賦予大小的布局管理器(例如,將組件添加到CENTER
的BorderLayout
)。 以后,您可能還想覆蓋getMaximumSize
和getMinimumSize
。
第二件事是getX
和getY
是JComponent
現有方法,您的代碼將覆蓋它們(可能不是故意的)。 這些方法告訴該組件在其容器中的位置,並且如果您使用它們,將會弄亂布局(此處, Circle
位於GraphicPanel
內部的30,30 GraphicPanel
,並被文本區域隱藏了)。
getX()
組件原點的當前x坐標
在下面的示例中,我更改了x
和y
的名稱和訪問器方法,以避免覆蓋getX
和getY
(實際上,無需更改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.