[英]Highlight a cell in JTable with an Icon in it
我有一個3列的JTable。 1.圖標,2.文件或文件夾的名稱,3.文件類型或“文件夾”。 我在getTableCellRendererComponent
方法中使用JLabel(我設置了背景+ png圖像)繪制了Icon。 最初,我繪制JLable的“白色”或“灰色”的交替背景,因為這些是JTable
Swing組件交替繪制表的顏色。 現在,當我選擇一行時,與該行的其余部分一樣,圖標(第一列)的背景不會重繪為“深藍色”。
這是我的問題:
常規 1)在突出顯示一行時,如何還突出顯示Icon單元格(指針就足夠了,不需要代碼)?
具體
1.1)我必須使用JLabel嗎? 為什么我不能僅僅例如.SetValueAt("image.png",0,0)
1.2)我嘗試了getColumnClass(...)
但這似乎重繪了給定列中的所有單元格。 這是預期的嗎?
謝謝。
1.)調用javax.swing.table.TableCellRenderer
會獲得一個isSelected
參數。 您可以通過繼承JLabel
(例如)並覆蓋getTableCellRendererComponent
來輕松編寫自己的TableCellRenderer
:調整Object並返回this
。 擁有自己的渲染器還可以讓您設置斷點並真正了解正在發生的事情。
1.1 + 1.2。) setValueAt
和getColumnClass
都是模型的一部分,可能無法解決所選背景下的問題。
您不必使用JLabel
:如果查看getTableCellRendererComponent
的返回類型,您會注意到它是Component
(甚至不是JComponent
)。 我猜JLabel
只是習慣,因為它通常具有渲染器所需的所有功能,並且DefaultTableCellRenderer
也使用JLabel
。 為了獲得最大的自由度,我建議您使用JComponent
並編寫自己的paintComponent
,但是在這種情況下,您可能不必這樣做。
假設在LAF(Nimbus?)中自動發生條紋(背景為白色/灰色),則不需要自定義渲染器:該表已經為Icon和ImageIcon類注冊了默認渲染器。 確保您的tableModel返回其中一個類作為columnClass作為第一列,並享受自動操作:-)
這是一個快速的代碼片段:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.