其他方法

时间:2018-01-01 15:42:53

标签: java swing invokeandwait

我面临一个非常烦人的问题。我正在开发一个库程序,当我做一个连续的动作时,我的书中的JTable中会出现一个意想不到的行。

行动是这样的:

  • 启动该计划
  • 根据评论添加过滤器(我有很多过滤器,它们是继承自RowFilter的类,它们都与JTable的RowSorter相关联。这部分程序运行正常)。 在最初的状态,JTable中有2本书,分别是“le livre de la jungle”和“Elogedesmathématiques”。使用过滤器后,只剩下一个“Elogedesmathématiques”。另一个未显示但仍在模型中。
  • 在JTable中选择剩下的书(“le livre de la jungle”)。使用调试器,我看到在此单击触发的操作期间,创建了一个带有空标题和作者的书。它不可见,但如果我
  • 停用所有过滤器,现在JTable中有3本书。 (2前一个加上具有虚拟值的“ghost”。)虚拟值来自一个方法saveChanges(),它保存当前字段。

这是程序的图片,带有功能区(北),字段(中心)和JTable(底部)。

here

你可以看到附加行,意外。

现在,让我们看一些代码:

当我点击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分钟或更长时间之后)。

谢谢

奥利弗

0 个答案:

没有答案