如何使用SwingWorker?

2024-03-09

朋友们,我正在开发一个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”的类中绘制图形的代码。 我如何使用 Swing Worker 来执行此操作并在每次迭代中绘制图表。如果你知道请帮助我。


SwingWorker使用它们看起来要简单得多。

基本上,您需要就您想要实现的目标做出一些基本决定。

  • 您想在进程运行时定期返回更新还是
  • 您想返回该过程的结果...还是两者都返回?
  • 您想提供进展更新吗?

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

例如...

public class HardWorker extends SwingWorker<ReturnValueType, PeriodicalType> {

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

您可以指定Void or Object对于这些值中的任何一个你应该不关心

执行时,SwingWorker将会通知doInBackground,此方法将在其自己的线程内调用,从而允许在事件调度线程之外执行长时间运行的任务。

如果您想在之前将值发送回 UIdoInBackground方法执行完毕,可以调用publish(instanceOfPeriodicalType)。传递给此方法的值最终将传递给process method.

因为有可能将多个项目发送到publish方法,将process方法提供了一个List<PeriodicalType>争论。调用时,此方法将在 EDT 上下文中执行,从而允许您更新 UI。

Once doInBackground完成后,将会return类型的返回值ReturnValueType (or null如果你不在乎)。

如果您对此结果感兴趣,您应该使用SwingWorker#get,但你应该注意这个方法将阻塞,直到doInBackground返回,这意味着您不应该在 EDT 中调用此方法,除非您知道doInBackground方法已返回。您可以使用它来检查工作人员的状态isDone or isCancelled方法,或者...

你可以使用PropertyChangeListener并监控state属性或覆盖done的方法SwingWorker.

如果您想提供进度更新,则在doInBackground方法,你可以调用setProgress更新工人的进度。这将触发一个PropertyChangeEvent named progress,您可以通过使用PropertyChangeListener。对此侦听器的调用将在 EDT 的上下文中进行。

看一眼:

  • 摇摆工人 http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html
  • 工作线程和 SwingWorker http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

更多细节。

一般来说,为了使用SwingWorker,您想要做的是将您的设计分成两组。可以在后台完成的所有事情以及需要在 EDT 内完成的所有事情。

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

基本示例...

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

基本上,按照要求,工人会被疯狂,系列会传递给它......

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

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

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

        }            
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用SwingWorker? 的相关文章

随机推荐

  • 检测登录页面中的表单身份验证超时

    当您将表单身份验证设置为在访问受保护页面时重定向到 login aspx 时 有什么好方法可以在 login aspx 中检测用户是否因为尚未登录而被发送到那里 或者因为他们的表单身份验证票证已存在已到期 我想显示 您已超时 消息 在这个问
  • 表单未提交到数据库[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 因此 当我在表单上输入信息后 它会使用新表单刷新 new php 页面 但不会提交任何信息 我没有收到任何错误 就像我在页面上单击
  • Python 中频谱图的 FFT

    我将如何使用 Python 从 WAV PCM 文件读取频率峰值 然后能够生成它的图像以进行频谱图分析 我正在尝试制作一个程序 允许您读取任何音频文件 将其转换为 WAV PCM 然后找到峰值和截止频率 Python 波库 http doc
  • Eclipse 注释/取消注释快捷方式?

    我认为这很容易实现 但到目前为止我还没有找到评论 取消评论快捷方式的解决方案Java class editor and jsf faceted webapp XHTML file editor to quickly comment unco
  • Node.JS 中的 createReadStream

    所以我使用了 fs readFile 它给了我 致命错误 CALL AND RETRY LAST 分配失败 进程超出 记忆 由于 fs readFile 在调用回调之前将整个文件加载到内存中 我应该使用 fs createReadStrea
  • CSS 过渡在悬停时闪烁

    太棒了 你用宝贵的时间阅读我的问题 我正在尝试在悬停时翻转 div 一切都很顺利 但在转换过程中它会闪烁 看起来几乎像是翻转了多次 这破坏了翻转的整体效果 下面是我的代码和小提琴 小提琴 FIDDLE http jsfiddle net h
  • WinRT 应用程序中的 app.config 相当于什么?

    在 Windows 桌面开发 WinForms WPF 中 app config是放置应用程序中使用的连接字符串或 uri 等内容的潜在位置 这允许最终用户在应用程序范围内更改这些设置 而无需开发人员重新构建和重新部署 WinRT应用程序中
  • Intellij / Android Studio 可以折叠注释吗?

    我在intellij中注释掉了这段代码 如您所见 此处无法折叠评论 然而 Webstorm 中相同的注释块可能会被折叠 有没有办法在intellij Android Studio中配置注释折叠 折叠任意选定的块 在编辑器中选择连续的代码片段
  • Django CSRF 框架有很多失败

    我的站点上的 CSRF Django 中间件 来自 SVN trunk 的版本 出现了很多失败 我得到的唯一错误是 CSRF 失败 原因 CSRF 令牌丢失或不正确 我如何诊断这些 CSRF 错误来自何处 我自己无法导致 CSRF 错误 但
  • 验证错误:向后分支上存在未初始化的对象/JVM 规范 4.10.2.4

    The JVM 规范 4 10 2 4 版本 7 最后一段 http docs oracle com javase specs jvms se7 html jvms 4 html jvms 4 10 2 4 says 如果未初始化对象的特殊
  • 更改 EditText setError 可绘制重力

    对于将要填充 RTL 文本的 EditText 有没有办法改变错误可绘制对象 当然还有弹出窗口 的重力 这是一个常规错误可绘制的示例 因此 由于输入的文本是 RTL 我希望弹出窗口显示在 EditText 的左侧 我尝试应用自定义绘图 但是
  • JavaFX 在列表视图中显示字符串附近的图像[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我想在列表视图中的字符串附近显示一条消息我尝试查找它但我不太理解它我从网站上尝试了这个http docs oracle com javafx
  • 如何在 spring 中将图像转换为多部分文件

    我有一个图像文件并正在创建File具有该图像的对象 File file new File E Shared Data Images xyz jpg 上面的行正在创建一个file具有某种尺寸的物体 例如440272 我需要转换上面的image
  • 我使用 getifaddrs 得到错误的 IP 地址

    获取以太网指定IP地址的函数 char get ethernet ip const char ethernet char ip size t len struct ifaddrs ips int rc getifaddrs ips if r
  • 通过 mmap 文件进行 IPC:应该使用原子和/或易失性吗?

    我使用 mmap 文件在进程之间共享数据 代码是这样的 struct Shared int Data int file open file dat O RDWR Shared shared static cast
  • 在 Python 中利用蒙特卡洛预测收入

    我正在尝试在我的 Python 代码中实现蒙特卡罗模拟 这将帮助我确定实现与收入目标相关的各种阈值的几率 例如 我们每个财年达到 6 000 美元 7 000 美元或 8 000 美元的可能性有多大 我能够计算预期值 但还没有编写模拟代码
  • C中的浅拷贝和深拷贝

    我尝试用谷歌搜索这个 但结果只弹出面向对象的语言 根据我的理解 浅复制是复制结构的某些成员 所以可以说一个结构是 typedef struct node char ok int hi int yep struct node next nod
  • 如何避免在选项卡栏状态下堆叠导航历史记录

    选项卡 A 选项卡 B 选项卡 C 如下所示的状态 选项卡 a 选项卡 b 选项卡 c 我想关闭应用程序 就像在每个选项卡状态切换时没有导航历史记录一样 例如 我在选项卡 A 中 然后单击选项卡 B 然后从现在开始单击选项卡 C 如果用户按
  • 使用关联进行分页的 grails 中 Hibernate 查询的不同结果

    我有三个相互关联的班级 最初 我构建没有分页的查询 所有搜索结果都很好 但现在我需要分页并且不想打扰我的初始查询模式 有什么方法可以得到明显的结果 Class Department int id String name static has
  • 如何使用SwingWorker?

    朋友们 我正在开发一个java应用程序 这就是性能监控 在此基础上 我在一个类中获取值并在另一类中绘制图表 我想使用 Swingworker 交替执行这两堂课 ResultSet rs Connection conn null conn C