У меня проблема с установкой ширины и высоты компонента в качестве переменных экземпляра (в подклассе компонента). Если я вызываю getWidth()
и getHeight()
в конструкторе (который всегда равен нулю), значения отличаются от вызова тех же методов в paintComponent(Graphics g)
. Может кто-нибудь объяснить, почему это происходит, и как я могу установить ширину и высоту компонента как переменные экземпляра. Заранее большое спасибо.
Вот фрагмент кода:
import java.awt.Graphics;
import javax.swing.JComponent;
public class MyComponent extends JComponent
{
// Instance variables.
private int width;
private int height;
public MyComponent()
{
width = getWidth();
height = getHeight();
System.out.println(width+","+height);
}
public void paintComponent(Graphics g)
{
// Local variables.
int width = this.getWidth();
int height = this.getHeight();
System.out.println(width+","+height);
}
}
import javax.swing.JFrame;
public class ComponentTester
{
public static void main(String args[])
{
JFrame frame = new JFrame();
MyComponent component = new MyComponent();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setSize(350, 400);
frame.setVisible(true);
frame.add(component);
}
}
Установка размера компонентов зависит от компонента. Таким образом, в конструкторе размер по умолчанию равен 0. Позже, если вы добавите компонент в диспетчер компоновки (например, при добавлении компонента в фрейм, который имеет менеджер компоновки по умолчанию), он будет устанавливать размер в соответствии с предпочтительным/минимальным/максимальным это - по умолчанию от 0/0 до max-int. Таким образом, менеджер компоновки изменит размер компонента на размер фрейма.
Нет необходимости хранить размер в локальной копии, поскольку getWidth()/Height() будет считывать размер из локальной копии в классе компонента.