我正在创建一个带有 rootNode 的 Jtree,然后创建另一个异步更新根节点的线程。
如果我在某个 JPanel 中独立运行这个 Jtree,它的效果非常好,它甚至可以在项目的某个地方工作,但是我被要求在一些新的 swing 组件中拥有这个 Jtree。
在新的 Swing 面板中,它不会完全填充,它只会填充在 Jtree 呈现在屏幕上之前插入的节点(开始时几毫秒)。一旦 Jtree 被渲染,它就不会被更新。现在有趣的部分我还在节点上做了一个鼠标监听器,这样我就可以通过右键单击创建节点函数来创建一个新节点,并创建一个新节点并将其添加到 Jtree 根节点上。
要添加的重要一点是我使用 newThread(){void run}).start() 方法创建一个线程以在 Jtree 上添加节点,因为我以前从未觉得需要 SwingUtilities.invokeLater 方法。但是现在如果我使用 SwingUtilities.invokeLater 方法而不是主窗口也没有打开它只是在启动期间停止,我只是检查了 SwingUtilities.invokeLater 也可以与旧组件一起正常工作,当然也可以独立正常工作。
我确实调用了 model.nodeStructureChanged(changedNode); 添加节点后,这就是它之前工作正常的原因。
请提供帮助,代码难以提取并且 Jtree 代码之前工作正常,可能是某些组件阻止了包含小部件以异步刷新自身?
编辑 更新以包含一些代码,我正在使用 Nick 提供的 Temp 类:-
public BasicGraphEditor(String appTitle, mxGraphComponent component)
{
// Stores and updates the frame title
this.appTitle = appTitle;
// Stores a reference to the graph and creates the command history
graphComponent = component;
final mxGraph graph = graphComponent.getGraph();
undoManager = createUndoManager();
// Do not change the scale and translation after files have been loaded
graph.setResetViewOnRootChange(false);
// Updates the modified flag if the graph model changes
graph.getModel().addListener(mxEvent.CHANGE, changeTracker);
// Adds the command history to the model and view
graph.getModel().addListener(mxEvent.UNDO, undoHandler);
graph.getView().addListener(mxEvent.UNDO, undoHandler);
// Keeps the selection in sync with the command history
mxIEventListener undoHandler = new mxIEventListener()
{
@Override
public void invoke(Object source, mxEventObject evt)
{
List<mxUndoableChange> changes = ((mxUndoableEdit) evt
.getProperty("edit")).getChanges();
graph.setSelectionCells(graph
.getSelectionCellsForChanges(changes));
}
};
undoManager.addListener(mxEvent.UNDO, undoHandler);
undoManager.addListener(mxEvent.REDO, undoHandler);
// Creates the graph outline component
graphOutline = new mxGraphOutline(graphComponent);
// Creates the library pane that contains the tabs with the palettes
libraryPane = new JTabbedPane();
/////////////////////////////////////////////////
// Only change i have done here: start
////////////////////////////////////////////////
Temp tempExplorer = new Temp();
libraryPane.add("new Explorere", tempExplorer);
/////////////////////////////////////////////////
// Only change i have done here: End
////////////////////////////////////////////////
// Creates the inner split pane that contains the library with the
// palettes and the graph outline on the left side of the window
JSplitPane inner = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
libraryPane, graphOutline);
inner.setDividerLocation(320);
inner.setResizeWeight(1);
inner.setDividerSize(6);
inner.setBorder(null);
// Creates the outer split pane that contains the inner split pane and
// the graph component on the right side of the window
JSplitPane outer = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, inner,
graphComponent);
outer.setOneTouchExpandable(true);
outer.setDividerLocation(200);
outer.setDividerSize(6);
outer.setBorder(null);
// Creates the status bar
statusBar = createStatusBar();
// Display some useful information about repaint events
installRepaintListener();
// Puts everything together
setLayout(new BorderLayout());
add(outer, BorderLayout.CENTER);
add(statusBar, BorderLayout.SOUTH);
installToolBar();
// Installs rubberband selection and handling for some special
// keystrokes such as F2, Control-C, -V, X, A etc.
installHandlers();
installListeners();
updateTitle();
}
上面的类来自 Jgraph 库,如https://github.com/jgraph/jgraphx 我只是像上面一样添加 jtree 组件,没有其他更改。请帮忙。