gpt4 book ai didi

java - 使用 JavaFX 显示 JTable

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

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

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;
}
}

最佳答案

大纲,

  • WebEngine 使用的后台 Worker 添加合适的监听器.

  • 在那个合适的监听器中,traverse Document Object Model感兴趣结果的网页,可能使用显示的方法 here .

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

  • 发布一个使用更新后的 TableModel 调用 setModel() 的 Swing 事件;该表将相应地自行更新。

基于此example , 下面的 InvalidationListener 显示了 getDocumentURI() 返回的结果。

image

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);
}
}

关于java - 使用 JavaFX 显示 JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32393096/

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