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

Я пытаюсь справиться с разработкой Java ME для Pocket PC. Я использую эмулятор NSIcom CrE-ME и создаю свое приложение с помощью NetBeans 6.5.

Приложение основано на трех вкладках, каждая из которых имеет компоненты Swing. Содержимое компонентов Swing обновляется в различных точках приложения. Эти компоненты включают JTextArea, JTextFields и, что наиболее важно, JTable в JScrollPane.

JTable вызывает проблемы. Если я инициализирую его через Матисс с некоторыми примерами данных, он появится. Но если я попытаюсь установить ссылку на 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();
    }

Ответы [ 2 ]

1 голос
/ 30 декабря 2008

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

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

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

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

Спасибо!

0 голосов
/ 31 декабря 2008

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

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

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

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

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

...