Java 如何将鼠标侦听器添加到自定义JTable头单元渲染器中的组件

Java 如何将鼠标侦听器添加到自定义JTable头单元渲染器中的组件,java,swing,events,header,jtable,Java,Swing,Events,Header,Jtable,我实现了一个由JTable实例使用的自定义头单元渲染器 private final class TableHeaderCellRenderer extends DefaultTableCellRenderer { private static final long serialVersionUID = 6288512805541476242L; public TableHeaderCellRenderer() { setHorizontalAlignment(C

我实现了一个由JTable实例使用的自定义头单元渲染器

private final class TableHeaderCellRenderer extends DefaultTableCellRenderer {
    private static final long serialVersionUID = 6288512805541476242L;

    public TableHeaderCellRenderer() {
        setHorizontalAlignment(CENTER);
        setHorizontalTextPosition(LEFT);
        setVerticalAlignment(BOTTOM);
        setOpaque(false);
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        setIcon(getIcon(table, column));

        JPanel headerContainer = new JPanel();
        headerContainer.setLayout(new BorderLayout());
        headerContainer.setBorder(UIManager.getBorder("TableHeader.cellBorder"));

        Box buttonBox = Box.createHorizontalBox();

        JButton pinButton = new JButton();
        pinButton.setOpaque(false);
        pinButton.setMaximumSize(new Dimension(16, 16));
        pinButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                JOptionPane.showMessageDialog(null, "ASD");
            }
        });

        buttonBox.add(pinButton);

        headerContainer.add(this, BorderLayout.CENTER);
        headerContainer.add(buttonBox, BorderLayout.EAST);

        return headerContainer;
    }
}
当我单击“Pin按钮”时,消息对话框不会出现,而只会进行排序。请注意,相应的JTable实例使用setAutoCreateRowSorter(true);。这可能是按钮未接收任何鼠标按下事件的原因吗

请注意,相应的JTable实例使用setAutoCreateRowSorter(true)。这可能是按钮未接收任何鼠标按下事件的原因吗

这不是问题所在

渲染器不是真实的组件。它只是一个组件的绘制,因此无法接收事件


如果要处理mouseEvents,则需要将MouseListener添加到表头。然后,您需要将鼠标点转换为适当的表头列,然后进行处理。

+1非常好的解释,@jilt3d示例用于该Hmm,因此渲染器只是。。。比如说。。。图形?我需要通过鼠标指针的坐标来分配它?知道这一点很有趣。谢谢你的解释。