Java 如何每2秒更新TextArea(Jframe)中的变量?
---该项目旨在每2秒更新一次由Java 如何每2秒更新TextArea(Jframe)中的变量?,java,swing,timer,jframe,jsoup,Java,Swing,Timer,Jframe,Jsoup,---该项目旨在每2秒更新一次由Jsoup从网站解析的股票报价列表 程序: 使用JSOUP提取报价单列表(已完成并存储在字符串变量(Stock)中)(完成) 创建Jframe、JPanel、TextArea。将股票粘贴到TextArea上。因此,股票报价可以显示在Jframe TextArea上。(完成) 使文本区域每2秒更新一次变量stock(执行) 代码: 在这里工作的主代码:Main方法 在main中,在此处创建Jframe、panel、textarea。然后,将stock粘贴到J
Jsoup
从网站解析的股票报价列表
程序:
Stock
)中)(完成)股票
粘贴到TextArea上。因此,股票报价可以显示在Jframe TextArea上。(完成)stock
(执行)代码:
在这里工作的主代码:Main方法 在main中,在此处创建Jframe、panel、textarea。然后,将
stock
粘贴到JLabel上
public static void main(String[] args) throws Exception {
// Timer timer = new Timer();
//timer.schedule(new Stock2(), 2000, 2000);
// javax.swing.Timer timer = new javax.swing.Timer(1000, new ActionListener() {
// public void actionPerformed(ActionEvent e) {
Stock2 stock3=new Stock2();
stock3.run();
final JFrame frame = new JFrame("Stock");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
///------------------------------
frame.setLayout(new BorderLayout());
frame.setSize(500, 500);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
///------------------------------
final JPanel panel = new JPanel();
///------------------------------
JTextArea textArea = new JTextArea(25,40);
///------------------------------
JScrollPane scroll= new JScrollPane(textArea);
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
///------------------------------
textArea.setFont(new Font("Serif",Font.BOLD,16));
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
textArea.setOpaque(false);
textArea.setEditable(false );
// textArea. append("g");
textArea.setSize( textArea.getPreferredSize() );
textArea.setText(String.valueOf(stock));
//textArea. insert(" ", 5);
// textArea.setTabSize(50);
///------------------------------
frame.add(panel);
panel.add(scroll);
// frame.add(scroll);
frame.pack();
// frame.setVisible(true);
}
**搜索之后,我知道我应该使用
Swing Timer
。此外,我尝试使用并添加到main方法。但是出现了错误。如何解决?***您希望每2秒执行一次任务,因此摆动计时器似乎是实现这一点的方法,但由于该任务涉及到查询internet内容,因此此过程需要的时间不多,这可能会导致如果像Swing计时器一样在GUI事件线程上运行,请冻结GUI。相反,您可能应该使用SwingWorker,并且在SwingWorker内部使用,而不是Swing计时器,因为您将退出Swing事件线程,以重复调用代码以获取所需的数据,然后使用SwingWorker的命令将信息传递给GUI发布/处理方法对。查看教程,了解如何执行此操作的详细信息,事实上,您可能会创建一个SwingWorker
,以便发布/处理知道您希望传输的是文本数据
另一个不相关的问题是,静态main方法中有太多的代码和太多的GUI代码,如果不进行重构,您将有一个很难调试、测试和维护的程序。通过为每个职责创建单独的类来解决这一问题
其他问题:
- 永远不要设置JTextArea的首选大小。执行此操作,看看文本最终填充可见文本区域时会发生什么。然后再添加一些文本,JScrollPane将不会滚动,因为您已经固定了文本区域的pref大小。改为设置它的列和行属性
import java.awt.BorderLayout;
import java.awt.Font;
import java.util.List;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
public class StockEg {
// main method starts Swing event thread and
// calls create and show
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
// create pertinent classes and start them running. that's it
private static void createAndShowGui() {
// create and display GUI
StockGui stockGui = new StockGui();
JFrame frame = new JFrame("StockEg");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(stockGui.getMainPanel());
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
// create worker and hook up with GUI
MyWorker myWorker = new MyWorker(stockGui);
myWorker.execute(); // start worker
}
}
1) 为了更快地获得更好的帮助,请发布一个or。2) 使用缩进代码行和代码块的逻辑和一致形式。缩进的目的是使代码的流程更易于遵循!3) 在源代码中只需要一行空白就可以了。
{
之后或}
之前的空行通常也是多余的。请查看要回答的编辑。@Hovercraft满是鳗鱼我试图替换你的代码而不是我的代码。但是出现了一些错误。(可能前两种方法不合适。仍然需要一些修改)Mon——永远不要借用我们的代码——借用想法,编写自己的代码。@Hovercraft满是鳗鱼嘿,先生,我是JAVA新手。我已经为代码工作了很长时间。我仍然无法使事件驱动成功。因为上次我没有显示public void Parsing(),所以您无法计算Parsing()。你想帮助我结合整个代码还是提出一些见解
public static void main(String[] args) throws Exception {
// Timer timer = new Timer();
//timer.schedule(new Stock2(), 2000, 2000);
// javax.swing.Timer timer = new javax.swing.Timer(1000, new ActionListener() {
// public void actionPerformed(ActionEvent e) {
Stock2 stock3=new Stock2();
stock3.run();
final JFrame frame = new JFrame("Stock");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
///------------------------------
frame.setLayout(new BorderLayout());
frame.setSize(500, 500);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
///------------------------------
final JPanel panel = new JPanel();
///------------------------------
JTextArea textArea = new JTextArea(25,40);
///------------------------------
JScrollPane scroll= new JScrollPane(textArea);
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
///------------------------------
textArea.setFont(new Font("Serif",Font.BOLD,16));
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
textArea.setOpaque(false);
textArea.setEditable(false );
// textArea. append("g");
textArea.setSize( textArea.getPreferredSize() );
textArea.setText(String.valueOf(stock));
//textArea. insert(" ", 5);
// textArea.setTabSize(50);
///------------------------------
frame.add(panel);
panel.add(scroll);
// frame.add(scroll);
frame.pack();
// frame.setVisible(true);
}
import java.awt.BorderLayout;
import java.awt.Font;
import java.util.List;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
public class StockEg {
// main method starts Swing event thread and
// calls create and show
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
// create pertinent classes and start them running. that's it
private static void createAndShowGui() {
// create and display GUI
StockGui stockGui = new StockGui();
JFrame frame = new JFrame("StockEg");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(stockGui.getMainPanel());
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
// create worker and hook up with GUI
MyWorker myWorker = new MyWorker(stockGui);
myWorker.execute(); // start worker
}
}
// gui class
class StockGui {
private static final int TA_ROWS = 20;
private static final int TA_COLS = 40;
private static final Font TA_FONT = new Font(Font.SERIF, Font.BOLD, 16);
private JTextArea textArea = new JTextArea(TA_ROWS, TA_COLS);
private JPanel mainPanel = new JPanel(new BorderLayout());
public StockGui() {
textArea.setFont(TA_FONT);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
mainPanel.add(scrollPane, BorderLayout.CENTER);
}
// get main JPanel that holds everything
public JPanel getMainPanel() {
return mainPanel;
}
// allow outside classes to add text to JTextArea
public void appendText(String text) {
textArea.append(text);
}
}
// SwingWorker to run long-running process
class MyWorker extends SwingWorker<Void, String> {
private static final long PERIOD = 2000; // for timer
private StockGui stockGui; // gui reference
// non-GUI class that parses web page
private MyJSoupParser myJSoupParser = new MyJSoupParser();
public MyWorker(StockGui stockGui) {
this.stockGui = stockGui; // hook up gui reference
}
@Override
protected Void doInBackground() throws Exception {
// create java.util.Timer
java.util.Timer myTimer = new java.util.Timer(true);
// start timer with task
myTimer.scheduleAtFixedRate(new MyTask(), 0, PERIOD);
return null;
}
// method to send text to the GUI
@Override
protected void process(List<String> chunks) {
for (String chunk : chunks) {
stockGui.appendText(chunk + "\n");
}
}
// timer task that extracts text from the JSoup parser
// and then calls publish to send text to process method and GUI
private class MyTask extends TimerTask {
@Override
public void run() {
String parsedText = myJSoupParser.getText();
publish(parsedText);
}
}
}
// dummy class just for demo purposes
class MyJSoupParser {
private int dummyCounter = 0;
public String getText() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {}
return "Parsed Text: " + dummyCounter++;
}
}