繁体   English   中英

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

[英]ActionListener on JButton in JTable header freezes application

我有一个JTable,它使用JButton作为列标题之一。

如果没有ActionListener,则按钮似乎可以正常运行,我可以在视觉上看到它的单击。 但是,当我添加应弹出JOptionPane的ActionListener时,应用程序将停止重新绘制自身,停止响应任何操作,并且不会绘制选项窗格。

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。 这似乎是一个hack,但是,我在其他地方使用了JOptionPane,并且无需启动新线程即可正常工作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM