Таким образом, большинству менеджеров компоновки потребуются некоторые «подсказки», которые должны быть предоставлены компонентами, чтобы знать, как они хотят быть размеченными.
Вам нужно будет переопределить getPreferredSize
и вернутьразмер, который наилучшим образом соответствует вашим потребностям, например ...
public class TrafficLight extends JPanel {
private final int BALL_DIAMETER = 100;
//...
public Dimension getPreferredSize() {
return new Dimension(BALL_DIAMETER, BALL_DIAMETER);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent();
g.setColor(color);
g.fillOval(0, 0, BALL_DIAMETER, BALL_DIAMETER);
}
Кроме того, paintComponent
никогда не должен быть public
никто не должен звонить, и вы должны позвонить super.paintComponent()
перед выполнением любой пользовательской рисования.
Я также рекомендовал бы, возможно, использовать GridLayout
для этого
Я бы также сказал, что TrafficLight
не требуется Timer
егоown и the должны контролироваться извне, но это я
setBounds(100, 100, 800, 600);
Лучше всего избегать, используйте pack()
, чтобы изменить размер окна до желаемого размера содержимого, и setLocation
, чтобы расположить его
.