Collapse折叠面板
折叠面板可以用作空间上合理利用,可以随心所欲展开喜欢的内容,收起不喜欢的内容.
比如在idea编辑器中通过alt+4唤醒运行日志,再次alt+4可以隐藏.
在h5中,可以通过很简单的display属性实现,
思路
- 总面板以标题区域和内容区域组成
- 点击标题区域时隐藏内容区域,再次点击显示内容区域,重复此流程
那么关心的核心内容就是内容区域是否是显示状态 - 隐藏内容组件同时,需要隐藏内容组件的占用空间,那么可以借助JXMultiSplitPane来处理
swing实现
代码
tips
- 需要swing 布局\内置组件\事件有一定了解
- 需要swingx有一定了解
import cn.hutool.core.util.RandomUtil;
import com.formdev.flatlaf.FlatLightLaf;
import com.mynote.core.ui.BorderBuilder;
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 org.jdesktop.swingx.JXMultiSplitPane;
import org.jdesktop.swingx.MultiSplitLayout;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
* 折叠面板测试
*/
public class CollapseTest extends AbstractDefaultPanel {
private Icon collapsedIcon;
private Icon expandedIcon;
private MultiSplitLayout multiSplitLayout;
private JXMultiSplitPane collapsePanel;
private Row title;
private JLabel titleLabel;
private Row content;
@Override
protected void init() {
/*切割面板布局*/
String defaultLayout = "(COLUMN " +
"(LEAF name=title weight=0.1)" +
"(LEAF name=content weight=0.9)" +
")";
multiSplitLayout = new MultiSplitLayout(MultiSplitLayout.parseModel(defaultLayout));
collapsedIcon = UIManager.getIcon("Tree.collapsedIcon");
expandedIcon = UIManager.getIcon("Tree.expandedIcon");
collapsePanel = new JXMultiSplitPane();
collapsePanel.setLayout(multiSplitLayout);
collapsePanel.setBackground(Color.white);
collapsePanel.setBorder(BorderFactory.createLineBorder(ColorBuilder.LABEL_GRAY_COLOR1));
createTitle();
createContent();
}
private void createTitle() {
title = new Row();
titleLabel = new JLabel("collapse测试", collapsedIcon, SwingConstants.CENTER);
title.add(titleLabel);
collapsePanel.add(title, "title");
}
private void createContent() {
content = new Row();
String text = RandomUtil.randomString(200);
JTextArea textArea = new JTextArea(text);
textArea.setPreferredSize(new Dimension(400, 200));
textArea.setEditable(false);
textArea.setLineWrap(true);
textArea.setBackground(Color.white);
content.setBackground(Color.white);
content.add(textArea);
collapsePanel.add(content, "content");
}
@Override
protected void render() {
multiSplitLayout.displayNode("content",false);
multiSplitLayout.layoutByWeight(title);
view.add(collapsePanel, "center,w 400");
super.add(view);
}
@Override
protected void bindEvents() {
title.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
boolean isShow = content.isVisible();
multiSplitLayout.displayNode("content",!isShow);
if (isShow) {
titleLabel.setIcon(collapsedIcon);
title.setBorder(BorderFactory.createEmptyBorder());
} else {
titleLabel.setIcon(expandedIcon);
title.setBorder(BorderBuilder.bottomBorder(1, ColorBuilder.LABEL_GRAY_COLOR1));
}
// collapsePanel.revalidate();
// collapsePanel.repaint();
multiSplitLayout.layoutByWeight(title);
}
});
}
public static void main(String[] args) {
FlatLightLaf.install();
FrameUtil.launchTest(new CollapseTest());
}
}
AbstractDefaultPanel 快速构建面板
AbstractDefaultPanel 只是为了快速的构建一个内置加载顺序的面板,
在构造方法中,指定初始化、渲染、绑定事件,内置一个默认的view视图。
可以参考 https://gitee.com/liveBetter/swing-helper.git 可以使用相对合理的设计cn.note.swing.core.view.AbstractMigView
import net.miginfocom.swing.MigLayout;
import javax.swing.*;
/**
* @description: 抽象视图用于快速构建
* @author: jee
*/
public abstract class AbstractDefaultPanel extends JPanel {
/**
* 主视图
*/
public JPanel view;
public AbstractDefaultPanel() {
super();
view = new JPanel(new MigLayout("wrap 1","grow","grow"));
super.setLayout(new MigLayout("center"));
init();
render();
bindEvents();
}
/**
* 初始化成员对象
*/
protected abstract void init();
/**
* render视图
*/
protected abstract void render();
/**
* 绑定事件
*/
protected void bindEvents() {
}
/**
* 简单创建view行元素
*
* @param components 组件元素
*/
protected JPanel createViewJPanel(JComponent... components) {
JPanel row = new JPanel();
for (JComponent component : components) {
row.add(component);
}
view.add(row, "growx");
return row;
}
}
常用的swing开发 maven组件包
swingx 更丰富的swing组件
对应的类为org.jdesktop.swingx
<!--swingx -->
<dependency>
<groupId>org.swinglabs.swingx</groupId>
<artifactId>swingx-all</artifactId>
<version>1.6.5-1</version>
</dependency>
<!--flatlaf-->
<dependency>
<groupId>com.formdev</groupId>
<artifactId>flatlaf-swingx</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>com.formdev</groupId>
<artifactId>flatlaf</artifactId>
<version>2.1</version>
</dependency>
<!-- tool-->
<dependency>
<groupId>com.formdev</groupId>
<artifactId>flatlaf-extras</artifactId>
<version>2.1</version>
</dependency>
<!--svg-->
<dependency>
<groupId>com.formdev</groupId>
<artifactId>svgSalamander</artifactId>
<version>1.1.3</version>
</dependency>
<!--miglayout-->
<dependency>
<groupId>com.miglayout</groupId>
<artifactId>miglayout-swing</artifactId>
<version>5.2</version>
</dependency>
<dependency>
<groupId>org.jdesktop.bsaf</groupId>
<artifactId>bsaf</artifactId>
<version>1.9.2</version>
<exclusions>
<exclusion>
<groupId>javax.jnlp</groupId>
<artifactId>jnlp</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--animal动画-->
<dependency>
<groupId>net.java.dev.timingframework</groupId>
<artifactId>timingframework</artifactId>
<version>1.0</version>
</dependency>
<!-- 编辑器 -->
<dependency>
<groupId>com.fifesoft</groupId>
<artifactId>rsyntaxtextarea</artifactId>
<version>3.1.6</version>
</dependency>
<dependency>
<groupId>com.fifesoft</groupId>
<artifactId>rstaui</artifactId>
<version>3.1.4</version>
</dependency>