2

私の目標は、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;
}

テーブルの各列の上部にヘッダーがないことに気付きました。 http://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」という単語はテーブルのどこにも表示されませんが、「test2」の列が 3 つ表示されます。

私はこれに本当に困惑しています。

4

2 に答える 2

4
  • に入れJTableJScrollPane

  • それ以外の場合は、 for コンテナに変更LayoutManagerしてBorderLayoutから、 に置き、fromと putJTableに/にする必要があります。CENTER areagetTableHeaderJTableJTableHeaderNORTHSOUTH

  • 適切な方法は使用することですJScrollPane

編集

テーブル内のフィールドを編集不可にするにはどうすればよいですか? 今ダブルクリックすると、セルの内容を編集できます

DefaultTableModel、 pseudo_codeの両方のメソッドをオーバーライドします

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);
于 2013-01-10T13:50:54.950 に答える
1

テーブルを に入れますJScrollPane

例:

container.add(new JScrollPane(table));

または、コンテナに直接追加することで実行できます(javadocに記載されています)

container.setLayout(new BorderLayout());
container.add(table.getTableHeader(), BorderLayout.PAGE_START);
container.add(table, BorderLayout.CENTER);

セルを編集不可にする方法についての質問は、

isCellEditable(..) をオーバーライドしますTableModel

@Override
public boolean isCellEditable(int rowIndex, int colIndex) {
    // return false for not making it editable.
     return false; 

}
于 2013-01-10T14:09:54.527 に答える