Swing UI - 可收起与开展内容面板实现演示
来源:互联网 发布:sql通配符 编辑:程序博客网 时间:2024/05/25 05:34
基于JAVA Swing实现的自定义组件可折叠的JPanel组件
基本思想:
可折叠面板,分为两个部分-头部面板与内容面板
头部面板– 显示标题,以及对应的icon图标,监听鼠标事件决定内容面板隐藏或者显示
内容面板– 普通的JPanel组件。
实现:
头部面板:
package com.gloomyfish.ui.demo;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.Font;import java.awt.GradientPaint;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.RenderingHints;import java.awt.image.BufferedImage;import java.io.IOException;import javax.imageio.ImageIO;import javax.swing.JFrame;import javax.swing.JPanel;public class HeaderPanel extends JPanel {/** * */private static final long serialVersionUID = 1L;private int height = 50;private Color bgColor;private boolean isShow;private String title;public void setShow(boolean isShow) {this.isShow = isShow;}public void setTitle(String title){this.title = title;}@Overrideprotected void paintComponent(Graphics g) {Graphics2D g2d = (Graphics2D) g.create();g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);BufferedImage panelImage = createPanelImage();g2d.drawImage(panelImage, null, 0, 0);}private BufferedImage createPanelImage() {BufferedImage panelImage = new BufferedImage(getWidth(), height, BufferedImage.TYPE_INT_ARGB);Graphics2D g2d = panelImage.createGraphics();g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2d.setRenderingHint(java.awt.RenderingHints.KEY_TEXT_ANTIALIASING,java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON);int width = getWidth();g2d.setPaint(bgColor); g2d.fillRect(0, 0, width, height); GradientPaint gradientPaint = new GradientPaint(0, height/2, Color.LIGHT_GRAY, 0, height, Color.DARK_GRAY); g2d.setPaint(gradientPaint); g2d.fillRect(0, height/2, width, height/2); java.net.URL imageURL = null; if(this.isShow) { imageURL = this.getClass().getResource("arrow-up-icon.png"); } else { imageURL = this.getClass().getResource("arrow-down-icon.png"); } java.net.URL titleIconURL = this.getClass().getResource("user.png"); //gallery_5.png g2d.setFont(new Font("Serif", Font.BOLD, 24)); g2d.setPaint(Color.WHITE); g2d.drawString(this.title, width/2-40, height-5);try {g2d.fillArc(width - 42, this.height/2, this.height/2, this.height/2, 0, 360);g2d.drawImage(ImageIO.read(imageURL), null, width - 42, this.height/2+2);g2d.drawImage(ImageIO.read(titleIconURL), null, 20, 5);} catch (IOException e) {System.err.println("An error occured when loading the image icon...");}return panelImage;}public void setHeight(int height) {this.height = height;}public void setBgColor(Color bgColor) {this.bgColor = bgColor;}@Overridepublic Dimension getPreferredSize() {return new Dimension(this.getWidth(), height);}@Overridepublic Dimension getSize() {return new Dimension(this.getWidth(), height);}public HeaderPanel(Color bgColor) {this.bgColor = bgColor;this.isShow = true;}public HeaderPanel(Color bgColor, String title) {this(bgColor);this.title = title;}public static void main(String[] args){ JFrame mainFrame = new JFrame("UI Demo - Gloomyfish"); mainFrame.getContentPane().setLayout(new BorderLayout()); mainFrame.getContentPane().add(new HeaderPanel(Color.BLACK), BorderLayout.CENTER); mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainFrame.pack(); mainFrame.setVisible(true); }}内容面板:
package com.gloomyfish.ui.demo;import java.awt.BorderLayout;import java.awt.Color;import java.awt.FlowLayout;import java.awt.GridLayout;import javax.swing.BorderFactory;import javax.swing.JButton;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextField;public class ContentPanel extends JPanel {/** * */private static final long serialVersionUID = 1L;public ContentPanel(Color theme){this.setBorder(BorderFactory.createLineBorder(theme, 5));}public void createContent(){JPanel userPanel = new JPanel(new GridLayout(2,2));userPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));userPanel.add(new JLabel("用户名:"));JTextField txtField = new JTextField("", 10);userPanel.add(txtField);userPanel.add(new JLabel("密码:"));JTextField pwdField = new JTextField("", 10);userPanel.add(pwdField);JButton okeBtn = new JButton("OK");JButton cancelBtn = new JButton("Cancel");JPanel btnPanel = new JPanel();btnPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));btnPanel.add(okeBtn);btnPanel.add(cancelBtn);this.setLayout(new BorderLayout());this.add(userPanel, BorderLayout.CENTER);this.add(btnPanel, BorderLayout.SOUTH);}}可折叠面板:
package com.gloomyfish.ui.demo;import java.awt.BorderLayout;import java.awt.Color;import java.awt.GridBagConstraints;import java.awt.GridBagLayout;import java.awt.Insets;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import javax.swing.JFrame;import javax.swing.JPanel;public class JExpandablePanel extends JPanel{/** * */private static final long serialVersionUID = 1L;private HeaderPanel headerPanel;private ContentPanel contentPanel;public JExpandablePanel(){super();initComponents();}private void initComponents() {this.setLayout(new BorderLayout());Color theme = Color.BLACK;headerPanel = new HeaderPanel(theme, "欢迎登录");headerPanel.addMouseListener(new PanelAction());contentPanel = new ContentPanel(theme);contentPanel.createContent();this.add(headerPanel, BorderLayout.NORTH);this.add(contentPanel, BorderLayout.CENTER);setOpaque(false);}class PanelAction extends MouseAdapter{ public void mousePressed(MouseEvent e) { HeaderPanel hp = (HeaderPanel)e.getSource(); if(contentPanel.isShowing()) { contentPanel.setVisible(false); hp.setShow(false); } else { contentPanel.setVisible(true); hp.setShow(true); } hp.getParent().validate(); hp.getParent().repaint(); } }public static void main(String[] args){ JFrame mainFrame = new JFrame("UI Demo - Gloomyfish"); mainFrame.getContentPane().setLayout(new BorderLayout()); JPanel myPanel = new JPanel(); myPanel.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); JPanel[] panels = new JPanel[4]; // gbc.insets = new Insets(1,3,0,3); gbc.weightx = 1.0; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridwidth = GridBagConstraints.REMAINDER; for(int j = 0; j < panels.length; j++) { panels[j] = new JExpandablePanel(); myPanel.add(panels[j], gbc); } mainFrame.getContentPane().add(myPanel, BorderLayout.NORTH); mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainFrame.pack(); mainFrame.setVisible(true); }}效果图:
顶级技巧:
为了保证内容面板展开与收起时候,UI自动pack与刷新。尽量不要设置UI的固定大小。使用JExpandablePanel时候,推荐使用GridBagLayout
- Swing UI - 可收起与开展内容面板实现演示
- 仿微信朋友圈动态内容全文显示与收起实现
- 展开收起内容实现代码
- 简单实现内容详情的 更多 收起
- 标签内容的详细展示与收起
- swing使用布局实现伸缩面板
- Swing学习笔记4---窗口与面板
- swing窗口与面板的使用
- 自定义可展开收起TextView,展开收起按钮紧跟文本内容
- 表视图实现好友分组(可收起放下)
- 仿美团实现可展开和收起的LinearLayout
- 左侧可收起展开的菜单栏实现思路
- Android实现树状多层可展开收起ListView
- JQuery UI之(三)可切换面板——tabs
- jQuery Easy UI Accordion(可伸缩面板)组件
- JQuery UI之(三)可切换面板——tabs
- 文章收起与展开效果的实现
- TextView实现文本的收起与展示
- 缓存技术总结
- 下载/上传远程linux文件
- DELPHI XE7安装Unidac6.2.7
- windows环境下nutch2.x 在eclipse中实现抓取数据存进mysql详细步骤
- Robocode教程7——雷达锁定
- Swing UI - 可收起与开展内容面板实现演示
- JavaScript高级知识
- XSD校验XML JAVA实现
- 数据结构之 二叉树的构造与遍历(先序,中序,后序,层次)
- 流量监管和流量整形
- 做为技术人员为什么要写博客
- 《程序员面试宝典》中所遇到的疑惑与解答
- 10.1大假期
- jquery.form.js ajax上传文件问题