Динамически изменять вложенный компонент Swing - PullRequest
0 голосов
/ 12 июля 2011

Вот моя проблема: у меня есть JPanel, который содержит JTabbedPane, который имеет JScrollPane, используя настроенный JPanel. Проще говоря, я изменяю настроенный JPanel в своей программе, и мне нужны все родительские компоненты, чтобы отразить это изменение. Тем не менее, я понятия не имею, что мне нужно использовать для достижения этой цели. Вот что у меня сейчас:

    infoScroller.remove(infoPanel);
    this.reevaluateInfoPanel();
    infoScroller.setViewportView(infoPanel);
    infoScroller.revalidate();
    infoScroller.repaint();

, где infoScoller - это JScrollPane, а infoPanel - это настроенное JPanel.

Это должно было бы перейти от высказывания | Hi! | (или что-то в этом роде, вы поняли идею) к высказыванию | Bye! |, но вместо этого оно идет от | Hi! | до | |

РЕДАКТИРОВАТЬ: под настроенным я имею в виду только то, что он расширяет JPanel, имеет некоторые компоненты и т. Д. ReevaluateInfoPane () устанавливает информационную панель равной новой информационной панели на основе новой информации. Я знаю, что reevalutateInfoPanel () делает то, что я хочу, так как я могу сказать, что это новый JFrame, и это правильно ... вот код в любом случае ... это, вероятно, запутает больше, чем помощь, так как это действительно не нужно ...

private void reevaluateInfoPanel(){
    infoPanel = new JPanel();
    GridLayout gl = new GridLayout(infoNum, 1);
    infoPanel.setLayout(gl);

    //Create a display panel for every info block available
    DisplayPanel[] panels = new InfoViewer[infoList.length];
    for(int i = 0; i < panels.length; i++){
        panels[i] = new InfoViewer(infoList[i]);
    }

    //Assign a new SelectionPanel for every info selection necessary
    for(int i = 0; i < infoNum; i++){
        infoPanel.add(new SelectionPanel(panels, "info"));
    }
}

ОБНОВЛЕНИЕ: Я выяснил, что проблема где-то с JTabbedPane, который не рендерит обновленный JScrollPane. Вместо этого он просто удаляет его полностью, когда я revalidate и repaint это (JTabbedPane).

Ответы [ 2 ]

0 голосов
/ 13 июля 2011

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

0 голосов
/ 12 июля 2011

Вам следует позвонить revalidate() и repaint() в контейнере, который вы изменили. Из описания это звучит так, как будто вы должны позвонить им infoPanel. Также убедитесь, что ваши звонки происходят в ветке рассылки событий.

Возможно, было бы полезно также посмотреть, как вы меняете содержимое infoPanel.

...