Метод setSize компонента в объекте FlowLayout

В настоящее время я создаю графический интерфейс, который использует класс FlowLayout. Теперь этот класс предназначен для того, чтобы позволить компонентам устанавливать свои предпочтительные методы размера, и я считаю, что он не должен иметь приоритета при установке размера компонента. Однако, когда я использовал метод setSize для JTextField, объект FlowLayout, похоже, не распознал команду изменения размера. Но когда я использовал метод setColumn, объект FlowLayout реагировал на команду изменения размера.

Почему это?


person Izzo    schedule 19.10.2013    source источник
comment
..по их предпочтительным методам определения размера, и я считаю, что они не должны иметь приоритета при установке размера компонента. Однако, когда я использовал метод setSize.. Предпочтительный размер и размер — это разные вещи. Но избегайте их обоих. См. раздел Следует ли избегать использования методов set(Preferred|Maximum|Minimum)Size в Java Swing? по причинам, почему.   -  person Andrew Thompson    schedule 20.10.2013


Ответы (1)


Объект FlowLayout, похоже, не распознал команду изменения размера. Но когда я использовал метод setColumn, объект FlowLayout реагировал на команду изменения размера. Почему это?

Сформулируйте свой собственный вопрос, я понимаю, что вы знаете, что FlowLayout работает в соответствии с предпочтительным размером компонента. Однако, чтобы ответить на ваш вопрос, почему на самом деле JTextFeild.setColumn(int) отвечает: Потому что,

Как только вызывается setColumn(int), он делает недействительным() компонент JTextFeild и все родительские элементы над ним, которые помечаются как требующие размещения.

public void setColumns(int columns) {
        int oldVal = this.columns;
        if (columns < 0) {
            throw new IllegalArgumentException("columns less than zero.");
        }
        if (columns != oldVal) {
            this.columns = columns;
            invalidate(); // invalidate if column changes
        }
    }

Затем при разметке FlowLayout вызывает функцию getPreferredSize() JTextFeild, которая переопределяется и реализуется таким образом, что она возвращает предпочтительную ширину, добавляя ширину столбца:

public Dimension getPreferredSize() {
        Dimension size = super.getPreferredSize();
        if (columns != 0) {
            Insets insets = getInsets();
            size.width = columns * getColumnWidth() +
                insets.left + insets.right;  // changing the width
        }
        return size;
    }

Угадай, что! Я становлюсь поклонником исходного кода.

person Sage    schedule 19.10.2013