2013-07-26 2 views
0

Я пытаюсь установить средство рендеринга ячеек JProgressbar в столбце JTable. Проблема в том, что в моей ячейке таблицы не будет отображаться какой-либо ProgressBar, он просто показывает значение прогресса.Progressbar TableCellRenderer не работает

Это мой 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; 
    } 
} 
+0

1) Для лучшей помощи раньше, отправьте сообщение [SSCCE] (http://sscce.org/). 2) * Не блокируйте EDT (Event Dispatch Thread) - графический интерфейс «замораживается», когда это произойдет. Вместо этого выполняйте 'SwingWorker' для длительных задач. См. [Concurrency in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/) для более подробной информации. * –

+0

Спасибо за ваши советы, но где именно я блокирую EDT? – Marius

+0

Опубликовать SSCCE & Я буду комментировать дальше. –

ответ

0

Понял, проблема была, что я использовал fireTableStructureChanged вместо из fireTableDataChanged, когда я настраивал данные таблицы.

Смежные вопросы