我目前正在编写一个应用程序,在这个应用程序中,我向用户展示了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()
并采用新的 TableCellRenderer
或 DefaultTableCellRenderer
并没有给我需要覆盖的功能,根据上面提到的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的参考,请看下面接受的答案。
我想实现的是让链接的颜色至少是蓝色的,甚至更好的是下划线。
这是由渲染器控制的。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>";