簡體   English   中英

如何以編程方式更改 jTable 中的單元格

[英]How to change a cell in a jTable programmatically

我目前正在編寫一個應用程序,我在其中向用戶展示 JTable 中網站的鏈接。 我已經正確設置了我的 JTable 以在單擊相關單元格時打開相應的網站。 但是,我很難正確格式化單元格,以便用戶知道他們實際上有可能單擊單元格以立即打開網站。

因此,我想要實現的是使鏈接的顏色至少為藍色,甚至更好地加下划線。 我搜索了關於 SO 的不同文章,但無法完全理解那里解釋的東西是如何協同工作的——盡管我不完全確定這些東西是否會是我真正想要的東西。

我填寫表格的方式如下:

String[][] rowData = new String[entries.size() + 1][entries.get(0).length + 1];


rowData[0] = columnNames;

int i = 1;

Iterator<String[]> iterator = entries.iterator();
while (iterator.hasNext()) {
    rowData[i] = iterator.next();
    i++;
}

tblEntries = new JTable(rowData, columnNames);

在這種情況下, entries是由數據庫處理程序傳遞的 ArrayList,並且 - 顧名思義 - 包含表的所有條目。 在將 ArrayList 讀入相應的數組后,我初始化表,如最后一行所示。 現在所有鏈接實際上都存儲在所有行 > 0 和第 4 列中。

我的第一種方法是這樣做:

for (int j = 0; j < entries.size(); j++) {
    for (int j2 = 0; j2 < entries.get(0).length; j2++) {
        tblEntries.editCellAt(row, column, e);
    }
}

其中e應該是檢查鏈接條件是否滿足並相應地執行格式化的事件。 但是我現在真的不知道需要什么樣的事件才能將它傳遞給 function。

我在另一篇 SO 文章中看到的另一種方法是使用 prepareRenderer 方法來指定正確呈現內容的條件。 然而,顯然這似乎只適用於自己的 JTable 實現,我想避免,因為tblEntries.prepareRenderer()並應用新的TableCellRendererDefaultTableCellRenderer並沒有給我 function 我需要根據上面提到的覆蓋所以文章。

那么,解決這個問題的最好和最方便的方法是什么? 提前感謝您的任何建議和幫助。


解決方案:

對於任何面臨類似問題的人,我會將我的解決方案放在這里。 正如@camickr所建議的那樣,最好的解決方案是自定義DefaultTreeCellRenderer在這種特定情況下的問題是,它還會以鏈接格式呈現特定的表頭(顯然不包含任何鏈接)。 因此,我進一步搜索並找到了這個網站,在那里我找到了一個工作代碼,用於自定義應在何處應用渲染器。

最后我想出了這個代碼:

String[][] rowData = new String[entries.size() + 1][entries.get(0).length + 1];


rowData[0] = columnNames;

int i = 1;

Iterator<String[]> iterator = entries.iterator();
while (iterator.hasNext()) {
    rowData[i] = iterator.next();
    i++;
}

tblEntries = new JTable(rowData, columnNames) {
    @Override
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
        Component c = super.prepareRenderer(renderer, row, column);

        if (row > 0 && column == 4) {
            c = super.prepareRenderer(new LinkRenderer(), row, column);
        }

        return c;
    }
};

有關 LinkRenderer 的參考,請參閱下面接受的答案。

我想要實現的是使鏈接的顏色至少為藍色,甚至更好地加下划線。

這是由渲染器控制的。 JTable 的默認渲染器是 JLabel。

您可以輕松創建自定義渲染器以藍色顯示文本:

DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
renderer.setForeground( Color.BLUE );
table.getColumnModel().getColumn(3).setCellRenderer( renderer );

不幸的是,在文本下划線會更加困難。 可以通過設置 Font 的屬性來實現組件中的文本下划線,這對於 JLabel 來說很容易做到:

JLabel label = new JLabel("Underlined label");
Font font = label.getFont();
Map<TextAttribute, Object> map = new HashMap<TextAttribute, Object>();
map.put(TextAttribute.FONT, font);
map.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
font = Font.getFont(map);
label.setFont(font);

但是,您不能只為渲染器設置字體,因為當渲染每個單元格時,默認渲染器會將字體重置為表格使用的字體。

所以如果你想用自定義字體實現自定義渲染器,你需要擴展 DefaultTableCellRenderer 並重寫getTableCellRendererComponent(….)方法。 代碼可能類似於:

class LinkRenderer extends DefaultTableCellRenderer
{
    private Font underlineFont;

    public LinkRenderer()
    {
        super();
        setForeground( Color.BLUE );

        underlineFont = .getFont();
        Map<TextAttribute, Object> map = new HashMap<TextAttribute, Object>();
        map.put(TextAttribute.FONT, underlineFont);
        map.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
        underLinefont = Font.getFont(map);
    }

    @Override
    public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        setFont( underlineFont );

        return this;
    }
}

閱讀有關渲染器和編輯器的 Swing 教程中的部分以獲取更多信息。

所以另一種方法是不使用自定義渲染器,而是可以將 HTML 添加到表 model 中。 JLabel 可以顯示簡單的 HTML。

因此,您添加到 model 的文本將類似於:

String text = "<html><u><font color=blue>the link goes here</font></ul></html>";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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