Java JTable标头中JButton上的ActionListener冻结应用程序

Java JTable标头中JButton上的ActionListener冻结应用程序,java,swing,jtable,jbutton,jtableheader,Java,Swing,Jtable,Jbutton,Jtableheader,我有一个JTable,它使用JButton作为列的一个标题 如果没有ActionListener,按钮似乎可以正常工作,我可以看到它在视觉上单击。但是,当我添加一个ActionListener时,它会弹出一个JOptionPane,应用程序会停止重新绘制自身,停止响应任何操作,并且不会绘制选项窗格 public class ButtonHeaderRenderer extends JButton implements TableCellRenderer, ActionListener {

我有一个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,它可以正常工作,无需启动新线程。

尝试在SwingUtilities.invokeLater()中调用JOptionPane。

您尝试过在没有TableCellRenderer的情况下运行ActionListener,因为有时会出现一些问题。我不是专家,但试着测试一下,这可能会缩小你的搜索范围。RegardsActionListener在未从表标题中的按钮调用时工作正常。我在表格单元格中有按钮,它们能够正确使用同一个侦听器。您是否进行了线程转储以查看是什么阻止了您的应用程序?例如,通过使用jstack或jconsole,为了更快地获得更好的帮助,在呈现组件上发布一个.actionListener是没有意义的:它们只是被动标记,从来不是层次结构的一部分。如果你不这么想,奇怪的事情肯定会发生。。。就是不要。。基本问题是渲染器的错误使用(无论是否调用,没有人希望在每个标题重新绘制时看到optionPane;-)