gpt4 book ai didi

java - 进度条 TableCellRenderer 不工作

转载 作者:行者123 更新时间:2023-12-01 14:18:28 26 4
gpt4 key购买 nike

我正在尝试在 JTable 列上设置 JProgressbar 单元格渲染器。问题是,我的表格单元格上不会显示任何进度条,它只显示进度值。

这是我的 TableModel:

public class DownloadTableModel extends AbstractTableModel {

private String[] columnNames = { "Song", "Artist", "Album", "Progress", "Size", "Path", "Date" };

private List<Track> songDownloads = new ArrayList<Track>();

public DownloadTableModel() {

}

public DownloadTableModel(List<Song> songs) {
for (Song song : songs) {
Track track = Services.getDownloadService().download(song);
songDownloads.add(track);
fireTableDataChanged();
}
}

@Override
public int getColumnCount() {
return columnNames.length;
}

@Override
public int getRowCount() {
return songDownloads == null ? 0 : songDownloads.size();
}

@Override
public String getColumnName(int col) {
return columnNames[col];
}

public Object getValueAt(int rowIndex, int columnIndex) {
Track songDownload = songDownloads.get(rowIndex);
switch (columnIndex) {
case 0: return songDownload.getSong().getName();
case 1: return songDownload.getSong().getArtist().getName();
case 2: return songDownload.getSong().getAlbum().getName();
case 3: return songDownload.getProgress();
case 4: return songDownload.getSize();
case 5: return songDownload.getPath();
case 6: return songDownload.getDate();
}
return null;
}

public void setValueAt(Object obj, Track songDownload, int col) {
int index = songDownloads.indexOf(songDownload);
setValueAt(obj, col, index);
fireTableCellUpdated(index, col);
updateSongDownloads();
}

@Override
public Class<?> getColumnClass(int column) {
if(songDownloads.size() > 0 && getRowCount() > 0) {
return getValueAt(0, column).getClass();
} else {
switch (column) {
case 0: return String.class;
case 1: return String.class;
case 2: return String.class;
case 3: return Integer.class;
case 4: return String.class;
case 5: return String.class;
case 6: return String.class;
default: return Object.class;
}
}
}

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

public List<Track> getSongDownloads() {
return songDownloads;
}

public void setSongDownloads(List<Track> songDownloads) {
this.songDownloads = songDownloads;
fireTableStructureChanged();
updateSongDownloads();
}

public Track getSongDownload(Song song) {
for(Track songDownload : songDownloads) {
if(songDownload.getSong().equals(song)) {
return songDownload;
}
}
return null;
}

public int getSongDownloadIndex(Song song) {
for(Track songDownload : songDownloads) {
if(songDownload.getSong().equals(song)) {
return songDownloads.indexOf(songDownload);
}
}
return -1;
}

public void removeRow(int row) {
songDownloads.remove(row);
fireTableDataChanged();
updateSongDownloads();
}

public void removeRow(Track songDownload) {
songDownloads.remove(songDownload);
fireTableDataChanged();
updateSongDownloads();
}

public void addRow(Track songDownload) {
songDownloads.add(songDownload);
fireTableDataChanged();
updateSongDownloads();
}

public void addRow(int row, Track songDownload) {
songDownloads.add(row, songDownload);
fireTableDataChanged();
updateSongDownloads();
}

public void updateSongDownloads() {
Main.getConfig().setDownloads(songDownloads);
}

public void fireTableCellUpdated(Song song, int col) {
fireTableCellUpdated(getSongDownloadIndex(song), col);
}

}

然后是 JTable:

downloadTable = new javax.swing.JTable();

downloadTable.setModel(new groovesquid.gui.DownloadTableModel());
downloadTable.getColumn("Progress").setCellRenderer(new ProgressCellRenderer());
downloadTable.setAutoCreateRowSorter(true);

downloadTable.setFocusable(false);

downloadTable.setGridColor(new java.awt.Color(204, 204, 204));

downloadTable.setRequestFocusEnabled(false);

downloadTable.setRowHeight(20);

downloadTable.getTableHeader().setReorderingAllowed(false);

jScrollPane2.setViewportView(downloadTable);

还有我的 TableCellRenderer:

public class ProgressCellRenderer extends JProgressBar implements TableCellRenderer {
ProgressCellRenderer() {
super(0, 100);
setValue(0);
setString("initializing...");
setStringPainted(true);
}

@Override
public boolean isDisplayable() {
// This does the trick. It makes sure animation is always performed
return true;
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
String text = "";
Color foregroundColor = Color.BLACK;

this.setForeground(foregroundColor);
this.setValue((Integer)value);
this.setString(text);

return this;
}
}

最佳答案

明白了,问题是,我在设置表数据时使用的是 fireTableStructureChanged 而不是 fireTableDataChanged

关于java - 进度条 TableCellRenderer 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17885146/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com