如何以编程方式改变jTable中的单元格?

问题描述 投票:0回答:1

我目前正在编写一个应用程序,在这个应用程序中,我向用户展示了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);
    }
}

where e 应该是一个事件,检查链接的条件是否满足,并执行相应的格式化。但是我现在不知道需要什么样的事件来传递给函数。

我在一篇文章中看到的另一种方法是 异文 是使用prepareRenderer方法来指定正确渲染内容的条件。然而,显然这似乎只适用于自己的JTable的实现,我想避免这种情况,因为 tblEntries.prepareRenderer() 并采用新的 TableCellRendererDefaultTableCellRenderer 并没有给我需要覆盖的功能,根据上面提到的SO文章。

那么,什么是最好的、最方便的方法来解决这个问题呢?先谢谢您的任何建议和帮助。


解决方法。

如果有人遇到类似的问题,我把我的解决方案放在这里。按照建议 @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的参考,请看下面接受的答案。

java formatting jtable tablecellrenderer
1个回答
1
投票

我想实现的是让链接的颜色至少是蓝色的,甚至更好的是下划线。

这是由渲染器控制的。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添加到表模型中。一个JLabel可以显示简单的HTML。

因此,您添加到模型中的文本将是这样的。

String text = "<html><u><font color=blue>the link goes here</font></ul></html>";
© www.soinside.com 2019 - 2024. All rights reserved.