Изменение ссылки JTable во время выполнения - не отображается в графическом интерфейсе

Я пытаюсь разобраться в разработке 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();
    }
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 300
2

Ответы 2

Хорошо, наконец-то я обнаружил, что, видимо, это все, что мне нужно:

this.tableSurvey = new JTable(new DefaultTableModel(data, columnNames));       
this.scrollPaneSurvey.setViewportView(this.tableSurvey);
this.scrollPaneSurvey.validate();

Может ли кто-нибудь объяснить, почему использование приведенного ниже кода вместо метода setViewportView () не сработало?

this.scrollPaneSurvey = new JScrollPane(this.tableSurvey);

Спасибо!

Потому что новые компоненты нужно куда-то добавлять, чтобы они появились.

iny 12.06.2009 19:15

Я думаю, исходя из ваших фрагментов кода, вы делаете

this.scrollPaneSurvey = new JScrollPane(this.tableSurvey);

Но проблема в том, что менеджер компоновки родительской панели имеет собственную ссылку на старый scrollPaneSurvey. Поэтому, когда вы воссоздаете его, вы никогда не заменяете существующий компонент, и этот новый компонент никогда не добавляется в конвейер рендеринга. Ваш класс знает об этом, но родитель не видит уведомления о том, что что-то изменилось.

Имеет ли это смысл?

Как и во второй части, которую вы публикуете, вы сообщаете scrollPaneSurvey, что он должен отображать, который генерирует уведомления для автоматической перерисовки.

Другие вопросы по теме