java - JSplitPane 中如何动态改变组件
问题描述
我正在创建一个动态变化的摆动框架。这是当前布局(我在 IntelliJ IDEA 工作)
如您所见,有一个 mainJPanel
有一个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
空时。
解决方案
以下代码适用于我。我只需删除旧的孩子并添加新的孩子,记住分隔线的位置并重置它。我不知道是否需要重新验证/重新绘制,但我添加它是为了更好地衡量。
/**
* replace a child of a splitPane with another
* @param oldChild
* @param newChild
*/
public void replaceSplitPaneChild(JComponent oldChild, JComponent newChild) {
JSplitPane parent = (JSplitPane) oldChild.getParent();
int dividerLocation = parent.getDividerLocation();
parent.remove(oldChild);
parent.add(newChild);
parent.setDividerLocation(dividerLocation);
newChild.revalidate();
newChild.repaint();
}
推荐阅读
- c++ - 在物理键盘上触发按键
- firebase - 您如何编写安全规则以确保用户只能向 Cloud Firestore 文档写入一次?
- ruby-on-rails - 如何让引导选项卡链接链接到 ruby on rails 中的另一个部分文件以显示内容?
- python - pip 不安装非 .py 文件(即使它们被打包在 wheel 中)
- python - 可以告诉 pip 或 Poetry 不要安装 GPL 许可的软件包吗?
- xcode - 构建 Unity/Firebase 项目时 XCode 中架构 arm64 的未定义符号
- spring-boot - Redis 集群模式 - 副本不工作
- java - 合约网络协议上有多少代理 JADE 处理
- bash - Mac 脚本问题:将冒号添加为字符串
- python - 天蓝色的 ubuntu 服务器上的 Flask 应用程序未运行