Установка ширины и высоты JComponent в качестве переменных экземпляра

1

У меня проблема с установкой ширины и высоты компонента в качестве переменных экземпляра (в подклассе компонента). Если я вызываю 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);
    }

}
  • 1
    Ширина и высота вашего компонента не установлены до визуализации.
  • 0
    Танки .... так как я могу установить ширину и высоту в качестве переменных экземпляра.
Показать ещё 2 комментария
Теги:
swing
awt

1 ответ

3
Лучший ответ

Установка размера компонентов зависит от компонента. Таким образом, в конструкторе размер по умолчанию равен 0. Позже, если вы добавите компонент в диспетчер компоновки (например, при добавлении компонента в фрейм, который имеет менеджер компоновки по умолчанию), он будет устанавливать размер в соответствии с предпочтительным/минимальным/максимальным это - по умолчанию от 0/0 до max-int. Таким образом, менеджер компоновки изменит размер компонента на размер фрейма.

Нет необходимости хранить размер в локальной копии, поскольку getWidth()/Height() будет считывать размер из локальной копии в классе компонента.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню