我正在尝试创建一个非常基本的java GUI程序来解决Boggle板
它使用递归DFS。我想要发生的是按钮的背景颜色(我使用按钮只是因为它们已经是正方形)从黄色到红色,因为字母被“标记”并且当它们“未标记”时又回到黄色。
如果我注释掉最后一行将它重新充满黄色,并且使用Thread.sleep()延迟程序的方法,它按预期工作,将它们全部保留为红色,但如果我只取消注释延迟方法,它会当程序运行完毕时,不会实时更新,所有背景都会变为红色
如果我取消注释将其更改为黄色的行,则它会一直保持黄色。
我无法弄清楚如何让按钮实时切换为红色并返回黄色。
Mat objectImage = Highgui.imread(signObject, Highgui.CV_LOAD_IMAGE_COLOR);
featureDetector.detect(objectImage, objectKeyPoints);
descriptorExtractor.compute(objectImage, objectKeyPoints, objectDescriptors);
datasetObjImage.add(objectImage);
datasetKeyPoints.add(objectKeyPoints);
datasetDescriptors.add(objectDescriptors);
答案 0 :(得分:0)
默认情况下,您的应用程序启动单线程并在此线程上执行所有计算。当你改变组件的颜色时,它只会在程序有空闲时间时重新绘制,但程序永远不会有空闲时间,因为计算仍在继续。
您需要做的是将此循环中的代码放到另一个线程中,并从第二个线程更新GUI。
这是一个有用的例子,可以帮助你入门。
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class ColorfulButtons extends JFrame {
private JLabel[] labels = new JLabel[5];
// start the application, this starts the original thread
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ColorfulButtons frame = new ColorfulButtons();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public ColorfulButtons() {
// create your gui
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
JPanel contentPane = new JPanel();
setContentPane(contentPane);
contentPane.setLayout(new GridLayout(1, 0, 0, 0));
for (int i = 0; i < 5; i++) {
JLabel lbl = new JLabel("TEXT");
add(lbl);
labels[i] = lbl;
}
// start the color changing thread
new Thread(new Runnable() {
public void run() {
doTheThing();
}
// give it a name for debugging
}, "DoTheThingThread").start();
}
private void doTheThing() {
int index = 0;
while (true) {
// put label in final variable so I can use it inside anonymous classes
final JLabel lbl = labels[index];
// make label yellow on Event Dispatch Thread
SwingUtilities.invokeLater(new Runnable() {
public void run() {
lbl.setForeground(Color.YELLOW);
}
});
// pause to give the gui time to redraw and process events
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// make label red on Event Dispatch Thread
SwingUtilities.invokeLater(new Runnable() {
public void run() {
lbl.setForeground(Color.RED);
}
});
// increment or reset index
if (index < 5 - 1)
index++;
else
index = 0;
}
}
}