Java 如何每2秒更新TextArea(Jframe)中的变量?

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

---该项目旨在每2秒更新一次由
Jsoup
从网站解析的股票报价列表


程序:

  • 使用JSOUP提取报价单列表(已完成并存储在字符串变量(
    Stock
    )中)(完成)

  • 创建Jframe、JPanel、TextArea。将
    股票
    粘贴到TextArea上。因此,股票报价可以显示在Jframe TextArea上。(完成)

  • 使文本区域每2秒更新一次变量
    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++;
        }
    }