【问题标题】:Making the "Calling method" wait for the "Return" of data使“调用方法”等待数据的“返回”
【发布时间】:2014-11-10 10:50:56
【问题描述】:

我有 2 个类,一个类是 JFrame (MainUIHolder.java),另一个类是 JDialog (EditValuationsDialog.java)。 MainUIHolder 可以在按钮点击事件中调用 EditValuationsDialog

EditValuationsDialog 打开后,用户可以在其字段中输入数据并按其“添加”按钮。好的,现在问题来了。一旦用户按下“添加”按钮,EditValuationsDialog 应该通知MainUIHolder

下面是代码。

MainUIHolder

  Action edit = new AbstractAction()
    {
          public void actionPerformed(ActionEvent e)
          {
              JTable table = (JTable)e.getSource();
              int rowNum = Integer.valueOf(e.getActionCommand());
              Object valueAt = table.getModel().getValueAt(rowNum, 0);

              EditValuationsDialog edit = new EditValuationsDialog(null,true);
              edit.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
              edit.setTitle("Edit Valuations");
              edit.setClientName(portfolioViewClientName.getText());
edit.setPortfolioType(portfolioViewInvestmentTypeCombo.getSelectedItem().toString());
              edit.setPortfolioId(id);
                                                                          edit.setOngoingValuationsId(Integer.parseInt(String.valueOf(valueAt)));
              edit.setLocationRelativeTo(table);
               edit.setVisible(true);

               //CATCH THE CALL FROM EditValuationsDialog HERE!!!!//

             }
  };

EditValuationsDialog

//Action Listeners
    private class AddBtnAction implements ActionListener
    {

        @Override
        public void actionPerformed(ActionEvent e) 
        {
           if(someCondition)
           {
              return String / int to MainUIHolder (See where I want to catch it in MainUIHolder)
           }
          else
          {
            do nothing
          }

        }
    }

在我的代码中,我已经指出应该从哪里生成对MainUIHolder 的调用,以及我必须在哪里捕获MainUIHolder 中的调用。我该如何做这个回调工作?

【问题讨论】:

    标签: java swing methods callback actionlistener


    【解决方案1】:

    你可以...

    static 方法添加到EditValuationsDialog 以显示对话框、评估结果并返回您期望的值...

    public void actionPerformed(ActionEvent e)
    {
        int result = EditValuationsDialog.showDialog();
    }
    
    public class EditValuationsDialog ... {
        //...
        private int result = -1;
        //...
        public int getResult() {
            return result;
        }
        //...
        public static int showDialog(Component source, int rowNum, Object valueAt) {
    
            EditValuationsDialog edit = null;
            Window parent = SwingUtilities.windowFor(source);
            if (parent instanceof Frame) {
                edit = new EditValuationsDialog((Frame)parent,true);
            } else if (parent instanceof Dialog) {
                edit = new EditValuationsDialog((Dialog)parent,true);
            } else {
                edit = new EditValuationsDialog(null,true);
            }
    
            edit.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            edit.setTitle("Edit Valuations");
            edit.setClientName(portfolioViewClientName.getText());
            edit.setPortfolioType(portfolioViewInvestmentTypeCombo.getSelectedItem().toString());
            edit.setPortfolioId(id);
            edit.setOngoingValuationsId(Integer.parseInt(String.valueOf(valueAt)));
            edit.setLocationRelativeTo(source);
            edit.setVisible(true);
    
            return edit.getResult();
        }
        //...
        private class AddBtnAction implements ActionListener
        {
            @Override
            public void actionPerformed(ActionEvent e) 
            {
                if(someCondition)
                {
                    result = 0;
                }
                else
                {
                    result = 1;
                }
                EditValuationsDialog.this.dispose();
            }
        }
    }
    

    或者你可以...

    直接从上面的例子中评估getResult()的结果...

    旁注: 因为我不喜欢从像 JDialog 这样的顶级容器扩展,所以我倾向于使用 static showDialog 方法创建一些面板/组件,有些东西例如,沿着登录面板的线条。这意味着我可以在其他地方重复使用面板,但为我提供了在需要时能够弹出对话框的便利。我也时不时使用JOptionPane 来展示这些面板,但这取决于可用操作的复杂程度...

    【讨论】:

    • 不清楚答案。除此之外,return edit.getResult(); 部分似乎在显示对话框后立即返回值,而不在意用户是否单击了按钮。
    • @Sniper new EditValuationsDialog(null,true); 使对话框成为模态,因此在关闭之前,它将在 setVisible 调用处阻塞...这意味着,AddBtnAction ActionListener 可以设置对话框的result 字段和dispose 的状态,这将解锁setVisible 调用并返回结果...
    • 查看How to Make Dialogs了解更多详情
    • 啊,明白了。但是,您的 showDialog 方法不能留在 EditValuationsDialog 内。因为所有set 方法数据都可以在MainUIHolder 中获得,而他应该将这些数据提供给EditValuationsDialog
    • @Sniper 稍微更新了示例,因此您需要将一些值传递给 showDialog 方法......但我所拥有的只是代码 sn-ps,所以我不知道是什么以及事情在哪里......
    【解决方案2】:

    使对话框模式化 (setModal(true))。然后dialog.setVisible(true)之后的代码在对话框关闭后执行。

    顺便说一句,最好将 MainUIHolder JFrame 实例作为对话框的父级传递。

    【讨论】:

      【解决方案3】:

      您可以向 EditValuationsDialog 添加一个接口,如下所示:

      Interface EditValuationsDialogInterface {
      public void onAddClicked(addedVlue);
      
      } 
      

      然后这样添加:

      edit.setOnAddButtonCallback(new EditValuationsDialogInterface () {
      
      @Override
      onAddClicked(addedVlue){
      //DO SOMETHING
      }
      });
      

      在 EditValuationsDialog 的添加按钮 onclick 调用中添加:

      onAddButtonClickedCallback.onAddClicked(retunrValue);
      

      这使您可以直接链接回原来的调用类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-14
        • 2018-05-28
        • 1970-01-01
        • 1970-01-01
        • 2021-05-25
        相关资源
        最近更新 更多