【问题标题】:Jtable RowSorter IconJtable RowSorter 图标
【发布时间】:2013-01-28 12:21:43
【问题描述】:

我有一个使用 RowSorter(Java 1.6) 的 JTable,我使用的是在 Java 中未添加 RowSorter 时使用 Java 1.4 实现的外观。现在我的问题是:当我点击表格标题时,表格被排序,但表格标题上没有出现 RosSorter 图标。我以某种方式需要那个图标,我无法升级现有的外观和感觉。有什么帮助吗?

【问题讨论】:

  • 发一个SSCCE,简短,可运行,可编译,就是JScrollPane里面有JTable(硬编码值)的JFrame,有少数用户可以在JDK1.4.xxx中编译跨度>
  • 基本上,您需要为显示图标的标题修补渲染器。
  • “我正在使用使用 Java 1.4 实现的外观” 您指的是公开可用的第 3 方 PLAF?它是哪个PLAF?
  • @kleopatra:怎么做...请解释一下.....
  • @Andrew:我在一个组织实习,包含外观类的 jar 是该组织的私有财产。

标签: java swing icons jtable tablerowsorter


【解决方案1】:

基本的方法是封装 LAF 提供的渲染器,让它配置渲染组件,另外让它根据需要绘制一个排序图标。比如:

final TableCellRenderer r = table.getTableHeader().getDefaultRenderer();
TableCellRenderer wrapper = new TableCellRenderer() {

    @Override
    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus,
            int row, int column) {
        Component comp = r.getTableCellRendererComponent(table, value, isSelected, 
            hasFocus, row, column);
        if (comp instanceof JLabel) {
            JLabel label = (JLabel) comp;
            label.setIcon(getSortIcon(table, column));
        }
        return comp;
    }

    /**
     * Implements the logic to choose the appropriate icon.
     */
    private Icon getSortIcon(JTable table, int column) {
        SortOrder sortOrder = getColumnSortOrder(table, column);
        if (SortOrder.UNSORTED == sortOrder) {
            return null;
        }
        return SortOrder.ASCENDING == sortOrder ? ascendingIcon : descendingIcon;
    }

    private SortOrder getColumnSortOrder(JTable table, int column) {
        if (table == null || table.getRowSorter() == null) {
            return SortOrder.UNSORTED;
        }
        List<? extends SortKey> keys = table.getRowSorter().getSortKeys();
        if (keys.size() > 0) {
            SortKey key = keys.get(0);
            if (key.getColumn() == table.convertColumnIndexToModel(column)) {
                return key.getSortOrder();
            }
        }
        return SortOrder.UNSORTED;
    }

};
table.getTableHeader().setDefaultRenderer(wrapper);

这是最简单的情况,如果渲染组件是一个 JLabel 并且不以其他方式使用其图标属性,则可以工作。

【讨论】:

  • 只有一个疑问:在代码中,你只是设置了图标,但是图标是如何被替换或移动的?
  • 很高兴它起作用了,女士 :-) 您可能会考虑支持/接受答案,只是说......不明白您的第二条评论:图标设置为任一排序图标或 null(又名:替换为无)
猜你喜欢
  • 2011-06-14
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
  • 2016-03-05
  • 2023-03-08
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
相关资源
最近更新 更多