【发布时间】:2021-03-18 15:14:55
【问题描述】:
我编写了这个 Java 应用程序,它用于在启动计数器后从 JTextFields 中输入的值中提取随机值。编译并没有给出错误,但 ("" +randomElement) 值不显示。
我在启动计数器的actionPerformed() 方法中的TimerListener 类中创建了randomElement 属性。在计数结束时,必须显示取自四个 JTextField 的随机值(如下面的代码所示)。
你能告诉我哪里错了吗?我该如何解决?
public class Merge extends JPanel {
public static final int TIMER_DELAY = 1000;
public static final String TEST_TEXT = "123456";
public JTextField textField = new JTextField(16);
public JButton button = new JButton(new ButtonAction());
public Timer timer;
JTextField t1Text = new JTextField();
JTextField t2Text = new JTextField();
JTextField t3Text = new JTextField();
JTextField t4Text = new JTextField();
JLabel f1Label = new JLabel("Filippo film 1");
JLabel f2Label = new JLabel("Filippo film 2");
JLabel l1Label = new JLabel("Laura film 1");
JLabel l2Label = new JLabel("Laura film 2");
public Merge() {
add(button);
add(textField);
}
public static void main(String[] args) {
Merge me = new Merge();
me.createAndShowGui();
}
public void createAndShowGui() {
Merge mainPanel = new Merge();
JFrame frame = new JFrame("Film roulette");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.setLayout(new GridLayout(11, 4));
frame.pack();
frame.setBounds(100, 10, 400, 400);
frame.add(f1Label);
frame.add(t1Text);
frame.add(f2Label);
frame.add(t2Text);
frame.add(l1Label);
frame.add(t3Text);
frame.add(l2Label);
frame.add(t4Text);
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public class ButtonAction extends AbstractAction {
public ButtonAction() {
super("The movie you will see...");
putValue(MNEMONIC_KEY, KeyEvent.VK_P);
}
@Override
public void actionPerformed(ActionEvent e) {
if (timer != null && timer.isRunning()) {
return;
}
textField.setText("");
timer = new Timer(TIMER_DELAY, new TimerListener());
timer.start();
}
}
private class TimerListener implements ActionListener {
private String text = "";
private int counter = 0;
@Override
public void actionPerformed(ActionEvent e) {
String filmFilippo1, filmFilippo2, filmLaura1, filmLaura2;
filmFilippo1 = t1Text.getText();
filmFilippo2 = t2Text.getText();
filmLaura1 = t3Text.getText();
filmLaura2 = t4Text.getText();
List<String> givenList = Arrays.asList(filmFilippo1, filmFilippo2, filmLaura1, filmLaura2);
Random rand = new Random();
String randomElement = givenList.get(rand.nextInt(givenList.size()));
text += TEST_TEXT.charAt(counter);
textField.setText(text);
counter++;
if (counter >= TEST_TEXT.length()) {
timer.stop();
textField.setText("" +randomElement);
}
}
}
}
【问题讨论】:
-
定时器可能没有在 Swing 线程上运行。你可能想做两件事。 1)在 timer.stop() 调用之后,打印到控制台以显示它正在工作,2)使用 InvokeLater() 之类的东西来确保你的 textField.setText() 发生在 Swing 线程上。
-
@NomadMaker 这是不正确的
javax.swing.Timer保证分配的ActionListener的actionPerformed方法在EDT 的上下文中被调用 -
@DavidKroukamp 对此感到抱歉。但是,我仍然认为 print 语句对于调试来说是一个好主意。
-
同意还是断点????
标签: java swing random jtextfield