在Swing界面中显示来自外部网站的实时数据?

时间:2015-06-07 19:40:44

标签: java swing real-time

我尝试在网上搜索,但每个问题似乎都涉及网络开发。我只是想知道是否甚至可以从互联网(游戏结果和游戏事件)中获取数据,这些数据每秒或每10秒等更新一次,来自一个不是我的网站。使用Swing库接口在Java桌面客户端中显示它?如果是的话,最好的方法是什么?

谢谢你

2 个答案:

答案 0 :(得分:2)

是的,你可以做到。您应该使用java.net包来处理网络。

数据提取取决于您要从中获取数据的站点,例如:

  • 如果网站有API,例如Stack Overflow,则应使用它。
  • 如果数据显示在页面上,您可以使用jsoup之类的解析器(如果页面是html,当然)

答案 1 :(得分:1)

我在请求时获取库存数据,而不是计时器,但您可以查看我的代码并查看我如何获取库存数据。

这是JPanel的样子。它是右边的小组。

Stock Picker JPanel

这是HistoricalDataRunnable类。

package com.ggl.stock.picker.controller;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import javax.swing.SwingUtilities;

import com.ggl.stock.picker.model.Company;
import com.ggl.stock.picker.model.StockDay;
import com.ggl.stock.picker.model.StockHistory;
import com.ggl.stock.picker.model.StockPickerModel;
import com.ggl.stock.picker.view.StockPickerFrame;

public class HistoricalDataRunnable implements Runnable {

    private static final String URLString = 
                  "http://www.google.com/finance/historical?output=csv&q=";

    private Company company;

    private StockPickerFrame frame;

    private StockPickerModel model;

    public HistoricalDataRunnable(StockPickerFrame frame,
            StockPickerModel model, Company company) {
        this.frame = frame;
        this.model = model;
        this.company = company;
    }

    @Override
    public void run() {
        InputStream is = null;
        BufferedReader br = null;

        try {
            String symbol = company.getStockSymbol();

            URL url = new URL(URLString + symbol);
            URLConnection hc = url.openConnection();
            hc.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; "
                    + "Intel Mac OS X 10.4; en-US; rv:1.9.2.2) "
                    + "Gecko/20100316 Firefox/3.6.2");
            is = hc.getInputStream();
            br = new BufferedReader(new InputStreamReader(is));
            processCSVFile(br);
        } catch (MalformedURLException e) {
            e.printStackTrace();
            String message = e.getMessage();
            message = "<html>" + message;
            setMessageLabel(message);
        } catch (IOException e) {
            String message = e.getMessage();
            message = "<html>" + message;
            setMessageLabel(message);
        } finally {
            closeReaders(is, br);
        }
    }

    private void processCSVFile(BufferedReader br) throws IOException {
        String line = "";
        int count = 0;
        StockHistory history = new StockHistory(company);
        while ((line = br.readLine()) != null) {
            if (count > 0) {
                StockDay stockDay = createStockDay(line);
                if (stockDay != null) {
                    history.addStockDay(stockDay);
                }
            }
            count++;
        }
        if (history.calculateNumbers()) {
            model.addStockHistory(history);
            addStockHistory();
            setMessageLabel(" ");
        } else {
            String message = "<html>There is no data for "
                    + company.getCompanyName();
            setMessageLabel(message);
        }
    }

    private StockDay createStockDay(String line) {
        String[] parts = line.split(",");
        if (parts[1].equals("-"))
            return null;

        double open = Double.valueOf(parts[1]);
        double high = Double.valueOf(parts[2]);
        double low = Double.valueOf(parts[3]);
        double close = Double.valueOf(parts[4]);
        long volume = Long.valueOf(parts[5]);
        return new StockDay(parts[0], open, high, low, close, volume);
    }

    private void addStockHistory() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                frame.addStockHistory();
            }
        });
    }

    private void setMessageLabel(final String text) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                frame.setMessageLabel(text);
                ;
            }
        });
    }

    private void closeReaders(InputStream is, BufferedReader br) {
        try {
            if (br != null)
                br.close();
            if (is != null)
                is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

此类与Google建立网址连接,并返回历史股票信息。此信息在StockHistory实例中捕获,并存储在StockPickerModel实例中。

User-Agent属性设置为模拟浏览器。某些网站不允许程序访问其Web服务器。通过设置User-Agent属性,您可以伪装成Web浏览器。您的程序应该尊重Web服务器,而不是提交太多请求。多少取决于Web服务器。

此类还会更新视图。我们知道请求何时完成的唯一方法是HistoricalDataRunnable方法收到来自Google的响应。这个类可以更新模型和视图。

由于此类在单独的线程中运行,因此我们必须调用SwingUtilities invokeLater方法来执行任何Swing GUI命令。这就是addStockHistory和setMessageLabel方法包含在invokeLater方法中的原因。

此类显示JLabel消息中的任何错误。该股可能不会由Google保留。股票可能没有任何股票日值。将显示这些错误消息。

要查看其余代码,请查看我的Stock Picker Using Java Swing文章。