[英]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.