2

3列のJTableがあります。1.アイコン、2。ファイルまたはフォルダの名前、3。ファイルタイプまたは「フォルダ」。メソッド内でJLabel(背景+ png画像を設定)を使用してアイコンを描画しますgetTableCellRendererComponent。最初に、JLableの背景を「白」または「灰色」の交互に描画します。これらは、JTableSwingコンポーネントがテーブルを描画するために交互に使用する色だからです。これで、行を選択すると、アイコン(最初の列)の背景が行の残りの部分と同じように「濃い青」に再描画されません。実例となるスクリーンショット

これが私の質問です:

一般 1)行を強調表示するときにアイコンセルを強調表示するにはどうすればよいですか(ポインタで十分です。コードは必要ありません)。

明確

1.1)JLabelを使用する必要がありますか?なぜ私はただegできないのですか.SetValueAt("image.png",0,0)

1.2)試しましたgetColumnClass(...)が、特定の列のすべてのセルが再描画されているようです。それは期待されていますか?

ありがとう。

4

2 に答える 2

4

1.)は、呼び出されたときにパラメータをjavax.swing.table.TableCellRenderer取得します。(たとえば)から継承してオーバーライドすることでisSelected、簡単に独自の記述を行うことができます。オブジェクトを調整して、を返します。独自のレンダラーを使用すると、ブレークポイントを設定して、何が起こっているのかを実際に理解することもできます。TableCellRendererJLabelgetTableCellRendererComponentthis

1.1 + 1.2。)setValueAtgetColumnClassは両方ともモデルの一部であり、選択した背景の問題をおそらく解決しないでしょう。

使用する必要はありませんJLabel:リターンタイプを見ると、それが(でさえない)getTableCellRendererComponentことに気づきます。通常、レンダラーに必要なすべての機能があり、も使用するため、これは慣例だと思います。最大限の自由のために、私はあなたがあなた自身を使って書くことを勧めます、しかしこの場合あなたはおそらくそれをする必要はありません。ComponentJComponentJLabelDefaultTableCellRendererJLabelJComponentpaintComponent

于 2012-09-02T06:16:23.660 に答える
3

LAF(ニンバス?)でストライピング(白/灰色の交互の背景)が自動的に発生すると仮定すると、カスタムレンダラーは必要ありません。テーブルにはすでにIconおよびImageIconクラスに登録されたデフォルトのレンダラーがあります。tableModelが最初の列のcolumnClassとしてこれらのクラスの1つを返すことを確認し、自動化を楽しんでください:-)

簡単なコードスニペットは次のとおりです。

DefaultTableModel model = new DefaultTableModel(0, 2) {

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        if (columnIndex == 0) {
            return Icon.class;
        }
        return super.getColumnClass(columnIndex);
    }

};
File[] files = new File(".").listFiles();
FileSystemView fsv = FileSystemView.getFileSystemView();
for (File f : files) {
    model.addRow(new Object[] {fsv.getSystemIcon(f), fsv.getSystemDisplayName(f)});
}
JTable table = new JTable(model);
于 2012-09-02T08:01:40.077 に答える