Обновление Java Swing Timer с пользовательским вводом - PullRequest
1 голос
/ 23 марта 2020

Итак, у меня сейчас проблема с моим Java таймером Swing, но сначала позвольте мне описать, что я пытаюсь сделать.

Итак, у меня есть Swing GUI, который обновляет карту с помощью JSON данные каждые 'X' количество секунд. Пользователь может ввести количество секунд в текстовое поле, а затем нажать кнопку, чтобы начать обновление карты. Затем карта будет обновлена ​​путем запроса 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);

Это как-то связано с этими строками, но я просто не могу понять это. Я вытаскиваю числовое значение из текстового поля и устанавливаю его как задержку в таймере. Но он работает только при первом запуске программы, а не при ее изменении.

Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 23 марта 2020
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 Учебными пособиями , где они рассказывают об обработке событий и других вещах, которые могут вас заинтересовать.

...