簡體   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