gpt4 book ai didi

java - JLabel 通过 setText 更改值但不在屏幕上更新

转载 作者:行者123 更新时间:2023-11-30 08:19:29 25 4
gpt4 key购买 nike

好吧,我已经在一段代码上工作了将近 2 天,但无法解决问题。

期望的行为

下面的代码应该以 aprox 的间隔一个一个地显示 10 个字符串(下一个替换前一个)。 200 毫秒。

q1问题2问题3...等等直到 q10

此显示顺序在用户按下 ENTER 键时开始。

反射(reflect)的行为

屏幕等待大约。按下 2 秒后显示 q10。

更多信息

  1. 标签 stringText 在执行过程中更改了值(我通过写入控制台发现了这一点),但在屏幕 (JFrame) 上没有更新。
  2. 标签通过按钮上的点击事件更改值,其他一切保持不变(尽可能多)。
  3. 计时器通过一个 while 循环 - 这可能不是大多数人所喜欢的,但让我们暂时忘记它。
  4. displayQuestion(int number) 方法有一些不必要的行。我把它们都放了,因为我不确定什么会起作用。实际上,什么都没用!

代码

package sush4;

import java.util.Date;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Sush4 {

// Timer control variables
static long holdTimeWord = 200L;
static long elapsedTime = 0L;

// Counter for Strings displayed
static int i = 0;

// Strings in use
static String[] questionStack = {"q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10"};

// UI: String display variables
static JLabel stringText;
static JFrame mainWindow;

// Key binding action object
private static Action userKeyCommand;

/// Display the question
private static void displayQuestion(int number) {
mainWindow.remove(stringText);
stringText.setText(questionStack[number]);
mainWindow.add(stringText);
mainWindow.setVisible(true);
mainWindow.revalidate();
mainWindow.repaint();
}

private static void q120(){

//// Initiate the text
for(i = 0; i < questionStack.length; i++) {

displayQuestion(i);

//// And wait for Word hold time
long startTime = System.currentTimeMillis();
elapsedTime = 0L;
// Now wait for event to happen
while ( (elapsedTime < holdTimeWord) ) {
elapsedTime = (new Date()).getTime() - startTime;
}
}
}

Sush4() {

//// Create the Window
mainWindow = new JFrame("Sush");
mainWindow.setSize(700, 500);
mainWindow.setLayout(new FlowLayout());

//// And add key bindings for user events
userKeyCommand = new UserKeyCommand();
JRootPane rootPane = mainWindow.getRootPane();
rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("ENTER"), "doEnterAction");
rootPane.getActionMap().put("doEnterAction", userKeyCommand);

// Terminate the program when the user closes the application.
mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainWindow.setResizable(false);

//// Add the text label
stringText = new JLabel("Random Text");
mainWindow.add(stringText);

//// Finally, display the frame.
mainWindow.setVisible(true);
}

static class UserKeyCommand extends AbstractAction {
public void actionPerformed( ActionEvent tf ) {
q120();
}
}

public static void main(String[] args) {

// Create the frame on the event dispatching thread.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Sush4();
}
});
}
}

最佳答案

The timer is through a while loop - this may not be as per most people's liking, but lets forget it for the time being.

实际上我们不能忘记这个 while 循环,因为这是造成麻烦的原因。看,单击按钮时调用 q120() 方法:

static class UserKeyCommand extends AbstractAction {
@Override // don't forget @Override annotation
public void actionPerformed( ActionEvent tf ) {
q120();
}
}

这意味着这段代码是在Event Dispatch Thread (EDT)的上下文中执行的.这是一个单独的特殊线程,必须在其中创建/更新 Swing 组件并执行事件处理(即: Action 事件)。如果我们在这个线程中有一个循环等待某些条件继续,我们将阻止 EDT,并且 GUI 将无法重新绘制自身,直到线程被解锁。

对于重复性任务(例如您问题中的任务),请考虑使用 Swing Timer .对于具有中期结果的繁重任务,请考虑使用 SwingWorker相反。

关于java - JLabel 通过 setText 更改值但不在屏幕上更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26822070/

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