如何使用SwingWorker?

 包括萨u盾根本_173 发布于 2023-02-06 12:44

朋友,我正在开发一个Java应用程序。多数民众赞成在性能监控。关于这一点,我在一类中获得价值,而在另一类中绘制图表。我想使用swingworker交替执行这两个课程。

        ResultSet rs;
        Connection conn = null;

        conn = (Connection)getMySqlConnection();

        Statement st = conn.createStatement();
        rs = st.executeQuery("SHOW GLOBAL STATUS");
        while(rs.next())
        {
            Map_MySql.put(rs.getString(1), rs.getString(2));
        }
        conn.close();

上面的类用于收集服务器状态并将其存储在哈希图中。该类称为“ MySQLClass”。

        System.out.println("Graph Occur");
        XYDataset Dataset;
        TimeSeries Series = new TimeSeries("Random Data");
        Second sec = new Second();
        ChartPanel CPanel;
        if(Operation_Combo.getSelectedItem().toString() == "MySQL")
        {
         if(MySQLClass.Map_MySql.get(""+MainWindow.SelectedNode+"") == null)
         {
             Value = 0;
         }
         else
         {
             Value = Integer.parseInt(MySQLClass.Map_MySql.get(""+MainWindow.SelectedNode+""));
         }
         System.out.println(Value);
        }
        if(Operation_Combo.getSelectedItem().toString() == "SQL Server")
        {
         if(SqlServerClass.Map_SQLServer.get(""+MainWindow.SelectedNode+"") == null)
         {
             Value = 0;
         }
         else
         {
             Value = Integer.parseInt(SqlServerClass.Map_SQLServer.get(""+MainWindow.SelectedNode+""));
         }
         System.out.println(Value);
        }
        String CounterName = MainWindow.SelectedNode.toString();
        Series.add(sec, Value);
        Dataset = new TimeSeriesCollection(Series);
        Chart = ChartFactory.createTimeSeriesChart(CounterName, "Time", "Range", Dataset, true, false, false);
        XYPlot Plot = (XYPlot)Chart.getPlot();
        Plot.setBackgroundPaint(Color.LIGHT_GRAY);
        Plot.setDomainGridlinePaint(Color.WHITE);
        Plot.setRangeGridlinePaint(Color.RED);
        CPanel = new ChartPanel(Chart);
        Panel1.revalidate();
        Panel1.add(CPanel);
        System.out.println("Chart Added");
        Panel1.validate();
        Panel1.repaint();
        Thread.sleep((int)MainWindow.Interval_Combo.getSelectedItem() * 1000);
        System.out.println("Sleep="+((int)MainWindow.Interval_Combo.getSelectedItem() * 1000));
        System.gc();

上面的代码是在一个称为“ Graph”的类中绘制Graph的代码。我该如何使用Swing Worker交替执行此操作并在每次迭代中绘制图形。如果您知道,请帮助我。

1 个回答
  • SwingWorker 看起来很简单。

    基本上,您需要对要实现的目标做出一些基本决策。

    您是否要在运行过程中定期返回更新?

    您要返回过程的结果...还是同时返回?

    您要提供进度更新吗?

    根据您要执行的操作,将更改声明SwingWorker的方式。

    例如...

    public class HardWorker extends SwingWorker<ReturnValueType, PeriodicalType> {
    

    where ReturnValueType是工作人员将生成的最终结果,并且PeriodicalType是您要执行定期更新(可以指定自己的值)时可以发送回UI线程的对象的类型。

    您可以指定VoidObject为任何一个值,你应该不在乎

    执行该方法时,SwingWorkerwill调用doInBackground,该方法将在其自己的线程中调用,从而可以在Event Dispatching Thread之外执行长时间运行的任务。

    如果要在doInBackground方法完成之前将值发送回UI ,可以调用publish(instanceOfPeriodicalType)。最终,传递给该方法的值将传递给该process方法。

    由于可能将多个项目发送到该publish方法,因此该process方法提供了一个List<PeriodicalType>参数。调用时,此方法将在EDT的上下文中执行,从而使您可以更新UI。

    一旦doInBackground完成,它将return返回类型的返回值ReturnValueType(或者null如果您不在乎)。

    如果您对此结果感兴趣,则应使用SwingWorker#get,但应注意,该方法将阻塞直到doInBackground返回,这意味着在您知道该doInBackground方法已返回之前,不要在EDT中调用此方法。您可以使用它isDoneisCancelled方法检查工作程序的状态,或者...

    您可以使用PropertyChangeListener和监视state属性,也可以覆盖的done方法SwingWorker

    如果要提供进度更新,则可以在doInBackground方法中调用setProgress来更新工作程序的进度。这将触发一个PropertyChangeEvent命名的progress,您可以通过使用来监视它PropertyChangeListener。将在EDT的上下文中调用此侦听器。

    看一眼:

    摇摆工人

    工作线程和SwingWorker

    更多细节。

    通常,为了使用SwingWorker,您想要做的是将您的设计分成两组。EDT中可以在后台完成的所有操作以及需要完成的所有操作。

    您可以开始构建员工的基本概念。

    基本示例...

    这有很多假设。基本上,它假定已经设置了UI,并且它将用于挑选新结果并将其传递回特定系列。

    基本上,根据需要,将对工人进行骚扰,并将其传递给它。

    GraphWorker worker = new GraphWorker(series);
    worker.execute();
    

    然后,工作将执行查询并将结果传递回process方法

    public class GraphWorker extends SwingWorker<Void, String[]> {
    
        private TimeSeries series;
        private Second sec;
    
        public GraphWorker(TimeSeries series) {
            this.series = series;
            sec = new Second();
        }
    
        @Override
        protected Void doInBackground() throws Exception {
            ResultSet rs;
            Connection conn = null;
            try {
    
                conn = (Connection) getMySqlConnection();
    
                Statement st = conn.createStatement();
                rs = st.executeQuery("SHOW GLOBAL STATUS");
                while (rs.next()) {
                    publish(new String[]{rs.getString(1), rs.getString(2)});
                }
            } finally {
                conn.close();
            }
            return null;
        }
    
        @Override
        protected void process(List<String[]> chunks) {
            for (String[] value : chunks) {
    
                try {
                    int iValue = Integer.parseInt(value[1]);
                    series.add(sec, Value);
                } catch (NumberFormatException exp) {
                    exp.printStackTrace();
                }
    
            }            
        }
    
    }
    

    2023-02-06 12:48 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有