Не видно JComponent на JPanel - Java
Формулировка задачи:
Как -то пропустил тему по изучению Swing. Ради эксперимента решил написать простенькие часы. Осталось только графику сделать. Столкнулся со следующей проблемой: создаю JPanel, на который буду помещать циферблат и стрелки (наследники JComponent). Добавляю панель во фрейм и компонентов не видно. Если добавить компоненты просто на фрейм, то все видно. Пробовал разными способами и пока не могу понять в чем причина того, что компоненты не видно на панели во фрейме.
P.S. куски кода для примера. Если кто-то скажет, что тут много доделать надо.
package clock;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
public class ClockFace extends JComponent {
private Point2D center;
private double radius;
private boolean hasMinutesLabels;
public ClockFace(Point2D center, double radius) {
super();
this.center = center;
this.radius = radius;
hasMinutesLabels = false;
}
public ClockFace(Point2D center, double radius, boolean hasMinutesLabels) {
super();
this.center = center;
this.radius = radius;
this.hasMinutesLabels = hasMinutesLabels;
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setStroke(new BasicStroke(2.0f));
Ellipse2D ellipse = new Ellipse2D.Double(center.getX()-radius, center.getY()-radius,
center.getX()+radius, center.getY()+radius);
g2.draw(ellipse);
}
}package clock;
import com.sun.org.apache.regexp.internal.RE;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Point2D;
public class ClockPanel extends JPanel {
//TODO: панель содержит все элементы часов и слушает изменение времени
public ClockPanel() {
setPreferredSize(new Dimension(300,300));
// Point2D center = new Point2D.Double(getPreferredSize().width/2, getPreferredSize().height/2);
ClockFace clockFace=new ClockFace(new Point2D.Double(20,20), 20);
add(clockFace, BorderLayout.CENTER);
}
}package clock;
import javafx.embed.swing.JFXPanel;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Point2D;
public class ClockFrame extends JFrame {
private final int DEFAULT_WIDTH = 300;
private final int DEFAULT_HEIGHT = 300;
public ClockFrame() throws HeadlessException {
super("Clock");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
add(new ClockPanel()); //так не работает
add(new ClockFace(new Point2D.Double(20, 20), 20));//так работает
}
}package clock;
import javax.swing.*;
import java.awt.*;
public class Test {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame clockFrame = new ClockFrame();
clockFrame.setVisible(true);
}
});
}
}Решение задачи: «Не видно JComponent на JPanel»
textual
Листинг программы
package clock;
import javax.swing.*;
import java.awt.*;
public class Test {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Clock clock=new Clock();
JFrame clockFrame = new ClockFrame();
clockFrame.setVisible(true);
clock.run();
}
});
}
}