我有一个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);
}
}
有人知道是什么原因导致了这个问题吗?
edit:在actionPerformed方法中创建一个新线程并在中创建JOptionPane似乎很有效。这看起来像是一个破解,然而,我在其他地方使用过JOptionPane,它在不启动新线程的情况下运行良好。
尝试调用SwingUtilities内部的JOptionPane.invokeLater()