2011-08-12 42 views
6

He agregado múltiples JProgressBar a TableColumn de JTable.Agregando múltiples JProgressBar a TableColumn de JTable

Estoy actualizando todo el JProgressBar con los datos después de realizar ciertos cálculos, pero sólo el último ProgressBar (en este caso ProgressBarprogressObj4) que se añade está consiguiendo puestas al día.

¿Cómo puedo actualizar todas las ProgressBar s?

El requisito básico es que estoy mostrando el estado del archivo en la barra de progreso durante la carga. Actualmente estoy hardcoding 4 barras de progreso para probar si todas las barras de progreso están actualizando el estado del archivo, pero necesito crearlas dinámicamente. El número total de barras de progreso muestra el número de archivos que se cargan. Además, ¿cómo puedo recuperar las instancias individuales de las barras de progreso & para actualizar su estado?

Estoy adjuntando el código fuente de la barra de progreso que se agrega a la columna de la tabla.

//tc = object of TableColumn 

progressObj1 = new ProgressBarRenderer("Progress1"); 
progressObj1.setValue(0); 
progressObj1.setStringPainted(true); 
progressObj1.setBackground(Color.WHITE); 
progressObj1.setBorderPainted(true); 

tc.setCellRenderer(progressObj1); 

progressObj2 = new ProgressBarRenderer("Progress2"); 
progressObj2.setValue(0); 
progressObj2.setStringPainted(true); 
progressObj2.setBackground(Color.WHITE); 
progressObj2.setBorderPainted(true); 

tc.setCellRenderer(progressObj2); 

progressObj3 = new ProgressBarRenderer("Progress3"); 
progressObj3.setValue(0); 
progressObj3.setStringPainted(true); 
progressObj3.setBackground(Color.WHITE); 
progressObj3.setBorderPainted(true); 

tc.setCellRenderer(progressObj3); 

progressObj4 = new ProgressBarRenderer("Progress4"); 
progressObj4.setValue(0); 
progressObj4.setStringPainted(true); 
progressObj4.setBackground(Color.WHITE); 
progressObj4.setBorderPainted(true); 

tc.setCellRenderer(progressObj4); 

Respuesta

8

básicamente hay dos formas se mueven con JProgressBar utilizando SwingWorker y # hebra ejecutable, por ejemplo SwingWorker

import java.awt.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class TableCellProgressBar { 

    private String[] columnNames = {"String", "ProgressBar"}; 
    private Object[][] data = {{"dummy", 100}}; 
    private 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 col) { 
      return false; 
     } 
    }; 
    private JTable table = new JTable(model); 

    public JComponent makeUI() { 
     TableColumn column = table.getColumnModel().getColumn(1); 
     column.setCellRenderer(new ProgressRenderer()); 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       startTask("test"); 
       startTask("error test"); 
       startTask("test"); 
      } 
     }); 
     JPanel p = new JPanel(new BorderLayout()); 
     p.add(new JScrollPane(table)); 
     return p; 
    } 
//http://java-swing-tips.blogspot.com/2008/03/jprogressbar-in-jtable-cell.html 

    private void startTask(String str) { 
     final int key = model.getRowCount(); 
     SwingWorker<Integer, Integer> worker = new SwingWorker<Integer, Integer>() { 

      private int sleepDummy = new Random().nextInt(100) + 1; 
      private int lengthOfTask = 120; 

      @Override 
      protected Integer doInBackground() { 
       int current = 0; 
       while (current < lengthOfTask && !isCancelled()) { 
        if (!table.isDisplayable()) { 
         break; 
        } 
        if (key == 2 && current > 60) { //Error Test 
         cancel(true); 
         publish(-1); 
         return -1; 
        } 
        current++; 
        try { 
         Thread.sleep(sleepDummy); 
        } catch (InterruptedException ie) { 
         break; 
        } 
        publish(100 * current/lengthOfTask); 
       } 
       return sleepDummy * lengthOfTask; 
      } 

      @Override 
      protected void process(java.util.List<Integer> c) { 
       model.setValueAt(c.get(c.size() - 1), key, 1); 
      } 

      @Override 
      protected void done() { 
       String text; 
       int i = -1; 
       if (isCancelled()) { 
        text = "Cancelled"; 
       } else { 
        try { 
         i = get(); 
         text = (i >= 0) ? "Done" : "Disposed"; 
        } catch (Exception ignore) { 
         ignore.printStackTrace(); 
         text = ignore.getMessage(); 
        } 
       } 
       System.out.println(key + ":" + text + "(" + i + "ms)"); 
      } 
     }; 
     model.addRow(new Object[]{str, 0}); 
     worker.execute(); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    public static void createAndShowGUI() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new TableCellProgressBar().makeUI()); 
     frame.setSize(320, 240); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

class ProgressRenderer extends DefaultTableCellRenderer { 

    private final JProgressBar b = new JProgressBar(0, 100); 

    public ProgressRenderer() { 
     super(); 
     setOpaque(true); 
     b.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1)); 
    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     Integer i = (Integer) value; 
     String text = "Completed"; 
     if (i < 0) { 
      text = "Error"; 
     } else if (i < 100) { 
      b.setValue(i); 
      return b; 
     } 
     super.getTableCellRendererComponent(table, text, isSelected, hasFocus, row, column); 
     return this; 
    } 
} 
+0

+1 para la prueba de errores! Cf. este relacionado [ejemplo] (http://stackoverflow.com/questions/3483485/java-jprogressbar-or-equivalent-in-a-jtabbedpane-tab-title/3484251#3484251). – trashgod

3

Que yo sepa, un procesador se aplica a todas las filas en una columna determinada. Me parece que le gustaría aplicar varios renderizadores a la misma columna. Además, también parece que está intentando dar el estado de renderizador de celda.

Creo que ayudará a hacer que el procesador sea sin estado y hacer que el método getTableCellRendererComponent() del desarrollador se encargue de establecer las diversas propiedades (JProgressBar) basadas en valores de la fila actual antes de que el procesador represente la celda.

En otras palabras, solo debe invocar tc.setCellRenderer() una vez para cualquier columna determinada, y luego tener su procesador de celda para dibujar la columna para cualquier fila dada (basado en, digamos, el modelo de datos subyacente para esa mesa).