Я пытаюсь разобраться в разработке Java ME для карманного компьютера. Я запускаю эмулятор NSIcom CrE-ME и создаю свое приложение с помощью NetBeans 6.5.
Приложение основано на трех панелях вкладок, каждая из которых имеет компоненты Swing. Компоненты содержимого Swing обновляются в различных точках приложения. Эти компоненты включают JTextArea, JTextFields и, что наиболее важно, JTable в JScrollPane.
JTable вызывает проблемы. Если я инициализирую его через Matisse с некоторыми образцами данных, он появляется. Но если я попытаюсь установить ссылку на JTable во время выполнения в методе populateFields () ниже, ничего не появится. Обратите внимание, что это просто образец данных таблицы из учебника Sun, даже не моя настраиваемая TableModel.
Что я делаю неправильно? Есть ли какой-нибудь очевидный метод обновления, который мне нужно вызвать, или какая-то другая явная ошибка / ошибка, которую я пропустил? Я испробовал практически все возможные методы, которые, как мне казалось, могли иметь к этому какое-то отношение.
Метод populateFields () вызывается в разное время в течение программы.
public void populateFields()
{
String[] columnNames = {"First Name", "Last Name","Sport", "# of Years", "Vegetarian"};
Object[][] data = { {"Mary", "Campione", "Snowboarding", new Integer(5), new Boolean(false)},
{"Alison", "Huml", "Rowing", new Integer(3), new Boolean(true)},
{"Kathy", "Walrath", "Knitting", new Integer(2), new Boolean(false)},
{"Sharon", "Zakhour", "Speed reading", new Integer(20), new Boolean(true)},
{"Philip", "Milne", "Pool", new Integer(10), new Boolean(false)} };
this.tableSurvey = new JTable(new DefaultTableModel(data, columnNames));
this.scrollPaneSurvey = new JScrollPane(this.tableSurvey);
DefaultTableModel dtm = (DefaultTableModel) this.tableSurvey.getModel();
dtm.fireTableStructureChanged();
dtm.fireTableDataChanged();
this.scrollPaneSurvey.invalidate();
this.scrollPaneSurvey.validate();
this.panelSurvey.validate();
this.panelSurvey.repaint();
}




Хорошо, наконец-то я обнаружил, что, видимо, это все, что мне нужно:
this.tableSurvey = new JTable(new DefaultTableModel(data, columnNames));
this.scrollPaneSurvey.setViewportView(this.tableSurvey);
this.scrollPaneSurvey.validate();
Может ли кто-нибудь объяснить, почему использование приведенного ниже кода вместо метода setViewportView () не сработало?
this.scrollPaneSurvey = new JScrollPane(this.tableSurvey);
Спасибо!
Я думаю, исходя из ваших фрагментов кода, вы делаете
this.scrollPaneSurvey = new JScrollPane(this.tableSurvey);
Но проблема в том, что менеджер компоновки родительской панели имеет собственную ссылку на старый scrollPaneSurvey. Поэтому, когда вы воссоздаете его, вы никогда не заменяете существующий компонент, и этот новый компонент никогда не добавляется в конвейер рендеринга. Ваш класс знает об этом, но родитель не видит уведомления о том, что что-то изменилось.
Имеет ли это смысл?
Как и во второй части, которую вы публикуете, вы сообщаете scrollPaneSurvey, что он должен отображать, который генерирует уведомления для автоматической перерисовки.
Потому что новые компоненты нужно куда-то добавлять, чтобы они появились.