Collapse折叠面板2
在Collapse折叠面板中,已经实现了h5常见的折叠面板类型了.
还有一种类型的折叠面板,通过按钮控制折叠区域的显示于隐藏.
idea中run即采用这种结构
效果
思路分享
- 整体的布局分为上下两部分,
- 上半部分分为展示区域 和内容区域
- 下半部分的按钮与内容区域相绑定
- 根据内容区域的显示隐藏状态进行判定
代码
import cn.hutool.core.io.resource.ResourceUtil;
import com.formdev.flatlaf.FlatLightLaf;
import com.mynote.core.ui.ColorBuilder;
import com.mynote.core.util.FrameUtil;
import com.mynote.core.view.Row;
import com.mynote.example.demo.AbstractDefaultPanel;
import net.miginfocom.swing.MigLayout;
import org.jdesktop.swingx.JXMultiSplitPane;
import org.jdesktop.swingx.MultiSplitLayout;
import javax.swing.*;
import javax.swing.border.Border;
/**
* 测试仿idea折叠窗口
*/
public class DefaultDocPanel extends JPanel {
private JPanel view;
private JComponent wrapComp;
private String docPath;
private JButton docButton;
private JScrollPane docView;
private MultiSplitLayout multiSplitLayout;
private Border border;
public DefaultDocPanel(JComponent component, String docPath) {
this.wrapComp = component;
this.docPath = docPath;
init();
render();
bindEvents();
}
/**
* 创建doc视图
*
* @return
*/
void createDocView() {
String docContent = ResourceUtil.readUtf8Str("description/" + docPath);
JLabel description = new JLabel(docContent);
docView = new JScrollPane(description);
docView.setBorder(border);
}
/**
* 初始化成员对象
*/
protected void init() {
border = BorderFactory.createLineBorder(ColorBuilder.BG_BLANK_COLOR1, 2);
view = new JPanel(new MigLayout("wrap 1"));
createDocButton();
createDocView();
String defaultLayout = "(COLUMN " +
"(LEAF name= demo weight=0.8)" +
"(LEAF name=source weight=0.2)" +
")";
multiSplitLayout = new MultiSplitLayout(MultiSplitLayout.parseModel(defaultLayout));
}
/**
* render视图
*/
protected void render() {
JXMultiSplitPane splitPane = new JXMultiSplitPane();
splitPane.setLayout(multiSplitLayout);
splitPane.add(wrapComp, "demo");
splitPane.add(docView, "source");
view.add(splitPane, "w 100%,h 100%");
view.add(docButton);
super.setLayout(new MigLayout());
super.add(view, "w 100%,h 100%");
}
/**
* 绑定事件
*/
protected void bindEvents() {
docButton.addActionListener((e) -> {
multiSplitLayout.displayNode("source", !docView.isVisible());
updateDocButtonStyle(docView.isVisible());
});
}
public void createDocButton() {
if (docButton == null) {
docButton = new JButton("doc");
docButton.setFocusPainted(false);
docButton.setBorderPainted(false);
updateDocButtonStyle(true);
}
}
/**
* 更新button UI
*
* @param show
*/
public void updateDocButtonStyle(boolean show) {
if (show) {
docButton.setBackground(ColorBuilder.BG_RED_COLOR1);
docButton.setForeground(ColorBuilder.LABEL_WHITE_COLOR1);
docButton.repaint();
} else {
docButton.setBackground(ColorBuilder.BG_BLANK_COLOR1);
docButton.setForeground(ColorBuilder.LABEL_WHITE_COLOR1);
docButton.repaint();
}
}
public static void main(String[] args) {
String html = "layout.html";
String docContent = ResourceUtil.readUtf8Str("description/" + html);
FlatLightLaf.install();
FrameUtil.launchTest(new DefaultDocPanel(new JLabel(docContent), html));
}
}