Обновление Java Layout Manager - PullRequest
       11

Обновление Java Layout Manager

0 голосов
/ 07 сентября 2011

Я инициализировал GridBagLayout глобально, затем в своем конструкторе класса его экземпляр создал и добавил несколько кнопок и т. Д. К нему.

Как я могу добавить вещи к нему после свершившегося факта? Простой класс расширяет JFrame. Всякий раз, когда я пытаюсь использовать class.add (вещи, gridbagconstraints) после факта (используется просто добавить (вещи, gribagconstraints) в конструкторе), ничего не происходит и ничего не добавляется в мой макет.

Нужно ли "обновлять" менеджер макета или что-то еще? Объявлено глобально.

Обновление: я пробовал revalidate (), но, похоже, он не работает, вот упрощенная версия моего кода с кнопкой тестирования для подтверждения концепции:

public class MainGUI extends JPanel{
    static GridBagConstraints c;
    static MainGUI mainGUIclass;
    static JFrame mainGUIframe;

    public MainGUI() {
    this.setLayout(new GridBagLayout());
    c = new GridBagConstraints();

    saveButton = new JButton("Save and Exit");
    saveButton.setPreferredSize(new Dimension(200, 30));

    c.gridx = 0;
    c.gridy = 0;
    c.gridwidth = 4;
    add(saveButton, c);
    }

public static void main(String[] args) {
    mainGUIframe = new JFrame("Message");

    mainGUIframe.setSize(800,800);

    mainGUIclass = new MainGUI();

    mainGUIframe.add(mainGUIclass);
    mainGUIframe.setVisible(true);


   //now the addition
    JButton newButton = new JButton("New Button");  

    newButton.setPreferredSize(new Dimension(200, 30));


    c.gridx = 5;
    c.gridy = 0;
    c.gridwidth = 4;
    mainGUIclass.add(newButton,c);

    //none of this seems to work
    mainGUIclass.revalidate();//?
    mainGUIclass.repaint();//?

  }
}

Update2: похоже, это проблема с характером java passbyvalue и другим классом (canvas), который я пытаюсь добавить в свой макет. Будет ли обновление, если я найду решение.

Update3: это проблема с потоком, класс, который я вызываю, вешает главное окно.

Редактировать: я предоставил код в качестве справочного материала и попытался дополнить его, чтобы получить полную картину, которую нельзя было скомпилировать самостоятельно. Спасибо всем, кто предложил вашу помощь.

Обновление 4: успех! Ключевым моментом было то, что класс mediaplayer выполнил проверку «isDisplayable ()», которая вызвала зависание программы, если добавляемый кадр не был добавлен в gridbaglayout. Последовательность неудачно выглядящих проходов по значениям (JInternalFrames), добавление внутреннего кадра к gridbaglayout и удаленный запуск носителя из другого метода позволяют мне работать.

Ответы [ 2 ]

4 голосов
/ 07 сентября 2011

Вы бы вызвали revalidate() для контейнера (если он происходит от JComponent, такого как JPanel), который использует макет, чтобы макеты переустанавливали компоненты, которые они содержат.Это должно проходить через все контейнеры, содержащиеся в этом макете, и у них тоже должны быть обновлены макеты их компонентов.Основное исключение из этого, о котором я знаю, это компоненты, хранящиеся в JScrollPanes, и для этого вам нужно будет вызвать revalidate в JViewport на scrollpane.

Кроме того, иногда вам нужно будет вызывать repaint() послеrevalidate(), особенно если вы удалили все компоненты, удерживаемые контейнером.

3 голосов
/ 07 сентября 2011

В вашем примере вы добавляете кнопку с точно таким же GridBagConstraints, что и предыдущая кнопка.Когда я пытаюсь запустить этот код, ваши кнопки располагаются друг над другом, и вы увидите только одну из них.Попробуйте изменить GridBagConstraints, чтобы вторая добавленная вами кнопка находилась в другом месте.Рекомендуется создавать новые GridBagConstraints для каждого ограниченного компонента, чтобы исключить вероятность таких ошибок программирования.

Кроме того, в отношении вашего обновления JFrame не имеет функции revalidate().

Если вы этого еще не сделали, вам стоит внимательно прочитать this .

...