2011-08-12 33 views
6

Tôi đã thêm nhiều JProgressBar đến TableColumn của JTable.Thêm nhiều JProgressBar vào BảngColumn của JTable

Tôi đang cập nhật tất cả dữ liệu JProgressBar sau khi thực hiện các phép tính nhất định, nhưng chỉ ProgressBar cuối cùng (trong trường hợp này là ProgressBarprogressObj4) được thêm vào đang được cập nhật.

Làm cách nào để cập nhật tất cả ProgressBar giây?

Yêu cầu cơ bản là tôi đang hiển thị trạng thái của tệp trong thanh tiến trình trong khi tải lên. Hiện tại tôi đang hardcoding 4 thanh tiến trình để kiểm tra nếu tất cả các thanh tiến trình đang nhận được cập nhật wrt tình trạng của tập tin, nhưng tôi cần phải tạo chúng tự động. Tổng số thanh tiến trình không có tập tin nào được tải lên. Ngoài ra, làm cách nào tôi có thể tìm nạp các cá thể của thanh tiến trình & cập nhật trạng thái của chúng?

Tôi đang gắn mã nguồn của thanh tiến trình được thêm vào cột bảng.

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

Trả lời

8

về cơ bản có hai cách di chuyển với JProgressBar bằng cách sử dụng SwingWorker và Runnable # Chủ đề, ví dụ cho 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 để thử nghiệm lỗi! Cf. [ví dụ] có liên quan này (http://stackoverflow.com/questions/3483485/java-jprogressbar-or-equivalent-in-a-jtabbedpane-tab-title/3484251#3484251). – trashgod

3

Theo hiểu biết của tôi, trình kết xuất áp dụng cho tất cả các hàng trong một cột nhất định. Dường như với tôi rằng bạn muốn áp dụng một số trình kết xuất cho cùng một cột. Hơn nữa, nó cũng có vẻ như bạn đang cố gắng để cung cấp cho nhà nước renderer tế bào.

tôi tin rằng nó sẽ giúp đỡ để làm cho các renderer quốc tịch và có phương pháp của renderer getTableCellRendererComponent() chăm sóc thiết lập các thuộc tính khác nhau (JProgressBar) dựa trên các giá trị từ hàng hiện tại trước khi các renderer vẽ tế bào.

Nói cách khác, bạn chỉ cần gọi tc.setCellRenderer() một lần cho bất kỳ cột nào, và sau đó có trình kết xuất ô của bạn vẽ cột cho bất kỳ hàng nào (dựa trên, ví dụ, mô hình dữ liệu cơ bản cho cái bàn kia).

Các vấn đề liên quan