朋友们,我正在开发一个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线程的对象类型(这些是您可以自己指定的值)。
如果不关心,您可以为这两个值中的任何一个指定Void
或Object
执行时,SwingWorker
将调用doInBackground
,此方法将在其自己的线程内调用,允许在事件调度线程之外执行长时间运行的任务。
如果要在doInBackground
方法完成之前将值发送回UI,可以调用publish(instanceOfPeriodicalType)
。传递给该方法的值最终将传递给process
方法。
因为可以将多个项目发送到publish
方法,所以process
方法提供了一个List<PeriodicalType>
参数。调用时,此方法将在EDT的上下文中执行,允许您更新UI。
一旦doInBackground
完成,它将return
作为类型为ReturnValueType
(或者null
,如果您不在乎的话)的返回值。
如果您对此结果感兴趣,您应该使用SwingWorker#get
,但您应该注意,在doInBackground
返回之前,此方法将被阻塞,这意味着在知道doInBackground
方法返回之前,您不应该在EDT中调用此方法。您可以使用它的isDone
或isCancelled
方法来检查worker的状态,或者。。。
您可以使用PropertyChangeListener
并监视state
属性,或者覆盖SwingWorker
的done
方法。
如果你想提供进度更新,而在doInBackground
方法中,你可以调用setProgress
来更新工人的进度。这将触发一个名为progress
的PropertyChangeEvent
,您可以通过使用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());
它工作正常。。。