为什么不起作用? (在java中通过Runnable发送函数作为参数)

时间:2014-04-09 12:40:52

标签: java runnable

我有一个java项目,我遇到了问题。

目标说明

在表单A(MainForm)中,我在enable(false)模式下有一些按钮。 我有一个函数LockOrUnlockButtons()来检查一些条件,如果这个函数返回true,那么按钮会生成启用(true)状态。 我希望将此功能称为"关闭表格B" (AddCstmrForm)。

我试图通过接收此函数作为参数来解决这个目标:

public Void AddCstmrForm(Runnable myFunc) {
    .....
    ....
    }

问题:

但是在表单A(MainForm)中,当我将函数LockOrUnlockButtons()发送给表单B的构造函数(AddCstmrForm)时,我得到了错误:

Constructor AddCstmrForm in class AddCstmrForm cannot be applied to given types.
  required: no arguments.
  founf: Void

我做错了什么?

Harel的

代码: 表格A中的,(MainForm):

private void buttonAddNewCstmrCrdActionPerformed(java.awt.event.ActionEvent evt) {                                                     
         AddCstmrForm addCstmr = null;
        try 
        {
            addCstmr = new  AddCstmrForm(LockOrUnlockButtons());
        }
        catch (Exception ex) 
        {
            Logger.getLogger(MainForm.class.getName()).log(Level.SEVERE, null, ex);
        }
            addCstmr.show();
}

   private Void LockOrUnlockButtons() throws Exception
    {
         if(sngltn.GetAllCustemers().size()==0) 
            buttonUpdateAddActivityCstmrCrd.setEnabled(false);
         else
              buttonUpdateAddActivityCstmrCrd.setEnabled(true);

         if(sngltn.GetAllCustemers().size()==0) 
            buttonDeleteCstmrCrd.setEnabled(false);
         else
            buttonDeleteCstmrCrd.setEnabled(true);

         if(sngltn.GetAllCustemers().size()==0) 
            buttonQueriesViewData.setEnabled(false);
         else
            buttonQueriesViewData.setEnabled(true); 
         return null;
    }
表格B中的

*(AddCstmrForm):*

public class AddCstmrForm extends javax.swing.JFrame {
    ...............
    .............
    .........
    private Runnable MainFormLockOrUnlockButton;
    ........
    public Void AddCstmrForm(Runnable myFunc) throws Exception {
    initComponents();
    ..............
    ..........
    ......
    this.MainFormLockOrUnlockButton = myFunc;
    return null;
    }
    ..............
    ..........
    ......
}

2 个答案:

答案 0 :(得分:3)

这不是构造函数:

public Void AddCstmrForm(Runnable myFunc) throws Exception {
    initComponents();
    ...
}

这是一种名为AddCstmrForm的方法,其返回类型为Void

我认为你的意思是:

public AddCstmrForm(Runnable myFunc) throws Exception {
    initComponents();
    ...
}

还需要创建一个Runnable来调用您的LockOrUnlockButtons方法。例如:

AddCstmrForm addCstmr = new AddCstmrForm(new Runnable() {
    @Override public void run() {
        LockOrUnlockButtons();
    }
});

除非你使用Java 8,否则你可以写:

AddCstmrForm addCstmr = new AddCstmrForm(this::LockOrUnlockButtons);

此外,您的LockOrUnlockButtons可以大大简化:

private void LockOrUnlockButtons() throws Exception {
    boolean anyCustomers = !sngltn.GetAllCustemers().isEmpty();
    buttonUpdateAddActivityCstmrCrd.setEnabled(anyCustomers);
    buttonDeleteCstmrCrd.setEnabled(anyCustomers);
    buttonQueriesViewData.setEnabled(anyCustomers);
}

(我也强烈建议您遵循Java命名约定,使用返回类型void而不是Void,除非您确实需要,并避免{ {1}}。您应该通过事物的外观重新审视您的异常处理方法。)

答案 1 :(得分:1)

A" Runnable"不仅仅是一个任意的功能;它是实现Runnable接口的类的实例。坦率地说,您使用的语法非常具有创造性;但这完全是错误的。