Пропускать события в пользовательских JTable - PullRequest
2 голосов
/ 20 мая 2009

Привет, у меня есть класс с именем ColorChooser (в пакете net.java.dev.colorchooser.ColorChooser)

Это пользовательский компонент, используемый для выбора цветов. Я хочу отобразить JTable с ColorChoosers во втором столбце. Итак, я создал свой собственный TableCellRenderer, и он работает:

@SuppressWarnings("serial")
class ColorChooserTableRenderer extends DefaultTableCellRenderer {

    public static List<ColorChooser> colors;

    public ColorChooserTableRenderer(int rows) {
        colors = new ArrayList<ColorChooser>(rows);
        for (int i = 0; i<rows ; i ++) {
            colors.add(new ColorChooser());
        }
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        return colors.get(row);
    }

}

Я регистрирую это в своей таблице:

JTable t = new JTable(5,3);
t.getColumn(t.getColumnName(1)).setCellRenderer(new ColorChooserTableRenderer(5));

Дисплей хороший. Он даже отображает всплывающую подсказку ColorChoosers, когда я наводю указатель мыши на одну из них. Проблема в том, что ColorChoosers не получают MouseEvents.

Обычно, когда вы нажимаете и удерживаете мышь на ColorChooser, вы получаете всплывающее окно, которое вы можете использовать для выбора цвета. Когда в JTable компонент ColorChooser не получает событие мыши.

Какие-нибудь решения?

Редактировать: вопрос может быть легко изменен на это:

Не могли бы вы привести небольшой пример таблицы, содержащей JButtons во втором столбце, которая действительно работает? Вы знаете, кнопки, которые можно нажимать?

Ответы [ 2 ]

3 голосов
/ 20 мая 2009

Это звучит смутно знакомо, поскольку я использовал средства визуализации ячеек таблицы для других целей.

Насколько я понимаю, TableCellRenderer используется только для визуализации компонента; компонент фактически не существует в каждой из ячеек.

Так что вам, вероятно, придется каким-то образом перенаправлять события мыши из самой JTable в ColorChooser.

edit: p.s., см. мой вопрос - также для пользовательского рендеринга ячейки таблицы вам нужен только 1 экземпляр самого компонента для всего столбца, если столбец отображается с той же логикой. Не сохраняйте постоянное состояние в TableCellRenderer, вместо этого сохраняйте его в TableModel и используйте это состояние непосредственно перед визуализацией при обработке вызова getTableCellRendererComponent().

2 голосов
/ 20 мая 2009

Рендерер только рисует компонент на экране и не допускает взаимодействия. Вам также нужно реализовать TableCellEditor . Рекомендуется, чтобы вы унаследовали AbstractCellEditor , и вы сэкономите некоторую работу. Посмотрите учебник по Java для таблиц.

Пример:

public class MyTableCellRenderer implements TableCellRenderer
{
    private JButton button = new JButton("Press Me");
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        return button;
    }
}

public class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor
{
    private JButton button;

    public MyTableCellEditor()
    {
        button = new JButton("Press Me");
        button.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e) {
                System.out.println("buttonPressed");
            }
        });
    }
    public Object getCellEditorValue() {
        return null;
    }
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        return button;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...