【问题标题】:Make header text bold when its column is selected in JTable在 JTable 中选择其列时使标题文本变为粗体
【发布时间】:2009-09-28 21:56:17
【问题描述】:

当我选择其列的单元格时,是否可以将标题文本变为粗体?怎么做?

谢谢 莱安德罗

【问题讨论】:

    标签: java swing jtable


    【解决方案1】:

    将自定义渲染器设置为表头。如果当前列被选中,则列设置字体为粗体。

    JTable table = new JTable()
    table.getTableHeader().setDefaultRenderer(new MyRenderer());
    
    class MyRenderer implements TableCellRenderer {
        //todo implement
    }
    

    【讨论】:

    • 我不知道为什么,但我的外观和感觉并不尊重它。我可以更改前景,但无法更改文字装饰。
    • 它是一个 CELL 渲染器。没有真正的 TableHeader 渲染器。请参阅下面的评论。
    • 表头使用 sun.swing.table.DefaultTableCellHeaderRenderer 渲染表头行中的每一列。不幸的是 sun.** 是私人 SUN 包。你需要像往常一样多作画才能见到 LaF。
    【解决方案2】:

    部分可能。您需要做的是编写您的模型,以便在表格的单元格选择中您的模型执行fireTableStructureChanges 方法(假设您使用AbstractTableModel 作为基础)。这将重新绘制整个表格,包括列标题。您所要做的就是保持选择了哪一列的状态。

    一开始我说“部分”可能。这是因为调用 fireTableStructureChanges 将重新验证整个表,您将丢失当前的列模型状态 - 列宽和序列。

    要使您的文本加粗,您可以使用 HTML - 例如<html><b>your text</b></html>,但它必须根据模型的内部状态动态更改

    更新:也可以直接设置列表标题文本,但模型更改或 tableStructureChanged 事件将使表从模型中重新读取。

    【讨论】:

    • 这不是正确的解决方案。您正在将模型和 UI 混合在一起。
    • 不一定。由于列名是从模型返回的 - 它们是模型的一部分。模型只需要以某种方式对选择更改做出反应。顺便说一句,您的解决方案会影响外观和感觉,因为您正在使用单元格渲染器来渲染头。据我所知,现在可以真正复制默认标题渲染器
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多