【问题标题】:Hide sort arrow after change header label [duplicate]更改标题标签后隐藏排序箭头[重复]
【发布时间】:2022-07-29 07:11:54
【问题描述】:

我使用 JTable,这里是我使用时的样子

如您所见,它的显示排序箭头。好的。现在我想在按此列过滤时更改标题的颜色。我使用这段代码:

private void refreshColumnHeader() {
        // model column \"Added on\" index always = 2
        JLabel blueLabel = new JLabel(m2DocumentsTableModel.getColumnName(modelColumnIndex), JLabel.CENTER);
        blueLabel.setFont(new Font(\"SansSerif\", Font.PLAIN, 12));
        blueLabel.setBorder(headerBorder);
        TableCellRenderer tableCellRenderer = new JComponentTableCellRenderer();
        TableColumnModel columnModel = m2DocumentsTableView.getColumnModel();
        TableColumn columnAddedOn = columnModel.getColumn(vColIndex);
        if (modelColumnIndex == 1) { // column \"Added On\"
            if (!dateTimeFilter.hasFilter()) {
                blueLabel.setForeground(foregroundTableHeaderNotFilter);
            } else {
                blueLabel.setForeground(foregroundTableHeaderFilter);
            }
        }
        columnAddedOn.setHeaderRenderer(tableCellRenderer);
        columnAddedOn.setHeaderValue(blueLabel);
    }

但是现在箭头是隐藏的。

  • javadoc设置标题渲染器:渲染排序指示器是标题渲染器的职责。如果您使用排序并指定渲染器,您的渲染器必须渲染排序指示。

标签: java swing jtable


【解决方案1】:

这可以通过实现自定义TableCellRenderer 来完成。特别是通过将默认标题渲染器包装在自定义TableCellRenderer 中并在检测到对该列进行排序时使用所需的前景色修改它来重用默认标题渲染器(因为排序图标、颜色和标签)将很有用:

import java.awt.Color;
import java.awt.Component;
import java.util.List;
import java.util.Objects;
import javax.swing.DefaultRowSorter;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.RowSorter.SortKey;
import javax.swing.SortOrder;
import javax.swing.SwingUtilities;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

public class SortedRowHeaderRendererDemo {
    
    private static class SortedRowHeaderRenderer implements TableCellRenderer {
        
        private final TableCellRenderer originalRenderer;
        private Color originalForeground;
        
        public SortedRowHeaderRenderer(final TableCellRenderer originalRenderer) {
            this.originalRenderer = Objects.requireNonNull(originalRenderer);
            originalForeground = null;
        }

        @Override
        public Component getTableCellRendererComponent(final JTable table,
                                                       final Object value,
                                                       final boolean isSelected,
                                                       final boolean hasFocus,
                                                       final int row,
                                                       final int column) {
            final Component original = originalRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            
            if (row < 0 && original instanceof JComponent) {
                final JComponent originalJComponent = (JComponent) original;
                if (originalForeground == null)
                    originalForeground = originalJComponent.getForeground();
                Color fg = originalForeground;
                final RowSorter<?> sorter = table.getRowSorter();
                if (sorter instanceof DefaultRowSorter) {
                    final List<? extends SortKey> keys = sorter.getSortKeys();
                    if (!keys.isEmpty()) {
                        final SortKey k = keys.get(0); /*The first key is the most
                        significant one for sorting, ie the last selected sorting column.*/
                        if (k.getColumn() == table.convertColumnIndexToModel(column)) {
                            final SortOrder order = k.getSortOrder();
                            if (SortOrder.ASCENDING.equals(order))
                                fg = Color.RED;
                            else if (SortOrder.DESCENDING.equals(order))
                                fg = Color.GREEN;
                            //Don't forget here that there are also 'SortOrder.UNSORTED' and 'null' values for 'order'!
                        }
                    }
                }
                originalJComponent.setForeground(fg);
            }
            
            return original;
        }
    }
    
    private static void createAndShowGUI() {
        
        final String addedOnColumn = "Added on";
        
        final JTable table = new JTable(new Object[][] {
            new Object[]{"Data001", "Data002", "Data003"},
            new Object[]{"Data011", "Data012", "Data013"},
            new Object[]{"Data021", "Data022", "Data023"},
            new Object[]{"Data031", "Data032", "Data033"},
            new Object[]{"Data041", "Data042", "Data043"}
        }, new Object[] {"Column1", "Column2", addedOnColumn});
        
        table.setAutoCreateRowSorter(true);

        final TableColumn col = table.getColumn(addedOnColumn);
        col.setHeaderRenderer(new SortedRowHeaderRenderer(table.getTableHeader().getDefaultRenderer()));
        
        final JFrame frame = new JFrame("Table renderer demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new JScrollPane(table));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    
    public static void main(final String[] args) {
        SwingUtilities.invokeLater(SortedRowHeaderRendererDemo::createAndShowGUI);
    }
}

特征:

一个特性(或者更确切地说是错误修复)是该代码也适用于启用了列重新排序的表。

限制:

  1. 包装后的TableCellRenderer 必须返回JComponent 才能设置其前景属性,该属性应该是文本的颜色。例如支持返回JLabels 的TableCellRenderers(如DefaultTableCellRenderers)。但是,如果使用预安装或默认渲染器,情况似乎就是这样。
  2. 表的RowSorter 必须是DefaultRowSorter 类型(例如TableRowSorter),以便确定列是否已排序以及它的排序顺序。那是因为RowSorter 类没有做出任何保证,因为我检查了它的getSortKeys 方法返回的SortKeys 的顺序。另一方面,DefaultRowSorter 保证“排序是根据当前的 SortKeys 完成的,为了" (我假设 SortKeys 由 getSortKeys 方法返回的顺序在这里隐含)。默认情况下,JTable 虽然似乎已经创建了一个 DefaultRowSorter

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 2011-12-06
    • 2021-06-10
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多