You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击按钮后无法显示JideSoft DockablePanel的问题求助

JideSoft Dockable Panel 点击按钮不生效的解决方案

核心问题

你创建的DockableBarDockableHolderPanel(承载可停靠面板的核心容器)从未添加到主JFrame中,导致即使调用activateFrame方法,面板也没有渲染载体,自然无法显示。

具体修改步骤

  1. 将HolderPanel设为主窗口内容容器
    把包含标签和按钮的主面板添加到DockableBarDockableHolderPanel的中心区域,再将HolderPanel设置为JFrame的内容窗格。DockableBarDockableHolderPanel默认使用BorderLayout,主面板会占据中心,可停靠面板则在设置的侧边(EAST)自动隐藏。

  2. 调整DockableFrame初始状态
    移除frame1.getContext().setCurrentMode(DockContext.STATE_HIDDEN);,保留STATE_AUTOHIDE作为初始状态,确保自动隐藏的面板能被正常激活显示。

修改后的完整代码

import java.awt.BorderLayout;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import com.jidesoft.action.DockableBarDockableHolderPanel;
import com.jidesoft.docking.DockContext;
import com.jidesoft.docking.DockableFrame;
import com.jidesoft.docking.DockingManager;
import com.jidesoft.swing.LayoutPersistence;

public class JFrameExample {

    private DockableBarDockableHolderPanel holderPanel;
    private JFrame frame;
    private static final String MY_FRAME = "DockableFrame";

    JFrameExample() {
        frame = new JFrame("JFrame Example");
        buildDockableFrame();
        
        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout());
        JLabel label = new JLabel("JFrame By Example");
        JButton button = new JButton("Button");
        
        button.addActionListener(e -> {
            getDockingPanel().getDockingManager().activateFrame(MY_FRAME);
        });

        panel.add(label);
        panel.add(button);
        
        // 将主面板添加到HolderPanel中心区域
        getDockingPanel().add(panel, BorderLayout.CENTER);
        // 将HolderPanel设为主窗口内容容器
        frame.setContentPane(getDockingPanel());
        
        frame.setSize(500, 400);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(String s[]) {
        new JFrameExample();
    }

    private void buildDockableFrame() {
        DockableFrame frame1 = new DockableFrame(MY_FRAME);
        frame1.getContentPane().add(new JLabel("Yes I am visible now..."));

        frame1.getContext().setInitMode(DockContext.STATE_AUTOHIDE);
        frame1.getContext().setInitSide(DockContext.DOCK_SIDE_EAST);
        frame1.getContext().setAutohidable(true);
        frame1.getContext().setFloatable(false);
        frame1.setShowContextMenu(false);

        getDockingPanel().getDockingManager().addFrame(frame1);
    }

    private DockableBarDockableHolderPanel getDockingPanel() {
        if (holderPanel == null) {
            holderPanel = createDockableHolderPanel();
        }
        return holderPanel;
    }

    protected DockableBarDockableHolderPanel createDockableHolderPanel() {
        DockableBarDockableHolderPanel dockableBarDockableHolderPanel = createDockableHolderPanelWithDefaultLayout();
        initDockableHolderPanelDockingManager(dockableBarDockableHolderPanel.getDockingManager());
        return dockableBarDockableHolderPanel;
    }

    private DockableBarDockableHolderPanel createDockableHolderPanelWithDefaultLayout() {
        DockableBarDockableHolderPanel dockableBarDockableHolderPanel = new DockableBarDockableHolderPanel(null);
        initDockableHolderPanelLayoutPersistence(dockableBarDockableHolderPanel.getLayoutPersistence());
        return dockableBarDockableHolderPanel;
    }

    private void initDockableHolderPanelDockingManager(DockingManager dockingManager) {
        dockingManager.setEasyTabDock(true);
        dockingManager.setShowDividerGripper(true);
        dockingManager.setInitSplitPriority(DockingManager.SPLIT_SOUTH_NORTH_EAST_WEST);
        dockingManager.setInitDelay(30);
        dockingManager.setSteps(1);
        dockingManager.setStepDelay(0);
        dockingManager.setDoubleClickAction(DockingManager.DOUBLE_CLICK_TO_MAXIMIZE);
    }

    private void initDockableHolderPanelLayoutPersistence(LayoutPersistence layoutPersistence) {
        layoutPersistence.setProfileKey(MY_FRAME);
        layoutPersistence.setUseFrameBounds(false);
        layoutPersistence.setUseFrameState(false);
    }
}

额外说明

  • 调整窗口大小到500x400,方便清晰查看自动隐藏面板的效果;
  • 简化按钮文本设置,移除冗余的源组件判断(当前仅绑定了一个按钮的监听器);
  • 确保DockingManager的载体(HolderPanel)正确挂载到主窗口,这是JideSoft docking框架生效的核心前提。

内容的提问来源于stack exchange,提问作者user21528347

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 16:25:37