Как добавить слушатель мыши к компоненту в настраиваемом визуализаторе ячейки заголовка JTable - PullRequest
2 голосов
/ 30 сентября 2011

Я реализовал пользовательский рендерер ячейки заголовка, который используется экземпляром 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;
    }
}

Когда я нажимаю «Кнопка булавки», диалоговое окно сообщения не появляется, вместо этого происходит только сортировка. Обратите внимание, что соответствующий экземпляр JTable использует setAutoCreateRowSorter (true) ;. Может ли это быть причиной того, что кнопка не получает никаких событий mousePressed?

1 Ответ

7 голосов
/ 30 сентября 2011

Обратите внимание, что соответствующий экземпляр JTable использует setAutoCreateRowSorter (true).Может ли это быть причиной того, что кнопка не получает никаких событий mousePressed?

Это не проблема.

Средство визуализации НЕ является реальным компонентом.Это всего лишь рисование компонента, поэтому он не может получать события.

Если вы хотите обрабатывать mouseEvents, вам нужно добавить MouseListener в заголовок таблицы.Затем вам нужно преобразовать указатель мыши в соответствующий столбец заголовка таблицы, а затем выполнить обработку.

...