Невозможно динамически изменить панель - PullRequest
2 голосов
/ 05 августа 2011

У меня 2 панели. Первая панель имеет поле со списком. в зависимости от значения элемента в выбранном поле со списком, панель под ним должна меняться. в слушателе действия поля со списком, когда я пытаюсь изменить панель, она не меняется. Почему это?

cb1.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            String s = (String) cb1.getSelectedItem();
            if (s.equals("Invoice")) {
                panel3Customizera();
                g.gridy = 2;
                remove(panel3);
                add(panel3, g);
            } else {
                panel3Customizerb();
                g.gridy = 2;
                add(panel3, g);
            }

        }
    });

добавление элементов panel3customizer в panel3.panel 3 добавляется в jframe. Ссылку на весь код можно найти здесь

Ответы [ 2 ]

5 голосов
/ 05 августа 2011

Вам нужно вызвать revalidate и repaint для контейнера, который содержит ваш объект panel3 и который здесь использует GridBagLayout после добавления или удаления компонентов. Обратите внимание, что revalidate только для объектов, производных от JComponent, таких как JPanel.

Редактировать 1
Если вы добавляете непосредственно в JFrame, то вы фактически добавляете в его contentPane, который обычно является JPanel. Так что пример выполнения того, что я предложил, будет выглядеть примерно так:

  cb1.addActionListener(new ActionListener() {
     @Override
     public void actionPerformed(ActionEvent e) {
        JPanel contentPane = (JPanel) getContentPane();
        String s = (String) cb1.getSelectedItem();
        if (s.equals("Invoice")) {
           panel3Customizera();
           g.gridy = 2;
           remove(panel3);
           contentPane.add(panel3, g);
        } else {
           panel3Customizerb();
           g.gridy = 2;
           contentPane.add(panel3, g);
        }
        contentPane.revalidate();
        contentPane.repaint();
     }
  });

но, сказав это, я должен добавить большой пробел к предложению mre об использовании CardLayout вместо обмена представлениями.

4 голосов
/ 05 августа 2011

Похоже, что внизу JPanel следует использовать CardLayout. Вот учебник по Как использовать CardLayout .

И @ Hovercraft Full Of Eels прав в своей рекомендации вызывать revalidate() и repaint() на объекте-контейнере, поскольку это вызовет снова расположить компоненты и удалить все визуальные «артефакты».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...