0

我有一个 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,它可以在不启动新线程的情况下正常工作。

4

1 回答 1

1

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

于 2012-01-24T05:48:34.687 回答