如何使用SwingWorker



朋友们,我正在开发一个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交替执行此操作,并在每次迭代中绘制图形。如果你知道,请帮帮我。

SwingWorker使用起来似乎要简单得多。

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

  • 您想在进程运行时定期返回更新吗
  • 是否要返回过程的结果。。。还是两者兼而有之
  • 是否要提供进度更新

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

例如。。。

public class HardWorker extends SwingWorker<ReturnValueType, PeriodicalType> {

其中,ReturnValueType是将由工作者生成的最终结果,PeriodicalType是如果您希望执行定期更新,则可以发送回UI线程的对象类型(这些是您可以自己指定的值)。

如果不关心,您可以为这两个值中的任何一个指定VoidObject

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

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

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

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

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

您可以使用PropertyChangeListener并监视state属性,或者覆盖SwingWorkerdone方法。

如果你想提供进度更新,而在doInBackground方法中,你可以调用setProgress来更新工人的进度。这将触发一个名为progressPropertyChangeEvent,您可以通过使用PropertyChangeListener来监视它。将在EDT的上下文中呼叫此侦听器。

看看:

  • 摇摆工人
  • Worker线程和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();
}
}            
}
}

一开始,我只是从MySQL.execute()中调用doInBackground()函数使用此。然后在doInBackground()函数中,我只收集这些计数器值并使用publish()函数传递特定值。这里我只传递标志来表示数据的收集成功。发布(GraphLock)

调用Publish()后;方法,Process(List chunks)方法被调用。在此基础上,我只检查条件并调用Graph类来生成图。

if(GraphLock==true)
SwingUtilities.invokeLater(new Graph());

它工作正常。。。

相关内容

  • 没有找到相关文章

最新更新