圈子未显示在JPanel中 [英] Circle not showing up in JPanel
问题描述
所以我想在inner
面板内绘制圆.我有一个类paintTimeUnit
,该类在给定xy坐标对的情况下在面板内部创建了圆,但是每当我创建一个新的paintTimeUnit
对象并将其添加到面板中时,它似乎都没有显示.
So I'm trying to draw circles inside of the inner
panel. I have a class, paintTimeUnit
that creates the circle inside the panel given an xy coordinate pair but whenever I create a new paintTimeUnit
object and add it to the panel it doesn't seem to be showing up.
public class paintTimeUnit extends JPanel {
private static final long serialVersionUID = 1L;
private int value;
private int xlocation;
private int ylocation;
public paintTimeUnit(int x, int y) {
value = 0;
xlocation = x;
ylocation = y;
}
public void paint(Graphics g) {
g.drawOval(xlocation, ylocation, 100, 100);
g.setColor(Color.RED);
}
public int getValue() {
return value;
}
public void setValue(int t) {
value = t;
}
}
其实现如下:
JPanel Panel = new JPanel();
...
JPanel inner = new JPanel();
inner.setLayout(null);
inner.setSize(325, 570);
inner.setBackground(null);
inner.setLocation(500, 350);
inner.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.BLACK));
inner.setVisible(true);
paintTimeUnit hour1 = new paintTimeUnit(600, 400);
hour1.setValue(1);
hour1.setVisible(true);
inner.add(hour1);
//----Containers to Panel/Panel to Frame---------
Panel.add(inner);
...
frame.add(Panel, BorderLayout.CENTER);
推荐答案
要具有在给定位置绘制圆的组件,请按照oracle
To have a component that draws a circle at a given location, properly override paintComponent
as explained in oracle's tutorial:
class PaintTimeUnit extends JPanel {
private final int xlocation, ylocation;
private static final int W = 500, H = 300, RADIUS = 50;
public PaintTimeUnit(int x, int y) {
xlocation = x;
ylocation = y;
setPreferredSize(new Dimension(W, H));
}
@Override
public void paintComponent(Graphics g) { //override paintComponent for custom painting
super.paintComponent(g); //call super
g.setColor(Color.RED); //set painting color
g.drawOval(xlocation, ylocation, RADIUS, RADIUS); //draw circle
}
}
但是,如建议的那样,最好有一个可以画一堆圆的容器.
为此,您需要添加一个集合来存储所有要绘制的圆圈,例如
However, as advised, it may better to have a container that draws a bunch of circles.
To achieve it you need to add a collection to store all circles to be painted such as
List<Point> circleCenters== new ArrayList<>()
您还需要向该集合添加点:
You would also need to add points to that collection:
void addCircle(int centerX, int centerY){
circleCenters.add(new Point(centerX, centerY));
}
并让paintComponent
根据其存储的中心绘制圆:
and have paintComponent
draw circles based on their stored centers:
public void paintComponent(Graphics g) { //override paintComponent for custom painting
super.paintComponent(g); //call super
g.setColor(Color.RED); //set painting color
for(Point center : circleCenters){
g.drawOval(center.x, center.y, RADIUS, RADIUS); //draw circle
}
}
将它们放在一起:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
class PaintTimeUnit extends JPanel {
private final List<Point> circleCenters;
private static final int W = 500, H = 300, RADIUS = 50;
public PaintTimeUnit() {
circleCenters = new ArrayList<>();
setPreferredSize(new Dimension(W, H));
}
@Override
public void paintComponent(Graphics g) { //override paintComponent for custom painting
super.paintComponent(g); //call super
g.setColor(Color.RED); //set painting color
for(Point center : circleCenters){
g.drawOval(center.x, center.y, RADIUS, RADIUS); //draw circle
}
}
void addCircle(int centerX, int centerY){
circleCenters.add(new Point(centerX, centerY));
}
}
并使用它:
PaintTimeUnit ptu= new PaintTimeUnit();
//add 3 circles
ptu.addCircle(90,90);
ptu.addCircle(150,150);
ptu.addCircle(210,90);
(在线运行)
这篇关于圈子未显示在JPanel中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!