当前位置: 首页 > 知识库问答 >
问题:

将参数从父级传递到公共无效run()

傅英喆
2023-03-14

我50%的希望渺茫:P.我(一开始)试图从一个线程的代码中更新GUI,但得到了NullException。在阅读了一段时间后,我了解到线程淹没了JavaFX应用程序窗口,为了从线程更新GUI,我需要使用以下代码

Platform.runLater(new Runnable() {
            @Override public void run() {

            //Update UI here     
            for (int i=0; i<2000;i++)
                {
                 MyMainClass.leftPaneTextArea.appendText("Goodi!\n");
                }

            }
        });

所以我确实使用了这个代码,它确实允许我编辑我的主类的图形用户界面。不过,我的问题很简单。=

@Override
    public void run() {

    String tmpVar;

    ... (Some code)
    ... (Some code)
    ... (Some code)

        Platform.runLater(new Runnable() {
            @Override public void run() {

            //Update UI here     
            for (int i=0; i<2000;i++)
                {
                 MyMainClass.leftPaneTextArea.appendText("Goodi!\n");
                }

            }
        });

    ... (Some code)
    ... (Some code)
    ... (Some code)
}

如何将父级的public void run()中的参数传递给这个?。例如,字符串tmpString(我想传递它)。

请注意,如果我在public void run()之外将其声明为static(例如)=

谢谢你!。

共有3个答案

端木夕
2023-03-14

你总是可以用吸气剂...

public class YourClass {
    private String myVar;

    public void do something(String aVal) {
        myVar= "Value you want to pass";

        this.runOnUiThread(new Runnable() {
            @Override
            public void run() {    
                Log.d("TAG",getMyVar());
            }
        });
    }

    private String myVar(){
        return myVar;
    }
}
斜淳
2023-03-14

正如James_D所发布的,一个选项是在内部类中使用finalvar(匿名与否)

其他选项,如new MyRunnable(someString)或使用Consumer

凤衡
2023-03-14

基本上,您需要考虑将参数传递给Runnable对象,而不是传递给run()方法。

如果将匿名类设置为内部类,则很明显:

@Override
public void run() {

    String tmpVar;

    // ... (Some code)
    // ... (Some code)
    // ... (Some code)

        Platform.runLater(new Updater(tmpVar));

    // ... (Some code)
    // ... (Some code)
    // ... (Some code)
}

// ...

public static class Updater implements Runnable {

    private final String var ;

    public Updater(String var) {
        this.var = var ;
    }



    @Override 
    public void run() {

        // Access var here

        for (int i=0; i<2000;i++){
            MyMainClass.leftPaneTextArea.appendText("Goodi!\n");
        }

    }
}

现在,如果tmpVar最终的,或者实际上是最终的1,那么它将与您的匿名内部类一起工作,并且基本上被翻译成与上面的内部类完全相同的东西(换句话说,匿名内部类获取一个隐式字段,该字段填充了最终变量的值):

@Override
public void run() {

    final String tmpVar = ...;

    // ... (Some code)
    // ... (Some code)
    // ... (Some code)

    Platform.runLater(new Runnable() {
        @Override public void run() {

        // access tmpVar here:

        for (int i=0; i<2000;i++)
            {
             MyMainClass.leftPaneTextArea.appendText("Goodi!\n");
            }

        }
    });

    // ... (Some code)
    // ... (Some code)
    // ... (Some code)
}

语言html" target="_blank">设计者实际上可以用非最终变量来完成这项工作,但是他们认为结果会太混乱。会发生的是,它将被翻译成上面看到的相同的内部类:换句话说,当前的tmpVar值将被隐式传递到匿名内部类中的一个字段。这将是一个全新的变量,与您正在访问的变量具有不同的作用域,它的值将是创建匿名内部类时tmpVar值的“快照”。有一个看起来像是一个变量,实际上是指两个不同的变量,可能有不同的值,这被认为太混乱和容易出错。

但是,如果tmpVar不是final(或实际上是final):也就是说,你要给它赋值多次,你可以显式地“快照”变量的值:

@Override
public void run() {

    String tmpVar ;

    // ... (Some code)
    // ... (Some code)
    // ... (Some code)

    final String varCopy = tmpVar ;

    Platform.runLater(new Runnable() {
        @Override public void run() {

        // access varCopy here:

        for (int i=0; i<2000;i++)
            {
             MyMainClass.leftPaneTextArea.appendText("Goodi!\n");
            }

        }
    });

    // ... (Some code)
    // ... (Some code)
    // ... (Some code)
}

(1) “有效最终”意味着变量只分配了一次值。等价地,这意味着您可以在不产生任何编译错误的情况下声明它final

 类似资料:
  • 我试图将一些信息从子项中的输入字段传递给父项。 到目前为止我所掌握的是: 34 this.setstate({searchstring:event.target.value},()=>{ >35 this.props.onchild(this.state.SearchString); 希望有人能帮忙。顺便说一句,我是个小人...

  • 问题内容: 我有两个组成部分: 第一个是父组件,它是通常的React组件。 第二个是孩子,它是功能组件。 我想将 Titles 的值(处于子状态)传递给父Component。这是我的 子组件 代码: 这是我的 父组件 : 这看起来很容易,但这是我第一次使用功能组件。你能帮我吗 ? 问题答案: React就是关于在组件树中向下流动的数据。如果您希望能够显示和/或修改彼此之间的共享状态,则应提升状态并

  • 我有一个如下所示的graphql查询: 因此,名称和电子邮件将由名为详细信息的其余endpoint解析,但是地址字段需要由另一个名为地址的其余endpoint解析。>rest终结点还需要在中传递的(因为我的rest服务需要该字段)。我不确定,在这种情况下,我如何设计我的解析器? 同样,一个字段一旦解析,是否可以将数据发送到另一个字段?这在grapqhql中可能吗?

  • null 这意味着我应该将代理列表(端口)从Scala传递到远程Kafka,因为否则它将尝试使用默认端口。 问题是,根据日志,远程计算机无法识别参数。我还尝试将此参数重命名为、和,但日志中始终出现相同的错误,然后默认使用端口(显然不使用消息)。 在POM文件中,我对Kafka和Spark使用了以下依赖关系: 这是我的Scala代码(如果我使用自己安装在Amazon Cloud中的Kafka,在那里

  • 问题内容: 我想将值传递给javascript。如果可能的话,我该怎么办?如何在后备bean中接收它们? 问题答案:

  • 问题内容: 我们已经设置了一些参数来在Jenkins中执行构建(使用简单的“参数化构建”设置)。作业被设置为Maven测试。有没有办法以编程方式将这些参数传递到我们的Java代码中?我们需要基于通过Jenkins设置的参数来执行某些更新功能。 问题答案: 是的,您可以通过Maven执行将Jenkins参数传递给Java代码,如下所示: 请注意, $ JOB_PARAM_1 将捕获Jenkins上设