gpt4 book ai didi

Java 从另一个 Runnable 内部运行一个 Runnable 不起作用

转载 作者:行者123 更新时间:2023-12-02 04:05:07 28 4
gpt4 key购买 nike

为什么下面的代码不起作用?基本上,这是一个更困难的程序的简化版本,在该程序中,我试图创建一个可运行的初始屏幕,其中包含一些选择,然后有链接到不同可运行项的按钮,但这并没有按照我的预期运行。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Runnables {
static Runnable runone;
static Runnable runtwo;
static JFrame frame = new JFrame();
static JButton button1 = new JButton("Initial screen");
static JButton button2 = new JButton("After button click screen");

public static void main(String[] args) {
runone = new Runnable() {
@Override
public void run() {
frame.removeAll();
frame.revalidate();
frame.repaint();
frame.add(button2);
}

};
runtwo = new Runnable() {
@Override
public void run() {
frame.setSize(800, 600);
frame.setVisible(true);
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
runone.run();
System.out
.println("This is performed, but the button doesnt change");
}
});
frame.add(button1);
}
};
runtwo.run();
}
}

最佳答案

Runnable 没有什么特别之处可以阻止其工作。根据您的代码示例,以下内容是等效的:

public void actionPerformed(ActionEvent arg0) {
runone.run();
System.out.println("This is performed, but the button doesnt change");
}

public void actionPerformed(ActionEvent arg0) {
frame.removeAll();
frame.revalidate();
frame.repaint();
frame.add(button2);
System.out.println("This is performed, but the button doesnt change");
}

获取代码并在 runone.run 中添加 System.out.println 调试语句表明它实际上正在执行。

我假设您的代码示例是您问题的简化演示;您可能想首先考虑让它作为“普通函数”执行您想要的操作(上面的第二个示例,其中组合了 Runnable),然后再分成不同的 Runnable。

编辑 - 要使您的示例正常工作,需要记住的是 JFrame 使用 contentPane 来托管其子级 - frame.add 的存在是为了方便添加到 contentPane (基于 javadoc for JFrame ),但 removeAll 不会执行此操作(基于我刚才使用它)。此外,在添加按钮后调用 validate 将再次正确地重新布局子组件以使第二个按钮出现。

runone 的定义替换为此定义,您的示例将正常工作:

runone = new Runnable() {
@Override
public void run() {
frame.getContentPane().removeAll();
frame.add(button2);
frame.validate();
}
};

关于Java 从另一个 Runnable 内部运行一个 Runnable 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14045605/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com