Динамически добавленный JTable не отображается

Новичок Java здесь. У меня есть JFrame, который я добавил в свой проект netbeans, и я добавил к нему следующий метод, который создает JTable. Проблема в том, что по какой-то причине, когда я вызываю этот метод, JTable не отображается. Какие-либо предложения?

public void showFromVectors(Vector colNames, Vector data) {     
    jt = new javax.swing.JTable(data, colNames);
    sp = new javax.swing.JScrollPane(jt);
    //NB: "this" refers to my class DBGridForm, which extends JFrame
    this.add(sp,java.awt.BorderLayout.CENTER);
    this.setSize(640,480);
}

Метод вызывается в следующем контексте:

DBGridForm gf = new DBGridForm(); //DBGridForm extends JFrame
DBReader.outMatchesTable(gf);
gf.setVisible(true);

... где DBReader.outMatchesTable () определяется как

static public void outMatchesTable(DBGridForm gf) {
    DBReader ddb = new DBReader();
    ddb.readMatchesTable(null);
    gf.showFromVectors(ddb.lastRsltColNames, ddb.lastRsltData);
}

Полагаю, я что-то упускаю из виду, либо о используемых мной классах Swing, либо о Java. Есть идеи?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
11 013
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

"это" в вашем контексте неясно. Это внутри апплета? JFrame?

У вас может быть проблема с макетом, убедитесь, что вы вызвали setLayout в своем классе с новым borderlayout.

В приложении Swing вы хотите использовать getRootContentPane (). Add () вместо необработанного add (), в зависимости от версии.

Руководство по Java по добавлению содержимого верхнего уровня: http://java.sun.com/docs/books/tutorial/uiswing/components/toplevel.html

«this» относится к DBGridForm, которая расширяет JFrame. Я подумал, что это очевидно, когда я сказал (перефразируя) «создал JFrame с помощью netbeans и добавил к нему следующий метод». Похоже, это было не так очевидно, как я думал

Graza 23.09.2008 19:41

ОК, вызываем this.setLayout (new java.awt.BorderLayout ()); перед добавлением панель прокрутки помогло. Я думаю, что макет по умолчанию, добавленный netbeans, должен быть чем-то другим - это действительно первый раз, когда я использую netbeans, весь предыдущий опыт делал что-то с нуля ...

Graza 23.09.2008 19:46

Я думаю, что макет по умолчанию - это потоковый макет.

davenpcj 23.09.2008 23:12

Если вы не работаете в потоке событий, это может быть проблемой - я видел, что это приводит к тому, что данные не отображаются.

Если этот код вызывается в ответ на событие AWT (щелчок мыши, нажатие кнопки, ...), то проблема не в этом, но если это все еще тот же поток, который запустил ваше приложение, или этот код работает по таймеру, может очень хорошо быть.

Вы можете использовать поток событий Java, чтобы запускать вещи асинхронно. java.sun.com/products/jfc/tsc/articles/threads/threads1.html

davenpcj 27.09.2008 04:35

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