【发布时间】:2018-05-09 11:10:39
【问题描述】:
我正在创建一个动态变化的摆动框架。 这是当前布局(我在 IntelliJ IDEA 工作)
如您所见,有一个主要的JPanel 有一个JSplitPane。在JSplitPane 里面有一个JTree(左)和一个JTable(右)。
因此,当我单击 JTree 的根节点时,我想将 JTable 替换为 Editor,当单击子节点时,该表将显示在那里。
public class SessionWindow {
private JFrame mFrame;
private JPanel container;
private JTree tableTree;
private JTable tableDetails;
private JSplitPane jSplitPane;
private JScrollPane jScrollTree;
private JScrollPane jScrollTable;
private JPanel editorPanel;
private Project mProject;
private Disposable parent;
private ClientSocket socket;
public SessionWindow(Project mProject, Disposable parent, ClientSocket socket) {
super();
this.mProject = mProject;
this.parent = parent;
this.socket = socket;
mFrame = new JFrame();
mFrame.setSize(new Dimension(1024, 500));
mFrame.setResizable(true);
mFrame.setTitle("Debug window");
mFrame.setLayout(new BorderLayout());
mFrame.add(container, BorderLayout.CENTER);
mFrame.pack();
mFrame.setVisible(true);
jSplitPane.setResizeWeight(.4f);
populateDatabase();
tableTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
tableTree.addTreeSelectionListener(e -> {
DefaultMutableTreeNode node = (DefaultMutableTreeNode)
tableTree.getLastSelectedPathComponent();
/* if nothing is selected */
if (node == null) return;
IBaseModel model = (IBaseModel) node.getUserObject();
if (model instanceof DTable) {
showTablePane();
DTable table = (DTable) model;
populateTable(table);
} else if (model instanceof DDatabase) {
showEditorPane();
}
});
}
private void populateDatabase() {
socket.requestDbDetails();
DataObserver.getInstance().subscribe(listener);
}
private void showTablePane() {
jSplitPane.setRightComponent(null);
jSplitPane.setRightComponent(jScrollTree);
jSplitPane.invalidate();
}
private void showEditorPane() {
editorPanel = new JPanel();
editorPanel.add(createEditor().getComponent(), BorderLayout.CENTER);
jSplitPane.setRightComponent(null);
jSplitPane.setRightComponent(editorPanel);
jSplitPane.invalidate();
}
private Editor createEditor() {
//create an return editor
return editor;
}
}
问题是当我用editor 替换表格时,editor 是正确的组件(不完全可见,但我们可以在那里看到)
但是当尝试将editor 替换为table 时,什么也没有发生。
【问题讨论】:
-
我建议不要在 JSplitPane 中设置组件,而是使用一个带有 CardLayout 的面板,其中包含要交换的两个组件。
-
@MatheM 我没明白这一点
-
发布正确的minimal reproducible example 来说明问题。所以从简单的事情开始。使用 JSplitPane 创建一个 JFrame,并将两个组件添加到拆分面板(例如一个按钮和一个标签)。将拆分窗格添加到框架的 BorderLayout.PAGE_START。他们创建了两个按钮并将它们添加到框架的 LINE_START 和 LINE_END。然后,当您单击按钮时,您会更改拆分窗格右侧的组件。关键是首先让这个简单的代码工作。如果您有问题,您可以在论坛中发布该代码。如果你工作,那么你修复你的真实应用程序。
-
@Godwin 这只是一个建议。 CardLayout 是包含多个组件的布局管理器(为简单起见,JPanels),您可以设置应该显示哪个组件。因此,您将创建一个编辑器面板和一个表格面板,将两个面板添加到具有 CardLayout 的面板,然后将此卡片布局面板设置为正确的组件。然后在某些事件中,您会“告诉”卡片布局面板显示适当的“卡片”。
-
@MatheM Yeh 我已经完成了,现在它正在工作