Новичок 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. Есть идеи?




"это" в вашем контексте неясно. Это внутри апплета? JFrame?
У вас может быть проблема с макетом, убедитесь, что вы вызвали setLayout в своем классе с новым borderlayout.
В приложении Swing вы хотите использовать getRootContentPane (). Add () вместо необработанного add (), в зависимости от версии.
Руководство по Java по добавлению содержимого верхнего уровня: http://java.sun.com/docs/books/tutorial/uiswing/components/toplevel.html
ОК, вызываем this.setLayout (new java.awt.BorderLayout ()); перед добавлением панель прокрутки помогло. Я думаю, что макет по умолчанию, добавленный netbeans, должен быть чем-то другим - это действительно первый раз, когда я использую netbeans, весь предыдущий опыт делал что-то с нуля ...
Я думаю, что макет по умолчанию - это потоковый макет.
Если вы не работаете в потоке событий, это может быть проблемой - я видел, что это приводит к тому, что данные не отображаются.
Если этот код вызывается в ответ на событие AWT (щелчок мыши, нажатие кнопки, ...), то проблема не в этом, но если это все еще тот же поток, который запустил ваше приложение, или этот код работает по таймеру, может очень хорошо быть.
Вы можете использовать поток событий Java, чтобы запускать вещи асинхронно. java.sun.com/products/jfc/tsc/articles/threads/threads1.html
«this» относится к DBGridForm, которая расширяет JFrame. Я подумал, что это очевидно, когда я сказал (перефразируя) «создал JFrame с помощью netbeans и добавил к нему следующий метод». Похоже, это было не так очевидно, как я думал