我正在尝试向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
答案 0 :(得分:4)
首先,FlowLayout
有一个FlowLayout
作为默认布局管理器。
Component
尊重Circle
的首选大小,但getPreferredSize
没有特定的大小,因此其大小为(0,0)。
您可能希望覆盖Circle
为其提供一个,或者使用仍会为BorderLayout
提供尺寸的布局管理器(例如,您添加组件的CENTER
getMaximumSize
)。
以后,您可能还想覆盖getMinimumSize
和getX
。
第二件事是getY
和JComponent
是来自Circle
的现有方法,您的代码会覆盖(可能不是故意的)。
这些方法告诉该组件在其容器中的位置,如果你玩它们会弄乱布局(这里你的GraphicPanel
位于x
内的30,30,并被textarea隐藏起来。
getX()
组件原点的当前x坐标
在以下示例中,我更改了y
和getX
的名称和访问者方法,以避免覆盖getY
和getPreferredSize
(实际上无需更改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}}。