我面临一个非常烦人的问题。我正在开发一个库程序,当我做一个连续的动作时,我的书中的JTable中会出现一个意想不到的行。
行动是这样的:
这是程序的图片,带有功能区(北),字段(中心)和JTable(底部)。
你可以看到附加行,意外。
现在,让我们看一些代码:
当我点击JTable的行时,我触发了这个方法:
table.getSelectionModel().addListSelectionListener(e -> {
if (!e.getValueIsAdjusting()) {
if (table.getSelectedRow() > -1) {
Book book = ((TableATM) table.getModel()).getBook(table
.convertRowIndexToModel(table.getSelectedRow()));
getStatesManager().getState().selectBook(book);
}
}
});
这将调用UnboundState类中的selectBook。窗口有2种状态:BoundState& UnboundState。字段为空时使用UnboundState。当字段包含书籍的数据时(例如,在带有ISBN的互联网上进行远程搜索后),它会立即保存并且状态将被绑定。
在我上面讨论的搜索之后,状态与初始状态保持一致,我的意思是UnboundState:搜索只更改JTable,而不是字段。
所以,UnboundState的selectBook被触发:
@Override
public void selectBook(Book book) {
statesManager.setBound(book);
}
setBound方法的目的是改变状态:
public void setBound(Book book) {
state = new BoundState(book, this, bookWindow,
new ChoiceISBNDialog(bookWindow));
}
这是由setBound调用的构造函数:
public BoundState(Book book, StatesManager statesManager,
BookWindow bookWindow, ChoiceISBNDialog choice) {
this.statesManager = statesManager;
this.bookWindow = bookWindow;
this.choice = choice;
SwingUtilities.invokeLater(() -> {
statesManager.enableFields(true);
if (statesManager.getState().getName().equals("BOUND"))
saveChanges();
statesManager.displayBook(book);
statesManager.setCaretsToZero();
bookWindow.ribbon.btn_revertChanges.setEnabled(false);
bookWindow.ribbon.btn_storeInTable.setEnabled(false);
});
}
重要的是不应该调用saveChanges(),因为调用invokeLater时的当前状态是“UNBOUND”。
但是当我调试程序时,我得到了这个:方法运行,遵循我给你的odrer,除了调试器没有进入invokeLater,它继续,方法完成,最后一个是JTable监听器。但是我在saveChanges()方法中放了一个断点,我看到在JTable的监听器结束后触发了saveChanges()方法。这是我假设的invokeLater的效果。但当时,状态变为“BOUND”,saveChanges方法认为实际上在字段中的书是新的并试图保存它。
我怎么能让它起作用?我试着调用invokeAndWait,但它冻结了程序(它肯定会停止,即使在1分钟或更长时间之后)。
谢谢
奥利弗