Компоненты JPanel не будут отображаться
Я пытаюсь добавить некоторые компоненты в JPanel. paintComponent()
вызывается, но компоненты не отображаются. revalidate()
не работал
Структура выглядит следующим образом:
public class AbstractView extends JPanel implements ViewInterface {
}
public class GraphView extends AbstractView {
public void doSomeStuff(){
this.add(new ElementView());
this.revalidate();
}
}
public class ElementView extends AbstractView {
@Override
public void paintComponent(Graphics g) {
// this method is called but has no effect
super.paintComponent(g);
g.fillRect(0,0,100,100);
this.repaint();
}
}
Я думаю, что это соответствующий код. Методы как getPreferredSize()
и даже getX()
,getY()
,getWidth()
,getHeight()
реализованы и, кажется, работают как ожидалось. Я искал в Google несколько часов, но ничего не помогло. Я ищу ошибку в нужном месте?
редактировать:
Вот еще немного Кодекса:
1:
public class AbstractView extends JPanel implements ViewInterface {
@Override
public void update() {}
@Override
public boolean containsPoint(Point p) {
return false;
}
@Override
public ApplicationView topContainer() {
return null;
}
@Override
public Dimension getPreferredSize() {
return new Dimension(this.getBounds().getSize());
}
@Override Rectangle getBounds(){
return Rectangle(0,0,0,0);
}
@Override
public int getX() {
return this.getBounds().x;
}
@Override
public int getY() {
return this.getBounds().y;
}
@Override
public int getWidth() {
return this.getBounds().width;
}
@Override
public int getHeight() {
return this.getBounds().height;
}
}
2:
class BodyView extends AbstractView {
Body body;
BodyView(Body b, AbstractView c){
this.body = b;
this.setLayout(null);
}
private int radius(){
return (int) body.radius();
}
@Override
public void paintComponent(Graphics g) {
// called but without effect
super.paintComponent(g);
g.setColor(this.color);
int x = (int) body.position.at(0);
int y = (int) body.position.at(1);
int radius = radius();
g.fillOval(x-radius, y-radius, 2*radius, 2*radius);
}
@Override
public Rectangle getBounds(){
int radius = this.radius();
return new Rectangle(getX() - radius - 2, getY() - radius - 2, 2*radius + 2, 2*radius + 2);
}
@Override
public int getX() {
return (int) body.position.at(0);
}
@Override
public int getY() {
return (int) body.position.at(1);
}
}
3:
class SpaceView extends AbstractView {
Space space;
Set<BodyView> bodyViews;
SpaceView(Space s, AbstractView c){
this.space = s;
this.initializeBodyViews();
this.setLayout(null);
}
private void initializeBodyViews(){
bodyViews = new HashSet<BodyView>();
for(Body body : space.bodies){
BodyView view = new BodyView(body, this);
// new components are added here
addBodyView(view);
}
}
public void addBodyView(BodyView view){
bodyViews.add(view);
this.add(view);
}
}
Если этого недостаточно, чтобы определить проблему, я хотел бы обратиться к этому Github.