2011-08-12 23 views
6

Dodałem wiele JProgressBar do TableColumn z JTable.Dodawanie wielu JProgressBar do TableColumn of JTable

Aktualizuję wszystkie dane JProgressBar po wykonaniu pewnych obliczeń, ale tylko ostatnia ProgressBar (w tym przypadku ProgressBarprogressObj4), która jest dodawana, jest aktualizowana.

Jak mogę zaktualizować wszystkie ProgressBar s?

Podstawowym wymogiem jest wyświetlanie statusu pliku na pasku postępu podczas przesyłania. Obecnie nadpisuję 4 paski postępu, aby przetestować, czy wszystkie paski postępu otrzymują aktualizację w zależności od stanu pliku, ale muszę je utworzyć dynamicznie. Łączna liczba pasków postępu nie jest liczbą plików, które są ładowane. Ponadto, w jaki sposób mogę pobrać poszczególne instancje pasków postępu & zaktualizować ich status?

Załączam kod źródłowy paska postępu, który jest dodawany do kolumny tabeli.

//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); 

Odpowiedz

8

zasadzie istnieją dwa sposoby poruszania się JProgressBar za pomocą SwingWorker i Runnable # nici, przykładem dla 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 do testów błędów! Cf. ten powiązany [przykład] (http://stackoverflow.com/questions/3483485/java-jprogressbar-or-equivalent-in-a-jtabbedpane-tab-title/3484251#3484251). – trashgod

3

Według mojej wiedzy, renderer stosuje się do wszystkich wierszy w danej kolumnie. Wydaje mi się, że chciałbyś zastosować kilka renderów do tej samej kolumny. Ponadto wydaje się, że próbujesz podać stan renderowania komórki.

Wierzę, że pomoże to uczynić renderer bez statunym i mieć metodę renderera getTableCellRendererComponent() zadba o ustawienie różnych właściwości (JProgressBar) na podstawie wartości z bieżącego wiersza zanim renderer maluje komórkę.

Innymi słowy, powinieneś tylko raz wywołać tc.setCellRenderer() dla dowolnej kolumny, a następnie mieć renderel komórki, aby narysować kolumnę dla danego wiersza (na podstawie, powiedzmy, bazowego modelu danych dla ten stół).