首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用行排序后的JTableHeader更新

禁用行排序后的JTableHeader更新
EN

Stack Overflow用户
提问于 2022-05-03 15:53:42
回答 1查看 53关注 0票数 1

我定制了一个带有TableCellRenderer过滤器图标的Jtable头,当用户点击过滤器图标时,就会出现像excel那样的弹出过滤器(图1)。但是,如果用户单击标题的文本,则应用行排序器。当应用行排序器(图2)时,它将覆盖自定义和筛选图标。是否有一种方法可以避免这种行为,同时将行排序器保留在表头上?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-05 14:13:01

您可以通过使用自定义表头来装饰表头的原始呈现器来实现这一点,这将添加所需的筛选图标。

例如,遵循一些代码来保留排序图标,同时在原始列标题旁边添加您自己的标签:

代码语言:javascript
复制
import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import java.util.Objects;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;

public class Main {
    
    private static class MyTableCellRenderer extends DefaultTableCellRenderer {
        
        private final TableCellRenderer originalRenderer;
        
        public MyTableCellRenderer(final TableCellRenderer originalRenderer) {
            this.originalRenderer = Objects.requireNonNull(originalRenderer);
        }

        @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) //The header will have a row equal to -1.
                return original;
            
            final JPanel container = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 0));
            final JLabel filtering = new JLabel("Filter", JLabel.CENTER); //Your icon should go in this label...
            
            //Put some fancy background to make the positioning of the label clear:
            filtering.setOpaque(true);
            filtering.setBackground(Color.CYAN);
            
            //The default renderer comes with a border... Let's apply the border to the whole new container:
            if (original instanceof JComponent) {
                container.setBorder(((JComponent) original).getBorder());
                ((JComponent) original).setBorder(null);
            }
            
            container.add(filtering);
            container.add(original);
            
            return container;
        }
    }
    
    private static void createAndShowGUI() {
        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", "Column3"});
        
        table.setAutoCreateRowSorter(true);

        final JTableHeader header = table.getTableHeader();
        header.setDefaultRenderer(new MyTableCellRenderer(header.getDefaultRenderer()));
        
        final JFrame frame = new JFrame("Table header");
        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(Main::createAndShowGUI);
    }
}

代替单词筛选器(出现在每个列标题上),您可以在创建的标签上使用图标。

参考文献:

  1. 来源 (参见小节: 3.保留排序图标)。
  2. 如何将控件放在JTableHeader of a JTable中?
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72102126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档