gpt4 book ai didi

java - 我如何让我的程序每小时检查一次股票市场值(value)[java]

转载 作者:行者123 更新时间:2023-11-30 08:28:24 24 4
gpt4 key购买 nike

我正在制作一个程序来检查股票市场的符号,我已经做到了这一点,并向其中添加了一个基本的图形用户界面。我很困惑如何让它每小时检查一次,如果它增加了就创建一个绿色的向上箭头,如果它减少就创建一个红色的向下箭头。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

public class QuoteTracker {
JFrame frame;
JPanel mainPanel;
JLabel enterLabel;
JLabel resultLabel;
JTextField text;
JTextField result;
JButton query;
JButton redArrow;
JButton greenArrow;
String url;

public static void main(String[] args) {
new QuoteTracker().buildGui();

}

public class checkingQuote implements Runnable {

@Override
public void run() {
while (true) {
try {
checkQuote(url);
//if increase in value green button

System.out.println("Sleeping");
Thread.sleep(1000 * 60 * 60);
System.out.println("Waking");
} catch (InterruptedException ie) {
ie.printStackTrace();
break;
}
}
}

}

public void checkQuote(String symbol) {
try {
String url = "http://finance.yahoo.com/q?s=" + symbol + "&ql=0";
this.url = url;
Document doc = Jsoup.connect(url).get();
Elements css = doc.select("p > span:first-child > span");
result.setText(css.text());
} catch (IOException e) {

}

}

public void buildGui() {
frame = new JFrame("QuoteTracker");
mainPanel = new JPanel();
enterLabel = new JLabel("enter symbol ");
resultLabel = new JLabel("result ");
text = new JTextField(4);
result = new JTextField(8);
query = new JButton("query");
query.addActionListener(new queryListener());

mainPanel.add(enterLabel);
mainPanel.add(text);
mainPanel.add(query);
mainPanel.add(resultLabel);
mainPanel.add(result);

frame.getContentPane().add(mainPanel);
frame.setSize(300, 400);
frame.setVisible(true);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

class queryListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent ev) {
checkQuote(text.getText());
}
}

}

我什至需要线程吗?我以前从未做过,并尝试添加有意义的东西。我在想我要么需要一个线程,要么使用 java 的定时器?

最佳答案

使用 SwingWorker在后台执行长时间运行的任务,同时根据该长时间运行的任务的某些结果更新 UI。这意味着,它实际上是关于两个不同的线程相互通信 - Worker ThreadsEvent Dispatch Thread (EDT)


但在此之前,我想针对您的代码提出一些注意事项。

  • 在 EDT 中调用 UI 的初始化。也就是说,而不是直接调用 new QuoteTracker().buildGui() , 在 Runnable 的运行方法中调用它传递给 SwingUtilities.invokeLater (如 this )

  • 根据 Java 标准,类应以大写字母开头。


申请SwingWorker在您现有的代码中,您可以执行以下操作:

首先,您必须将 checkQuote其他类(最好是服务类)中的方法,然后修改您的 checkQuote返回 String 的方法设置为文本字段 result .像这样

public Class QuoteService{
public String checkQuote(String symbol) {
try {
String url = "http://finance.yahoo.com/q?s=" + symbol + "&ql=0";
this.url = url;
Document doc = Jsoup.connect(url).get();
Elements css = doc.select("p > span:first-child > span");
return css.text();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
}

然后您可以制作您的 QuoteTracker类主要集中在应用程序的 UI 部分。只需将服务对象创建为实例级字段,以便您可以自由调用 checkQuote类中的方法。

单击按钮时调用 SwingWorker。

public void actionPerformed(ActionEvent ev) {

new SwingWorker<Void, String>() {
@Override // this method is done in the Worker Thread
protected Void doInBackground() throws Exception {
while(true){
String res = checkQuote(text.getText());
publish(res); //will call the process method
Thread.sleep(1000 * 60 * 60); //1 hour
}
}

@Override // this method is done in the EDT
protected void process(List<String> resultList){
String res = resultList.get(0);

if(!"".equals(res)){
result.setText(res);
}
}

@Override // this method is done in the EDT. Executed after executing the doInBackground() method
protected void done() {
//... clean up
}
}.execute();
}

请注意 done()将在执行 doInBackground() 之后执行完成了,这意味着,在我发布的代码中,它永远不会被执行,因为 while 循环用于定期调用 checkQuote是无限的。只需修改它,以便您可以根据需要中断该循环

进一步阅读:Concurrency in Swing

关于java - 我如何让我的程序每小时检查一次股票市场值(value)[java],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20208471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com