swing-组件Collapse折叠面板

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>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值