0

DAO から GUI レベルにデータを取得しています。

テーブルをロードしたい場合、クリックされた db シンボルの正しい行数のみを持つ空のテーブルを取得します。

ここに画像の説明を入力

私が使用する要素をロードするには:

playlistTable.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
    if (e.getClickCount() == 1) {
        JTable target = (JTable)e.getSource();
        int row = target.getSelectedRow();
        playlistTableModel.setPlaylists(playlistService.getMoviesOfPlaylist(row));
}

テーブルが空なのはなぜですか?

アップデート

テーブル モデル コード:

public class PlaylistTableModel extends AbstractTableModel {

    /**
     * Generated UID
     */
    private static final long serialVersionUID = 9058516120594137393L;


    /**
     * List of playlist to be shown
     */
    private List<Playlist> playlist;

    public PlaylistTableModel(List<Playlist> playlist){
        this.playlist=playlist;
    }

    public int getColumnCount() {
        return 1;
    }

    public int getRowCount() {
        return playlist.size();
    }

    public Object getValueAt(int arg0, int arg1) {
        Playlist playlists = playlist.get(arg0);
        switch(arg1){
        case 0: return playlists.getName();
        default: return null;
        }
    }    

    public void setPlaylists(List<Playlist> playlist){
        this.playlist=playlist;
        fireTableDataChanged();//Aktualisiert Playlist automatisch
    }

    public void setPlaylist(Playlist playlists){
        playlist.add(playlists);
        fireTableRowsInserted(playlist.size()-1, playlist.size()-1);
    }


    public String getColumnName(int column) {
        if(column==0){
            return "Playlist";
        }
        else{
            return null;
        }
    }

    /**
     * Returns a movie from the list specified by the index
     * @param row index of the movie
     * @return movie
     */
    public Playlist getPlaylist(int row){
        return playlist.get(row);
    }

    @Override
    public boolean isCellEditable(int row, int col) {
        return true;
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex){
        if(columnIndex!=0){
            return;
        }    
        fireTableCellUpdated(rowIndex, columnIndex);
    }
4

3 に答える 3

1

この方法が問題かもしれませんが、

public void setPlaylist(Playlist playlists){
    playlist.add(playlists);
    fireTableRowsInserted(playlist.size()-1, playlist.size()-1);
}

たとえば、サイズ 20 のプレイリストを取得したとします。次に、呼び出しているテーブル モデル プレイリストに割り当てた後、

fireTableRowsInserted(playlist.size()-1, playlist.size()-1);

これは、

fireTableRowsInserted(19, 19);

しかし、実際に起こったことは、1 行だけではなく 20 行を挿入していることです。そのため、回答セクションで@Ivan.Latyshが示唆しているように、行カウントの開始から行カウントの終了まで挿入を呼び出す必要があります。これはrepaint、挿入された行になります。

PS:メソッドを呼び出すfireTableDataChanged();こともできます。しかし、このメソッドはrepaintテーブル全体になります。テーブル リスト全体が変更された場合にのみ、この方法を優先してください。それ以外の場合は、挿入、更新、削除のそれぞれfireXXのメソッドがあります。

于 2012-12-09T04:32:50.620 に答える
0

おそらく問題はgetValueAtメソッドにあり、このように変更します

 public Object getValueAt(int arg0, int arg1) {
        // since you use only one column     
        return playlist.get(arg0).getName();
 }
于 2012-12-08T15:00:34.403 に答える
0

問題は、間違った変更イベントを発生させていることです

fireTableRowsInserted(playlist.size()-1, playlist.size()-1);

ドキュメントの状態:

public void fireTableRowsInserted(int firstRow,
                              int lastRow)

Notifies all listeners that rows in the range [firstRow, lastRow], inclusive, have been inserted. 

したがって、最適にしたい場合は、次のようにします。

public void setPlaylist(Playlist playlists){
  int firstRow = playlist.size();
  playlist.add(playlists);
  fireTableRowsInserted(firstRow, playlist.size()-1);
}

または、単にテーブル全体を再描画します。テーブルもサイズを再計算する可能性があることを忘れないでください。

fireTableDataChanged();
于 2012-12-08T22:01:22.307 に答える