我的目标是使用JTable显示数据库中的数据。
引用来自的代码:从ResultSet 填充JTable的最简单代码
我修改了代码以适应我的情况。我有一个类TopicData,使用以下方法:
public DefaultTableModel buildTableModel(){
//open connection
ResultSet rs = null;
Vector<String> columnNames = new Vector<String>();
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
int columnCount = 0;
DBController db = new DBController();
db.setUp("myDatabase");
String dbQuery = "SELECT topicName, topicDate, topicCategory, topicUser FROM topicTable ORDER BY topicDate";
rs = db.readRequest(dbQuery);
try{
ResultSetMetaData metaData = rs.getMetaData();
// names of columns
columnCount = metaData.getColumnCount();
for (int column = 1; column <= columnCount; column++) {
columnNames.add(metaData.getColumnName(column));
}
// data of the table
while (rs.next()) {
Vector<Object> vector = new Vector<Object>();
for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
vector.add(rs.getObject(columnIndex));
}
data.add(vector);
}
}
catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//close connection
db.terminate();
return new DefaultTableModel(data, columnNames);
}
在另一个类别TopicView:
private JTable getTable() {
if (table == null) {
TopicData topic= new TopicData();
table = new JTable(topic.buildTableModel());
table.setShowGrid(false);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setBounds(95, 59, 625, 357);
}
return table;
}
我意识到我的表并没有在每列的顶部都有标题。https://i.stack.imgur.com/FcnHb.png
因此,我简化了TopicData以进行故障排除:
public DefaultTableModel testTableModel(){
Vector<String> columnNames = new Vector<String>();
columnNames.add("test1");
columnNames.add("test1");
columnNames.add("test1");
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
Vector<Object>vector = new Vector<Object>();
vector.add("test2");
vector.add("test2");
vector.add("test2");
data.add(vector);
return new DefaultTableModel(data, columnNames);
}
同样,该表没有标题。单词"test1"没有出现在表中的任何位置,而显示了3列"test2"。
我真的对此感到困惑,任何帮助都将不胜感激。
-
将
JTable
放入JScrollPane
, -
否则必须将容器的
LayoutManager
更改为BorderLayout
,然后将JTable
放入CENTER area
,将getTableHeader
从JTable
放入JTableHeader
放入NORTH
/SOUTH
-
正确的方法是使用
JScrollPane
编辑
如何使表中的字段不可编辑?现在如果我双击我可以编辑单元格的内容
覆盖DefaultTableModel
的两种方法,伪代码
model = new DefaultTableModel(data, columnNames) {
private static final long serialVersionUID = 1L;
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
table = new JTable(model);
将您的表放在JScrollPane
中。
示例:
container.add(new JScrollPane(table));
或者您可以直接添加到容器中(如javadoc中所述(
container.setLayout(new BorderLayout());
container.add(table.getTableHeader(), BorderLayout.PAGE_START);
container.add(table, BorderLayout.CENTER);
对于您关于如何使单元格不可编辑的问题,
覆盖TableModel
中的isCellEditable(..(
@Override
public boolean isCellEditable(int rowIndex, int colIndex) {
// return false for not making it editable.
return false;
}