カスタムTableCellRendererが機能していない(テーブルロウレンダリング)
-
29-09-2019 - |
質問
私は私のjtableの特定の行をレンダリングしようとしています(それは異なる背景色を持つ必要があり、それは太字の文字が必要です)。
カスタムを実装する方法に関するいくつかの質問を見つけました TableCellRenderer
(ここ と ここ)およびチュートリアル テーブルの使用方法 そしてこれ(テーブルロウレンダリング).
私はaを使用しています JInternalFrame
を表示します JTable
. 。私は両方のソリューションを実装しようとしましたが、どちらも実装しようとしました getCellRenderer
または prepareRenderer
呼ばれています。デバッグ時には、新しいJTableが作成されているのがわかりますが、メソッド内のブレークポイントは呼び出されません。
私のコードは次のように見えます:
this.add(createData(model));
private JComponent createData(ProfitLossTableModel model) {
JTable table = new JTable(model) {
public TableCellRenderer getCellRenderer(int row, int column) {
if ((row == 0) && (column == 0)) {
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
renderer.setHorizontalAlignment(JLabel.RIGHT);
renderer.setBackground(Color.red);
return renderer;
} else {
return super.getCellRenderer(row, column);
}
}
};
table.setPreferredScrollableViewportSize(table.getPreferredSize());
table.changeSelection(0, 0, false, false);
table.setAutoCreateRowSorter(true);
return new JScrollPane(table);
}
ご覧のとおり、モデルは私の実装です AbstractTableModel
.
もちろん、私は何かが足りないということです。電話しようとしました repaint()
何かが起こったかどうかを確認しますが、何も起こりませんでした。
また、jinternalframeの中にJPaneを入れようとしましたが、Jscrollpaneを追加しましたが、何も発生しませんでした。
何か助けがありますか?
ティア、
ボブ
解決
議論されているように 概念:編集者とレンダラー, 、「テーブルはテーブルモデルを呼び出します getColumnClass
メソッド、列のセルのデータ型を取得します。」 AbstractTableModel
これで示唆されているように、適切な値を返します 例.
補遺:
列ではなく、列をレンダリングしようとしています。
ロブ・カミックの テーブルロウレンダリング オーバーライドするアプローチ prepareRenderer()
適切なようです。
tabbedPane.addTab("FirstRow", createFirstRow(model));
...
private JComponent createFirstRow(DefaultTableModel model) {
final Font font = new Font("Serif", Font.BOLD, 14);
JTable table = new JTable(model) {
public Component prepareRenderer(
TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
if (!isRowSelected(row)) {
c.setBackground(row == 0 ? Color.yellow: getBackground());
c.setFont(row == 0 ? font : getFont());
}
return c;
}
};
table.setPreferredScrollableViewportSize(table.getPreferredSize());
table.changeSelection(1, 1, false, false);
return new JScrollPane(table);
}