查看、 和中的代码AbstractButton
,我得出结论,在事件队列上发布了一个新事件,以显示禁用的按钮。
因此,查看您的代码,会发生以下事件,正如您所描述的:JComponent
RepaintManager
setEnabled()
EventQueue:
Event1: {
setEnabled(false) // queues Event2
showMessageDialog(null, "Done")
},
Event2: {
repaint() // to display the disabled button
}
相关代码如下:
抽象按钮
public void setEnabled(boolean b) {
// ...
super.setEnabled(b);
// ...
}
组件
public void setEnabled(boolean enabled) {
// ...
if (enabled != oldEnabled) {
repaint();
}
}
public void repaint(long tm, int x, int y, int width, int height) {
RepaintManager.currentManager(this).addDirtyRegion(this, x, y, width, height);
}
重绘管理器
public void addDirtyRegion(JComponent c, int x, int y, int w, int h)
{
// ...
addDirtyRegion0(c, x, y, w, h);
}
private void addDirtyRegion0(Container c, int x, int y, int w, int h) {
// ...
// Queue a Runnable to invoke paintDirtyRegions and
// validateInvalidComponents.
scheduleProcessingRunnable();
}
如果您希望在显示对话框之前将按钮显示为禁用,则正如@vikingsteve 指出的那样,解决方案是使用SwingUtilities.invokeLater()
.
extract.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
button1.setEnabled(false);
button2.setEnabled(false);
obj.showData();
obj.extractClassesPackagesImports();
obj.inheritanceRelation();
obj.doubleinheritanceRelation();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JOptionPane.showMessageDialog(null, "Done");
}
});
}
});