列のヘッダーの 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 を使用したことがありますが、新しいスレッドを開始しなくても問題なく動作します。