jtableで行の背景色を変更する
-
28-09-2019 - |
質問
3列のJtableがあります。私は設定しました TableCellRenderer
このような3つの列すべてについて(たぶんそれほど効果的ではありませんか?)。
for (int i = 0; i < 3; i++) {
myJTable.getColumnModel().getColumn(i).setCellRenderer(renderer);
}
getTableCellRendererComponent()
各行のランダムな背景色のコンポーネントを返します。
プログラムの実行中に、背景を他のランダムな色に変更するにはどうすればよいですか?
解決
1つの方法は、モデル内の各行の現在の色を保存することです。これは、3列と3行で固定された単純なモデルです。
static class MyTableModel extends DefaultTableModel {
List<Color> rowColours = Arrays.asList(
Color.RED,
Color.GREEN,
Color.CYAN
);
public void setRowColour(int row, Color c) {
rowColours.set(row, c);
fireTableRowsUpdated(row, row);
}
public Color getRowColour(int row) {
return rowColours.get(row);
}
@Override
public int getRowCount() {
return 3;
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public Object getValueAt(int row, int column) {
return String.format("%d %d", row, column);
}
}
ご了承ください setRowColour
電話 fireTableRowsUpdated
;これにより、テーブルのその行が更新されます。
レンダラーはテーブルからモデルを取得できます。
static class MyTableCellRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
MyTableModel model = (MyTableModel) table.getModel();
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
c.setBackground(model.getRowColour(row));
return c;
}
}
行の色を変更することは、次のように簡単です。
model.setRowColour(1, Color.YELLOW);
他のヒント
リチャード・フィアンの答えの履歴書、各2行を灰色にするために:
jTable.setDefaultRenderer(Object.class, new DefaultTableCellRenderer()
{
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
final Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
c.setBackground(row % 2 == 0 ? Color.LIGHT_GRAY : Color.WHITE);
return c;
}
});
ここで与えられる他の回答は、すべての列で同じレンダラーを使用するため、うまく機能します。
ただし、一般にJTableを使用すると、各コロンに異なるタイプのデータがあるため、各列に同じレンダラーを使用しないと信じています。これらの場合、あなたはそれを見つけるかもしれません テーブルロウレンダリング 役立つアプローチ。
これは基本的にテーブルを塗り直すのと同じくらい簡単です。ただし、1つの行/列/セルのみを選択的に塗り直す方法は見つかりませんでした。
この例では、ボタンをクリックすると、列の背景色が変更され、塗り直しを呼び出します。
public class TableTest {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final Color[] rowColors = new Color[] {
randomColor(), randomColor(), randomColor()
};
final JTable table = new JTable(3, 3);
table.setDefaultRenderer(Object.class, new TableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
JPanel pane = new JPanel();
pane.setBackground(rowColors[row]);
return pane;
}
});
frame.setLayout(new BorderLayout());
JButton btn = new JButton("Change row2's color");
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
rowColors[1] = randomColor();
table.repaint();
}
});
frame.add(table, BorderLayout.NORTH);
frame.add(btn, BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
}
private static Color randomColor() {
Random rnd = new Random();
return new Color(rnd.nextInt(256),
rnd.nextInt(256), rnd.nextInt(256));
}
}
通話 getTableCellRendererComponent(...)
レンダラーが求められるセルの値が含まれています。
その値を使用して色を計算できます。 AbstractTableModelも使用している場合は、レンダラーに任意のタイプの価値を提供できます。
色ができたら、できます setBackground()
あなたが返しているコンポーネントで。