2016-02-25 4 views
0

Следующий мой код, я пытаюсь нарисовать линию, которая простирается от одного конца экрана к другому, но когда я вызываю getWidth() и getHeight() для создания объекта линии, методы возвращают 0. Почему это происходит и как мне избежать этого.Почему getHeight() и getWidth() возвращают 0 в конструкторе? и как этого избежать?

public class LineComponent extends JComponent { 

private Shapes shape; 

public LineComponent() { 
    shape = new Line((int) Math.round(Math.sqrt(getHeight() * getHeight() + getWidth() * getWidth())) 
,new Point(getWidth()/2, getHeight()/2)); 
} 

ответ

1

Поскольку компонент еще не выложен (он не имеет определяемого размера). До тех пор, пока компонент не будет добавлен в другой контейнер и этот контейнер не будет проверен, компоненту не будет назначен размер.

Как исправить зависит от ряда факторов, например, вы можете использовать ComponentListener и слушать componentResized событий, но хотите ли вы узнать обо всех событиях размера? Когда компонент сначала выкладывается, он может изменяться несколько раз (до разных размеров), о котором вам все равно?

+0

Мне нужно было бы изменить размер моего компонента, и мне нужно было бы узнать первоначальный размер, когда он впервые выложен. Есть ли способ избежать использования ComponentListener – Mike

+1

«Лучшее» решение, которое у вас есть, - это определить 'preferredSize' компонента, переопределив его метод getPreferredSize. Нет никакой гарантии, что компонент будет выложен с использованием этого размера, хотя это даст вам отправную точку. – MadProgrammer

0

Если это ваш основной класс, тогда вы должны сначала установить размер и сделать его видимым; в противном случае нет смысла в том, что ширина/высота:

setSize(100, 100); 
setVisible(true); 

в конструкторе.

Если это не ваш основной класс и он добавлен к другому компоненту, вам необходимо переместить чертеж линии в этот класс.