- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我简化了我的代码与大家分享。目前有3个类(class)。 JFrame、JInternalFrame 和线程。 JFrame 创建 JInternalFrame,JInternalFrame 创建线程。我的线程中的构造函数需要一个 JInternalFrame 的实例来处理它的按钮。因此,在创建 InternalFrame 的界面后,我创建并启动线程。不幸的是,整个 JFrame 卡住了,代码将完全保留在线程中。我已经尝试摆脱线程中的 while(true) 循环。然后 JFrame 仅在我的 sleep 功能需要的时间内卡住。
长话短说:如何让我的线程真正并行运行?我的主代码无需等待线程中的任何 sleep 时间或类似的东西。
这是我的 3 门类(class)。对于任何愚蠢的菜鸟错误,提前表示歉意。我还在学习中。
package nachgestellt;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;
public class Langtons extends JFrame implements ActionListener {
private JDesktopPane desk;
private JPanel panelButtons;
JMenuBar jmb;
JMenu file;
JMenuItem open, exit;
JSlider slider;
int xInt, yInt;
Random randomGenerator = new Random();
JLabel xLabel, yLabel, speed, test;
JButton start, stop, addAnt;
JTextField xField, yField;
public Langtons() {
//Desktop
desk = new JDesktopPane();
getContentPane().add(desk, BorderLayout.CENTER);
xField = new JTextField();
yField = new JTextField();
start = new JButton("Fenster erstellen");
panelButtons = new JPanel();
panelButtons.setLayout(new GridLayout());
;
panelButtons.add(start);
panelButtons.add(xField);
panelButtons.add(yField);
start.addActionListener(this);
add(panelButtons, BorderLayout.NORTH);
setSize(new Dimension(1100, 900));
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("Fenster erstellen")) {
xInt = Integer.parseInt(xField.getText());
yInt = Integer.parseInt(yField.getText());
addChild(new kind(this, xInt, yInt), this.getSize().width, this.getSize().height);
}
}
public void addChild(JInternalFrame kind, int x, int y) {
kind.setSize(370, 370);
kind.setLocation(randomGenerator.nextInt(x - kind.getSize().height), randomGenerator.nextInt(y - kind.getSize().height - 100));
kind.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
desk.add(kind);
kind.setBackground(Color.blue);
kind.setVisible(true);
}
public static void main(String[] args) {
new Langtons();
}
}
package nachgestellt;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.util.ArrayList;
import javax.swing.*;
public class kind extends JInternalFrame {
Langtons hFenster;
static int nr = 0;
JPanel panelButtonsKind;
ArrayList<JButton> jbArray = new ArrayList<JButton>();
JPanel panelSpielfeld;
int posAmeise, aktuellesIcon;
public kind(Langtons la, int x, int y) {
super("Kind " + (++nr), true, true, true, true);
hFenster = la;
panelSpielfeld = new JPanel();
panelSpielfeld.setLayout(new GridLayout(y, x));
jbArray.add(new JButton());
for (int i = 1; i <= (x * y); i++) {
jbArray.add(new JButton(Integer.toString(i)));
panelSpielfeld.add(jbArray.get(i));
jbArray.get(i).setBackground(Color.WHITE);
}
jbArray.get(((x / 2) * y) - y / 2).setBackground(Color.GREEN);
posAmeise = (((x / 2) * y) - y / 2);
setLayout(new BorderLayout());
panelButtonsKind = new JPanel();
panelButtonsKind.setLayout(new GridLayout(1, 3));
add(panelButtonsKind, BorderLayout.NORTH);
add(panelSpielfeld, BorderLayout.CENTER);
setVisible(true);
this.repaint();
thread a = new thread(this);
a.start();
System.out.println("Test Message After Creation and Start of Thread");
}
public void changeColor() {
if (jbArray.get(posAmeise).getBackground().equals(Color.GREEN))
jbArray.get(posAmeise).setBackground(Color.WHITE);
else
jbArray.get(posAmeise).setBackground(Color.GREEN);
}
}
package nachgestellt;
import java.awt.Color;
public class thread extends Thread {
kind k;
public thread(kind kk) {
this.k = kk;
run();
}
public void run() {
super.run();
while (true) {
if (k.jbArray.get(k.posAmeise).getBackground().equals(Color.GREEN)) {
try {
sleep(1000);
k.changeColor();
System.out.println("Test Message Thread!");
} catch (InterruptedException e) {
e.printStackTrace();
}
} else if (k.jbArray.get(k.posAmeise).getBackground()
.equals(Color.WHITE)) {
try {
sleep(1000);
k.changeColor();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
最佳答案
Swing 是单线程的并且不是线程安全的,您永远不应该在事件调度线程中执行任何可能会阻塞它或长时间运行的操作。同样,您永远不应该尝试从 EDT 外部更新 UI。
参见Concurrency in Swing了解更多详情。
Thread#run
将简单地在当前线程的上下文中调用 Thread
的 run
方法,这并不是特别有用,您应该使用Thread#start
。
但是,话虽如此,在您的情况下,您应该使用 Swing Timer
而不是 Thread
。计时器将按照指定的延迟间隔设置对注册的 ActionListener
的回调,该回调在 EDT 的上下文中执行,从而可以安全地从内部更新 UI。
参见How to use Swing Timers了解更多详情
关于java - 当 while(true) 在线程中循环时 JFrame 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30088887/
我有一个 PowerBI Online 数据集,它是在 PowerBI 桌面中创建然后在线发布的。到目前为止,一切都很好。 我通过 PowerBI pusblish 从 Excel 连接到数据集,按预
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 2 年前。
我必须对一些太大而无法放入内存的数据训练分类模型,我正在使用 scikit learn 和 pandas 来进行分析。所以这是我的问题,如何在在线学习管道中使用验证来调整超参数? 我使用带有chuck
我正在开发一个应用程序,该应用程序将从 webservice 获取数据和图像并将其存储在设备中以供离线使用。同时,应用程序会将一些数据存储在 sqlite db 中,并将一些图像作为默认数据。 这是应
是否可以使用 FileReader API 和 onprogress 事件访问随 HTML5 传入的数据? 如果是这样,是否有 MD5 或其他快速散列算法的“在线”版本,以便我可以在文件完全读取之前开
希望任何人都可以帮助我更改下面的代码,我的临时文件包含以下代码: Temp=8.4* Humidity=70.4% 代替代码 Temp = 24 *C, Hum = 40 % 适用于以下脚本。 我需
我必须创建一个功能类似于联系人应用程序的应用程序。您可以在客户的 iPhone 上添加一个联系人,它应该会上传到客户的 iPad 上。如果客户在他们的 iPad 上更新联系人,它应该会在他们的 iPh
在 gitlab.com 上审查 merge 请求时,有时我必须在完成 merge 之前进行 rebase。 在 gitlab 上按“Rebase”后,我有一个特定的管道步骤失败,因为它无法验证用户的
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
我正在尝试在 azure 上托管 SQL 服务器以与节点应用程序进行通信。我已经成功地完成了创建数据库服务器和数据库本身的过程。现在,我想编辑我的数据库结构。据我发现online ,应该有一种方法可以
我在 Quickbooks Intuit 开发人员 API 中使用 Oauth 2 获得了访问 token 。 范围是 com.intuit.quickbooks.accounting 我能够使用 Q
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
是否可以使Angular Material progress spinner与文本并大致与字符的大小一致地显示? 我想要类似的东西: please wait 微调器仅与“请稍候”文本成行出现。 这可
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我有一个每天运行的Powershell脚本。今天它失败了,因为我正在使用的域 Controller 不可用。在继续执行脚本的其余部分之前,我想确保可以连接到可用的DC。 $LdapServer = "
我想制作一款在线 Flash 游戏,它将具有社交功能,但游戏玩法将主要是单人游戏。例如,屏幕上不会同时出现两个玩家,社交互动将通过异步消息进行,不会有实时聊天或其他任何内容。大部分逻辑将发生在客户端中
这几天我开始在线玩OpenShift。我部署了一个非常简单的“Hello World”Java 示例(1 行代码!),没有任何依赖项(没有 Spring!)命令行是这样的: oc.exe new-a
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
所以我一直在网上学习Java(初学者),并且我一直在尝试制作一个用于制作矩形的类文件。但是,我的在线 java 评估器指出它找不到实例变量。 This is the comment on it.我的代
我是一名优秀的程序员,十分优秀!