0

列のヘッダーの 1 つに JButton を使用する JTable があります。

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 を作成するとうまくいくようです。これはハックのようですが、他の場所で JOptionPane を使用したことがありますが、新しいスレッドを開始しなくても問題なく動作します。

4

1 に答える 1

1

SwingUtilities.invokeLater() 内で JOptionPane を呼び出してみてください

于 2012-01-24T05:48:34.687 に答える