1

私はjtableを備えたアプリを開発しており、ユーザーはダウンロードを開始できます。ダウンロードの名前、状態、プログレスバーをテーブルに追加したいと思います。私はこのようにやっています:

JTABLEの初期化:(NETBEANSによって自動的に作成されたコード(編集する方法はありますか?oO))

jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null},
                {null, null, null},
                {null, null, null},
                {null, null, null}
            },
            new String [] {
                "Categoria", "Sottocategoria", "Progresso (%)"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.Object.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jTable1.setColumnSelectionAllowed(true);
        jScrollPane2.setViewportView(jTable1);
        jTable1.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

レンダラーの作成:

class ProgRenderer implements TableCellRenderer {

        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            return (JProgressBar) value;
        }
    }

最後の列に追加します。

jTable1.getColumn("Progresso (%)").setCellRenderer(new ProgRenderer());

ArrayList<Thread>これで、アクティブなスレッドを保存するためのとArrayList<JProgressBar>、jtableに存在するすべてのプログレスバーを保存するためのを作成しました(正しい方法ですか?)。

新しい行を追加するには、次のようにします。

DefaultTableModel d = (DefaultTableModel) jTable1.getModel();
work++; // to have a number of active threads.
progress.add(getProgress(x, total));
d.addRow(new Object[]{Html.categoria, "Inizio scansione", progress.get(work)});
                Thread t = new Thread(new Runnable() {

                    @Override
                    public void run() {
                        int max = Html.totale;
                        for(int i=1;i<=max;i++){
                            try {
                                progress.get(work).setValue(i); // JUST FOR TRY
                                System.out.println(progress.get(work).getValue()); // TRY
                                Thread.sleep(1000);
                            } catch (InterruptedException ex) {
                        }
                    }
                });
                working.add(t);
                t.start();


private JProgressBar getProgress(int x, int total) {
        JProgressBar progressCsv = new JProgressBar();
        progressCsv.setMaximum(total);
        progressCsv.setStringPainted(true);
        progressCsv.setString("0%");
        return progressCsv;
    }

私の問題は、進捗状況が更新されていないことです、私のアプローチは間違っていますか?手伝って頂けますか?ありがとう

4

1 に答える 1

0

私はあなたをお勧めします:

  1. 表には、進捗状況のみに関する情報を保持します。

    Class[] types = new Class [] {
        java.lang.String.class, java.lang.String.class, java.lang.Integer.class
    };
    
  2. JProgressBarを拡張するプログレスバーを実装する

    class ProgRenderer extends JProgressBar implements 
    
    TableCellRenderer {
       public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
          this.setValue((Integer)value)
          return this;
       }
    }
    
  3. 増分値

    @Override
    public void run() {
        int max = Html.totale;
        for(int i=1;i<=max;i++){
            try {
                SwingUtiliites.invokeLater(new Runnable(){
                   public void run(){
                       jTable1.setValueAt(Integer.valueOf(i),row,2);
                   }
                }
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
        }
    }
    
于 2012-06-20T13:06:27.063 に答える