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

为什么它不起作用?(通过java中的Runnable将函数作为参数发送),java,runnable,Java,Runnable,我有一个java项目,我有一个问题 目标描述: 在表单A(MainForm)中,我有一些按钮处于enable(false)模式。 我有一个函数LockOrUnlockButtons(),用于检查某些条件,如果该函数返回true,则按钮将处于启用(true)状态。 我想为“表单B关闭事件”(AddCstmrForm)调用此函数 我试图通过接收此函数作为参数来解决此目标: public Void AddCstmrForm(Runnable myFunc) { ..... ....

我有一个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
我做错了什么

哈雷尔

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

*在表格B(
AddCstmrForm
)中:*


这不是构造函数:

public Void AddCstmrForm(Runnable myFunc) throws Exception {
    initComponents();
    ...
}
它是一个名为
AddCstmrForm
的方法,返回类型为
Void

我想你的意思是:

public AddCstmrForm(Runnable myFunc) throws Exception {
    initComponents();
    ...
}
您还需要创建一个
Runnable
来调用
lockorlunlockbuttons
方法。例如:

AddCstmrForm addCstmr = new AddCstmrForm(new Runnable() {
    @Override public void run() {
        LockOrUnlockButtons();
    }
});
除非您使用的是Java 8,否则您可以编写:

AddCstmrForm addCstmr = new AddCstmrForm(this::LockOrUnlockButtons);
此外,您的
锁定或解锁按钮可以大大简化:

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

(我还强烈建议您遵循Java命名约定,除非您确实需要,否则使用返回类型
void
,而不是
void
,并避免
引发异常
。从外观上看,您应该重新审视您的异常处理方法。)

这不是一个构造函数:

public Void AddCstmrForm(Runnable myFunc) throws Exception {
    initComponents();
    ...
}
它是一个名为
AddCstmrForm
的方法,返回类型为
Void

我想你的意思是:

public AddCstmrForm(Runnable myFunc) throws Exception {
    initComponents();
    ...
}
您还需要创建一个
Runnable
来调用
lockorlunlockbuttons
方法。例如:

AddCstmrForm addCstmr = new AddCstmrForm(new Runnable() {
    @Override public void run() {
        LockOrUnlockButtons();
    }
});
除非您使用的是Java 8,否则您可以编写:

AddCstmrForm addCstmr = new AddCstmrForm(this::LockOrUnlockButtons);
此外,您的
锁定或解锁按钮可以大大简化:

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

(我还强烈建议您遵循Java命名约定,除非您真的需要,否则使用返回类型
void
,而不是
void
,并避免
抛出异常
。从外观上看,您应该重新审视您的异常处理方法。)

可运行的”不仅仅是一个任意函数;它是实现可运行接口的类的实例。坦率地说,您使用的语法非常有创意;但这完全是错误的。

一个“可运行的”不仅仅是一个任意函数;它是实现可运行接口的类的实例。坦率地说,您使用的语法非常有创意;但这完全是错误的。

好的。我把我的“非构造函数”改为“真正的构造函数”!但是,当我想添加CreateArunnable来调用我的LockOrUnlockButtons方法时,我被卡住了。我想打电话给她,让她参加一个关于关闭AddCstmrForm的活动,你能给我更多的指导吗?我应该写什么?你是否已经修复了你试图创建一个
Runnable
?但是我仍然陷入困境,我应该为Runnable写什么来调用我的LockOrUnlockButtons方法。我想打电话给她参加一个结束AddCstmrForm的活动,你能告诉我更多我应该写什么吗?好的。我把我的“非构造函数”改为“真正的构造函数”!但是,当我想添加CreateArunnable来调用我的LockOrUnlockButtons方法时,我被卡住了。我想打电话给她,让她参加一个关于关闭AddCstmrForm的活动,你能给我更多的指导吗?我应该写什么?你是否已经修复了你试图创建一个
Runnable
?但是我仍然陷入困境,我应该为Runnable写什么来调用我的LockOrUnlockButtons方法。我想打电话给她参加一个结束AddCstmrForm的活动,你能给我更多的指导吗?我应该写什么?