繁体   English   中英

使用用户输入更新 Java Swing 计时器

[英]Updating Java Swing Timer with User Input

所以我目前在使用 Java Swing 计时器时遇到问题,但首先让我描述一下我正在尝试做什么。

所以我有一个 Swing GUI,它每“X”秒更新一次带有 JSON 数据的地图。 用户可以在文本字段中输入秒数,然后单击按钮开始更新地图。 然后,地图将通过根据输入查询 JSON 来更新。

所以我使用 Swing 计时器根据用户的输入重复某个动作事件。 见下图:

clickOkButton.addActionListener(e1 -> {

  ActionListener actionListener = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
      String url = "";
      url = new_text.getText();

      layer[0] = (RenderableLayer) geo.createLayerFromSource(url);
      appFrame.getWwd().getModel().getLayers().set(20, layer[0]);
      ltree.getModel().refresh(appFrame.getWwd().getModel().getLayers());


    }
  };



  int time = Integer.parseInt(queryTime.getText());
  Timer timer = new Timer(time * 1000, actionListener);
  timer.setRepeats(true);
  //timer.setDelay(1);
  timer.start();

  d.setVisible(false);
  //System.out.println(text);

});

当程序启动时,无论用户首先进入什么时间,效果都很好。 但是,如果他们更改时间,则计时器不会更改。

  int time = Integer.parseInt(queryTime.getText());
  Timer timer = new Timer(time * 1000, actionListener);

它与这些线条有关,但我无法弄清楚。 我正在从文本字段中提取数值并将其设置为计时器中的延迟。 但它仅在程序第一次启动时有效,而在更改时无效。

任何帮助将非常感激。

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class SwingTimerDemo extends JPanel {


    final static int height = 500;
    final static int width = 500;
    final static String title = "default title";

    JFrame frame = new JFrame(title);
    JTextField field = new JTextField(10);
    JTextArea area = new JTextArea(50,20);


    public static void main(String[] args) {
        SwingUtilities.invokeLater(
                () -> new SwingTimerDemo().start());
    }
    public SwingTimerDemo() {
        frame.setDefaultCloseOperation(
                JFrame.EXIT_ON_CLOSE);
        // add this panel to the frame
        frame.add(this);
        // add the JTextArea and JTextField to the panel
        add(area);
        add(field);
        setPreferredSize(
                new Dimension(500, 500));
        frame.pack();
        // center the frame on the screen
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    public void start() {
        // append the string to the JTextArea
        Timer t = new Timer(0, (ae)->area.append("Processing...\n"));

        // set the inter-event delay to 2 seconds
        t.setDelay(2000);
        // start the timer
        t.start();
        field.addActionListener(ae->{
            String text = field.getText();
            field.setText(""); // "erase" the text
            // convert to a number
            int delay = Integer.parseInt(text);
            // reset the timer delay
            t.setDelay(delay*300);
        });     
    }
}

假设您熟悉框架和面板,我将跳到 JTextField 和 JTextArea。

  • 该字段是用户输入延迟的地方。 使用actionListener通知它。 然后检索该输入,将其解析为 int 并设置计时器延迟。
  • 该区域只是计时器写入输出的地方。

请注意,可以使用按钮代替用户输入信息时的事件。 用户输入信息,然后单击按钮。 在这种情况下,就不需要 JTextField 侦听器。 相反,侦听器将用于按钮检查文本字段。

这是一个非常基本的示例,用于演示两个 actionListener 之间的交互。 如果用户输入除数字以外的任何内容,则会引发异常。 您可能想查看Java 教程,其中讨论了事件处理和其他您会感兴趣的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM