gpt4 book ai didi

java - DefaultTreeCellRenderer() 定期执行

转载 作者:行者123 更新时间:2023-12-01 12:23:11 24 4
gpt4 key购买 nike

我编写了一些程序来监视 UNIX 服务器上的进程。我的代码的主要部分如下所示:

Class FeedMonitor {
//.............
private volatile boolean monitor = true;
private volatile String feedShRez;
private volatile DefaultMutableTreeNode envNode;
//.............
public void prepareGUI() {
//..............
//
SwingWorker worker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
sh = new Shell(env);
System.out.println("Swing worker for check feed statuses started...");
while (monitor) {
// get running feeds
feedShRez = sh.getFeedsStatus(rez);
System.out.println(feedShRez);
Thread.sleep(15000);
System.out.println("Swing worker for check feed statuses is waking up...");
}
return null;
}
@Override
protected void done() {
System.out.println("Swing worker completed.");
super.done();
System.out.println("Set monitor object to false");
feedShRez = "";
}
};
worker.execute();
//......
// This action I would like to execute in thread periodically
envTree.setCellRenderer(new DefaultTreeCellRenderer() {
public Component getTreeCellRendererComponent(JTree pTree,
Object pValue, boolean pIsSelected, boolean pIsExpanded,
boolean pIsLeaf, int pRow, boolean pHasFocus) {

System.out.println("Node is " + pValue.toString());
super.getTreeCellRendererComponent(
pTree, pValue, pIsSelected,
pIsExpanded, pIsLeaf, pRow,
hasFocus);

// we are under environment tree
if ( envNode !=null && ((DefaultMutableTreeNode)pValue).getParent() == envNode
&& feedShRez != null && !feedShRez.isEmpty()){
if (feedShRez.contains(pValue.toString())) {
System.out.println("Found feed " + pValue.toString() + " in strings");
setForeground(Color.GREEN);
} else {
setForeground(Color.RED);
}
}

return (this);
}
});

// In this thread I would like to execute action above
// but it works only one or two times
SwingWorker worker2 = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
while (monitor) {
//System.out.println("enter to second swing worker");
//envTree.repaint();
//mainFrame.repaint();
// should fire DefaultTreeCellRenderer action
envTree.setSelectionRow(0);
//envTree.setFont(null);
Thread.sleep(3000);
}
return null;
}
@Override
protected void done() {
super.done();
monitor = false;
System.out.println("Done in second swing worker");
//progressBar.setVisible(false);
}
};
worker2.execute();

正如您从上面的代码中看到的,我使用了两个 SwingWorkers。在其中一个工作人员中,我向服务器发出请求以检查哪些进程正在运行我尝试通过调用 envTree.setSelectionRow(0) 来模拟 envTree.setCellRenderer(new DefaultTreeCellRenderer() 操作),以在 JTree 中用绿色和红色标记正在运行和关闭的进程。这里的主要问题是这个操作对我来说不能正常工作,它只能触发一两次,但是当我手动单击 JTree 时它总是执行。请有人对此提出建议。提前感谢。

最佳答案

如果我正确理解你的问题,你可以使用 shell 获得某种进程列表。该列表存储在一个字段中并用于创建 TreeModel。您希望使用 TreeModel 的新可用信息定期重新绘制 JTree

与所有 Swing 组件一样,JTree 具有内置机制,可以在底层数据发生更改时触发重绘。您更改模型,模型会触发更改事件,并且 View 会拾取该事件。然后 View 就知道它必须重新绘制。

所以,我会提出这样的解决方案:

  • 检索进程列表(并且当前在循环中更新字段)的 SwingWorker 不再使用该字段。相反,它使用 SwingWorker#publish 方法来发布中间结果。然后,您可以重写 SwingWorker#process 方法来处理这些结果。此方法在 EDT 上调用,并且可以使用新信息更新 TreeModel。确保在更改 TreeModel 时触发正确的事件。
  • TreeModel 应包含与正确呈现数据相关的所有信息
  • 由于对 TreeModel 和相应事件所做的更改,JTree 将安排重新绘制。不需要第二个 SwingWorker。由于模型包含渲染器所需的所有信息,因此渲染器可以返回正确状态的 Component

关于java - DefaultTreeCellRenderer() 定期执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26524209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com