Java валидировать () метод не работает должным образом - PullRequest
3 голосов
/ 25 февраля 2011

У меня есть JFrame, внутри которого находится jpanel, который я использую в качестве панели содержимого.

Так что в основном я использую jpanel для загрузки контента при нажатии.Новый контент возвращается также в виде Jpanel, поэтому он становится jpanel -> внутри jpanel -> внутри Jframe.Когда мне нужно загрузить новый контент, я очищаю панель, загружаю новый контент и проверяю () jframe & jpanel, и отображается новый контент.

Моя проблема заключается в том, что когда новый контент отображает его,метод validate работает, потому что я вижу новый интерфейс, но я также вижу старый интерфейс, как будто он стал фоном;я могу изменить размер окна, и оно просто исчезает и выглядит так, как должно.

enter image description here enter image description here

Так работает валидатор или я могу это исправить?

Редактировать: это сработало.Проблема была в том, что я не звонил перерисовывать вручную.

public BaseWindow setContent(JComponent comp){
    contentPane.add(comp);
    contentPane.revalidate();
    contentPane.repaint();
    return this;
}

Ответы [ 6 ]

3 голосов
/ 26 февраля 2011

Обычно код для добавления / удаления одного или двух компонентов с панели:

panel.remove(..);
panel.add(...);
panel.revalidate();
panel.repaint(); // sometimes needed

Однако, если вы заменяете все компоненты на панели, тогда лучше использовать Макет карты .

Вы уже указали, что revaliate (), за которым следует repaint (), не работает, поэтому единственное, что я могу предложить, - опубликовать вашу SSCCE , которая демонстрируетпроблема.

2 голосов
/ 25 февраля 2011

Не используйте валидировать.Вместо этого используйте revalidate () .

Повторная проверка первых вызовов invalidate (), а затем validate ().В Swing вы редко используете validate ().

Примечание : я также чувствую, что, возможно, старая панель не очищена / удалена. Проверьте снова!

1 голос
/ 25 февраля 2011

Validate () служит для того, чтобы заставить компоненты перестраиваться в соответствии с установленным менеджером компоновки. Это не совсем то, что вы должны использовать.

Я не вижу ваш код, поэтому я не совсем уверен, что вы делаете. Я могу предположить, что вызов repaint () на вашей «внутренней панели» решит проблему, с которой вы столкнулись ... но на самом деле, если вы все делаете правильно, вам не нужно вызывать repaint () или validate ().

Создайте два JPanel, один с контентом A (например, ваши кнопки), а другой с контентом B (например, ваше «статическое» поле). Используйте методы «add ()» и «remove ()» в родительском контейнере (панель содержимого JFrame?), Чтобы поменять местами эти два JPanel всякий раз, когда вы хотите переключить контент, отображаемый в этой части JFrame.

Тогда вам не нужно больше ничего делать; это должно просто работать.

0 голосов
/ 20 апреля 2019

В итоге я исправил свою проблему (отображение не отображалось, кнопки оставались нажатыми / не отменялись) путем изменения панелей, которые были добавлены / удалены.

Проблема:

frame.removeAll();
frame.add(getNewPanelDisplay());
frame.revalidate();
frame.repaint();

Решение:

//initializer()
mainPanel = new JPanel();
frame.add(mainPanel());
// ...
//update()
mainPanel.remove(0);
mainPanel.add(getTablePanel(), 0);
frame.revalidate();
frame.repaint();
0 голосов
/ 26 февраля 2011

Вот еще одно возможное решение:

Поместите оба JPanels одновременно, рядом, а затем убедитесь, что только один из них когда-либо виден одновременно:

JPanel p = new JPanel(new BorderLayout());
p.add( panelA, BorderLayout.EAST );
p.add( panelB, BroderLayout.WEST );
panelA.setVisible(true);
panelB.setVisible(false);

Затем, когда пользователь нажимает кнопку для переключения панелей:

panelA.setVisible(false);
panelB.setVisible(true);

Метод setVisible () и BorderLayout должны позаботиться о проверке, макете и вызовах repaint () для вас.

0 голосов
/ 25 февраля 2011

Я не знаю, дает ли validate () какие-либо обещания по поводу полной перекраски контейнера. Возможно, вам придется вызвать repaint () самостоятельно, чтобы заставить его вести себя так, как вы хотите.

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