ActionListener на JButton в заголовке JTable замораживает приложение

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

Без ActionListener кнопка, кажется, работает нормально, я вижу, как она визуально щелкает. Однако, когда я добавляю ActionListener, который должен отображать JOptionPane, приложение перестает перерисовывать себя, перестает реагировать на любые действия и не рисует панель параметров.

public class ButtonHeaderRenderer extends JButton implements TableCellRenderer, ActionListener
{
    int pushedColumn;

    public ButtonHeaderRenderer(Icon image, JTableHeader header, ActionListener actionListener)
    {
        pushedColumn = -1;
        setIcon(image);
        setForeground(header.getForeground());
        setBackground(header.getBackground());
        setBorder(UIManager.getBorder("TableHeader.cellBorder"));
        setMargin(new Insets(0, 0, 0, 0));
        addActionListener(this);
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        setText((value == null) ? "" : value.toString());
        boolean isPressed = (column == pushedColumn);
        getModel().setPressed(isPressed);
        getModel().setArmed(isPressed);
        return this;
    }

    public void setPressedColumn(int col)
    {
        this.pushedColumn = col;
    }

    public void actionPerformed(ActionEvent e)
    {
        JOptionPane.showMessageDialog(null, "alert", "alert", JOptionPane.ERROR_MESSAGE);
    }
}

Кто-нибудь знает, что может быть причиной проблемы?

редактировать: кажется, что создание нового потока в методе actionPerformed и создание JOptionPane в этом работает. Однако это похоже на взлом, я использовал JOptionPane в других местах, и он отлично работает, не запуская новый поток.


person Lithium    schedule 23.01.2012    source источник
comment
Вы пытались запустить свой ActionListener без TableCellRenderer, так как иногда это вызывает некоторые проблемы. Я не эксперт, но попробуйте проверить это, это может сузить ваш поиск. С Уважением   -  person nIcE cOw    schedule 23.01.2012
comment
ActionListener отлично работает, когда он не вызывается с помощью кнопки в заголовке таблицы. У меня есть кнопки в ячейках таблицы, и они могут правильно использовать один и тот же слушатель.   -  person Lithium    schedule 24.01.2012
comment
Вы взяли дамп потока, чтобы увидеть, что блокирует ваше приложение? Например, используя jstack или jconsole.   -  person Robin    schedule 24.01.2012
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 24.01.2012
comment
actionListener в компоненте рендеринга не имеет смысла: это просто пассивные штампы, никогда не являющиеся частью иерархии. Если вы считаете иначе, странные вещи обязательно произойдут... просто не делайте этого.   -  person kleopatra    schedule 24.01.2012
comment
@Lithium: Рад, что что-то сработало для вас. С Уважением   -  person nIcE cOw    schedule 25.01.2012


Ответы (1)


Попробуйте вызвать JOptionPane внутри SwingUtilities.invokeLater()

person StanislavL    schedule 24.01.2012
comment
nononono .. основная проблема заключается в неправильном использовании средства визуализации (никто не хочет видеть optionPane при каждой перерисовке заголовка, вызванной или нет ;-) - person kleopatra; 24.01.2012