使用JavaFX显示JTable

使用JavaFX显示JTable,java,swing,javafx,web-scraping,jtable,Java,Swing,Javafx,Web Scraping,Jtable,我想从网页上读取数字并在程序中使用它们。此程序显示网页,但如何显示网页下方的表格?以及如何使用网页中的日期和价格填充表格 import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.sw

我想从网页上读取数字并在程序中使用它们。此程序显示网页,但如何显示网页下方的表格?以及如何使用网页中的日期和价格填充表格

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.paint.Color;

public class Step4 {

    private void initAndShowGUI(final String url) {
        // This method is invoked on the EDT thread
        JFrame frame = new JFrame("Swing and JavaFX");

        final JFXPanel fxPanel = new JFXPanel();
        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BorderLayout());
        mainPanel.add(fxPanel, BorderLayout.NORTH);

        TableModel dataModel = new AbstractTableModel() {
            private static final long serialVersionUID = -147208558114868864L;
            public int getColumnCount() { return 10; }
            public int getRowCount() { return 10;}
            public Object getValueAt(int row, int col) { return new Integer(row*col); }
        };
        JTable table = new JTable(dataModel);
        JScrollPane tableContainer = new JScrollPane(table);

        JPanel display = new JPanel();
        display.setLayout(new BorderLayout());
        display.add(tableContainer, BorderLayout.CENTER);
        mainPanel.add(display, BorderLayout.SOUTH);

        frame.add(mainPanel);

        frame.pack();
        frame.setSize(1000, 650);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                initFX(fxPanel, url);
            }
       });
    }

    private void initFX(JFXPanel fxPanel, String url2) {
        // This method is invoked on the JavaFX thread
        Scene scene = createScene(url2);
        fxPanel.setScene(scene);
    }

    private Scene createScene(String url2) {

        Scene scene = new Scene(new Browser_1(url2),750,500, Color.web("#666970"));
        return (scene);
    }

    public static void main(String[] args) {

        final String url = "https://www.tsp.gov/investmentfunds/shareprice/sharePriceHistory.shtml";
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                Step4 s = new Step4();
                s.initAndShowGUI(url);
            }
        });
    }
}

class Browser_1 extends Region {

    final WebView browser = new WebView();
    final WebEngine webEngine = browser.getEngine();

    public Browser_1(String url) {
        //apply the styles
        getStyleClass().add("browser");
        // load the web page
        webEngine.load(url);
        //add the web view to the scene
        getChildren().add(browser);
    }

    @SuppressWarnings("unused")
    private Node createSpacer() {
        Region spacer = new Region();
        HBox.setHgrow(spacer, Priority.ALWAYS);
        return spacer;
    }

    @Override protected void layoutChildren() {
        double w = getWidth();
        double h = getHeight();
        layoutInArea(browser,0,0,w,h,0, HPos.CENTER, VPos.CENTER);
    }

    @Override protected double computePrefWidth(double height) {
        return 750;
    }

    @Override protected double computePrefHeight(double width) {
        return 500;
    }
}
概括地说

  • 将合适的侦听器添加到所使用的后台
    工作人员

  • 在合适的监听器中,可能使用所示的方法,为感兴趣的结果创建web页面

  • 构建一个
    TableModel
    ,在请求时将结果提供给
    JTable
    ,可能使用所示的方法

  • 发布一个Swing事件,该事件使用更新的
    表格模型调用
    setModel()
    ;该表将相应地更新自身

基于此,下面的
invalizationlistener
显示由
getDocumentURI()
返回的结果


这已经包括在内了。您现在有了一个完整的工作示例;如果你有困难,在一个新的问题中使用/引用它,重点是解析。您可以通过单击左侧的接受此答案。问题是显示页面并读取表格中的数据。您的代码和解释对于显示和访问DOM来说非常优秀和清晰,但我不知道如何遍历DOM来提取值。您可以修改您的答案以包括遍历DOM以提取值。样本是DateCol A,201517.5,201518.3,2015年9月4日。您是如何快速响应的?我还在改写评论。。。我会检查你的链接。可能是矩阵中的故障。:-)
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javafx.application.Platform;
import javafx.beans.Observable;
import javafx.concurrent.Worker;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

/**
 * @see https://stackoverflow.com/a/32396344/230513
 * @see https://stackoverflow.com/a/31576647/230513
 */
public class WebViewTable {

    private JTable table;
    private WebView webView;

    private void initAndShowGUI() {
        // This method is invoked on the EDT thread
        JFrame frame = new JFrame("WebViewTable");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JFXPanel fxPanel = new JFXPanel(){

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(800, 400);
            }
        };
        frame.add(fxPanel, BorderLayout.CENTER);
        table = new JTable(){

            @Override
            public Dimension getPreferredScrollableViewportSize() {
                return new Dimension(800, 100);
            }
        };
        frame.add(new JScrollPane(table), BorderLayout.SOUTH);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        Platform.runLater(() -> {
            initFX(fxPanel);
        });
    }

    private void initFX(JFXPanel fxPanel) {
        // This method is invoked on the JavaFX thread
        Scene scene = createScene();
        fxPanel.setScene(scene);
    }

    private Scene createScene() {
        StackPane root = new StackPane();
        Scene scene = new Scene(root);
        webView = new WebView();
        WebEngine webEngine = webView.getEngine();
        Worker worker = webEngine.getLoadWorker();
        worker.stateProperty().addListener((Observable o) -> {
            if (worker.getState() == Worker.State.SUCCEEDED) {
                EventQueue.invokeLater(() -> {
                    table.setModel(new AbstractTableModel() {
                        @Override
                        public String getColumnName(int col) {
                            return "Document URI";
                        }

                        @Override
                        public int getColumnCount() {
                            return 1;
                        }

                        @Override
                        public int getRowCount() {
                            return 1;
                        }

                        @Override
                        public Object getValueAt(int row, int col) {
                            return webEngine.getDocument().getDocumentURI();
                        }
                    });
                });
            }
        });
        webEngine.load("https://example.com");
        root.getChildren().add(webView);
        return scene;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new WebViewTable()::initAndShowGUI);
    }
}