У меня есть JDialog dlg, созданный JFrame frm, который содержит список JList.
Когда я изменяю список (через ListModel), сам список перерисовывается, но не JDialog.
Это означает, что, если я удаляю строку, список остается с пустой строкой, в то время как, если я добавляю строку, эта новая строка не будет отображаться (потому что в диалоговом окне нет места), пока я не буду принудительно перерисовывать dlg вручную ( двойной клик в фрм).
Следующие советы в этом посте:
Как сделать перерисовку для JDialog в Swing?
и в этом посте:
Принудительная перекраска после нажатия кнопки
Я попытался вызвать из класса моего контроллера (где производятся обновления списка) следующую строку:
SwingUtilities.getWindowAncestor(dlg).repaint();
но это не сработало.
Я также попробовал:
dlg.repaint();
Не повезло, либо ...
Есть подсказка?
Большое спасибо.
EDIT:
Организация моих занятий выглядит следующим образом:
класс контроллера, который содержит ссылку на основной JFrame, frm.
Я также расширил JDialog в MyDialog, который содержит JList.
Когда обнаружен двойной щелчок по frm, я показываю экземпляр MyDialog (или создаю, если я его показываю впервые), и JList заполняется данными, передаваемыми в DefaultListModel. MyDialog нарисован так, чтобы в списке было только то место, которое ему нужно.
Теперь, когда контроллер обнаруживает определенное событие, я получаю конкретный MyDialog, получаю ListModel из JList и обновляю его. Здесь JList действительно обновляется, но диалог остается прежним.
Я использую код, подобный этому:
MyDialog dlg = group.getDlg();
if(dlg != null){
DefaultListModel listModel = ((DefaultListModel) dlg.getMyJList().getModel());
listModel.addElement(idStock);
SwingUtilities.getWindowAncestor(dlg).repaint();
}
Это не перекрашивает dlg.
Я тоже попробовал:
SwingUtilities.getWindowAncestor(dlg.getMyJList()).repaint();
но это не работает.
Я проверил с помощью отладчика, что строки действительно выполняются.
У меня не так много кода, чтобы показать, правда .....