2012-03-05 11 views
-3

可能な重複して細胞内のオブジェクトを取得する方法:
Adding multiple JProgressBar to TableColumn of JTableのjava - JTableの

私はこのcoloumnとDefaultTableModeljTable

String String JProgressBar 

とすべての行は次のように作成されます:

その2 - ii1は0です

progress = new ArrayList<JProgressBar>(); 

私のクラスはTableCellRendererをを実装しそう

@Override 
    public Component getTableCellRendererComponent(JTable jtable, Object o, boolean bln, boolean bln1, int i, int i1) { 
     int v = Integer.parseInt(o.toString()); 
     JProgressBar b = (JProgressBar) jtable.getModel().getValueAt(i, i1); 
     b.setValue(v); 
     return null; 
    } 

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

と進歩:でgetProgressがある

progress.add(getProgress(x, total)); 
d.addRow(new Object[]{category, "Initializing..", progress.get(work)}); 

1行3列目(JProgressB ar)。

オン: JProgressBar b =(JProgressBar)jtable.getModel()。getValueAt(i、i1); 私は

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.Integer cannot be cast to javax.swing.JProgressBar 

どこに問題がありますか?手伝って頂けますか?

+0

-1は、なぜあなたはにこだわっする予定がある場合は、何度も何度も同じ質問をしておくんとにかくあなたのエラー?最後の1回:DO。ない。 ADD。コンポーネント。に。きみの。モデル! – kleopatra

答えて

-2

をあなたはArrayListのを使用する場合ことができます:

public Component getTableCellRendererComponent(JTable jtable, Object o, boolean bln, boolean bln1, int i, int i1) { 
     int v = Integer.parseInt(o.toString()); 
     JProgressBar b = progress.get(i); 
     b.setValue(v); 
     return b; 
    } 
+0

-19)レンダラーを実装する方法ではなく(外部リストにアクセスして毎回新しいレンダリングコンポーネントを返す)、代わりに1つのレンダラーコンポーネントを使用して、それをparamによって与えられたデータで設定するb)ルックアップテーブルがソートされているかフィルタされている場合には破損します。 – kleopatra

+0

これは機能するユニークなメソッドです。 – JackTurky

4
JProgressBar b = (JProgressBar) jtable.getModel().getValueAt(i, i1); 

これはこのエラーを引き起こす行です。プログレスバーに整数をキャストしたいが、もちろん不可能である。このコードは、多くの点で何の意味もありません。 まず、getProgress(int x、int total)メソッドを失います。進行状況バーをjtableにしたい場合は、カスタムセルレンダラーを使用して正しく行いましたが、実際にプログレスバーをテーブルに追加する必要はありません。代わりに、整数を使用します。 次に、セルレンダラーで、その整数を使用してプログレスバーを表示します。 あなたのレンダラは、より次のようになります。

class ProgressBarRenderer extends JProgressBar implements TableCellRenderer { 

     public ProgressBarRenderer() { 
      setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1)); 
      setOpaque(true); 
     } 

     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      int progress = (Integer) value; 
      setValue(progress); 
      return this; 
     } 
    } 
+0

私は、プログレスバーを手動で追加する必要はないが、新しいProgressBarRendererをjtableのcoloumnに設定すると、プログレスバーはgetTableCellRendererComponentメソッドで自動的に設定されますか?私は同じ行の他のcoloumを追加する必要がある場合?私はこのように行を追加するd.addRow(新しいオブジェクト[] {Html.categoria、 "Inizio scansione"、新しいJProgressBar()}); – JackTurky

+0

はい、私はですが、どのように:d.addRow(新しいオブジェクト[] {Html.categoria、 "Inizio scansione"、新しいJProgressBar()}); "手動でプログレスバーを追加しないでください。私の投稿で言ったように、あなたは以下のような整数を使います:d.addRow(new Object [] {Html.categoria、 "Inizio scansione"、0}); レンダラーが残りの処理を行い、レンダラープログレスバーの値を0または他の値に設定します。 – Terraego