我想讓我的表格在單擊單元格時選擇整行(可以通過關閉列選擇來完成),但是,我不希望突出顯示您點擊的特定單元格周圍的額外厚邊框。我希望這將是容易的,但顯然它涉及渲染,所以我做了很多的研究,我可以得到最接近的是這樣的:Java - Swing - JTable - 爲選定行設置顏色,但不是單元格
JTable contactTable = new JTable(tableModel);
contactTable.setCellSelectionEnabled(true);
contactTable.setColumnSelectionAllowed(false);
contactTable.setRowSelectionAllowed(false);
contactTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// This renderer extends a component. It is used each time a
// cell must be displayed.
class MyTableCellRenderer extends JLabel implements TableCellRenderer {
// This method is called each time a cell in a column
// using this renderer needs to be rendered.
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) {
// 'value' is value contained in the cell located at
// (rowIndex, vColIndex)
if (isSelected) {
// cell (and perhaps other cells) are selected
}
if (hasFocus) {
// this cell is the anchor and the table has the focus
this.setBackground(Color.blue);
this.setForeground(Color.green);
} else {
this.setForeground(Color.black);
}
// Configure the component with the specified value
setText(value.toString());
// Set tool tip if desired
// setToolTipText((String)value);
// Since the renderer is a component, return itself
return this;
}
// The following methods override the defaults for performance reasons
public void validate() {}
public void revalidate() {}
protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}
public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}
}
int vColIndex = 0;
TableColumn col = contactTable.getColumnModel().getColumn(vColIndex);
col.setCellRenderer(new MyTableCellRenderer());
我從一個例子複製的渲染,只有改變了hasFocus()函數使用我想要的顏色。在中設置顏色什麼也沒做。
這段代碼的問題是:
它僅適用於在底部由vColIndex指定的一列。很顯然,我希望將其應用於所有列,以便單擊一個單元格可突出顯示整行。我可以做一個for循環將其更改爲每個單元格,但我認爲有一個更好的方法可以一次更改所有列的cellRenderer。
setForegroundColor()
可以改變文字,但setBackgroundColor()
對單元格背景沒有任何作用。我希望它可以像屬性所暗示的那樣改變背景顏色。- #2的解決方案:在分配backgroundcolor之前使用
this.setOpaque(true);
。
- #2的解決方案:在分配backgroundcolor之前使用
當渲染器確實工作時,它只能在單個單元上工作。我怎樣才能讓它爲行中的所有單元格着色?
- 解決方案#3:我想通了!如果您啓用行選擇(
table.setRowSelectionAllowed(true)
),而不是使用hasFocus()
(僅影響單個單元格),則將顏色更改爲if(isSelected)
語句。然後,整行被認爲是選中的,並將所有的單元格顏色化!
- 解決方案#3:我想通了!如果您啓用行選擇(
3是大的,但如果有誰知道#1爲什麼它被設計成只能在這將是大加讚賞時渲染器適用於一列能向我解釋。
感謝您的答覆。我試圖使用setSelectionBackground(Color),但Eclipse將其標記爲不存在的方法。 – Daniel 2012-04-04 20:02:58
其實我想到了那部分,我編輯了原文。 – Daniel 2012-04-04 20:13:53
我現在嘗試setSelectionBackGround方法,它的工作原理。當我選擇一行或多行時,其顏色會發生變化。但也許我明白你在找什麼。 – mbaydar 2012-04-04 20:21:42