簡體   English   中英

突出顯示JTable中帶有圖標的單元格

[英]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。) setValueAtgetColumnClass都是模型的一部分,可能無法解決所選背景下的問題。

您不必使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM