Swing UI - 可收起与开展内容面板实现演示
基于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;
} @Override
protected 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;
} @Override
public Dimension getPreferredSize() {
return new Dimension(this.getWidth(), height);
} @Override
public 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 - 可收起与开展内容面板实现演示的更多相关文章
- iOS10 UI教程基础窗口的内容与设置起始窗口
iOS10 UI教程基础窗口的内容与设置起始窗口 iOS10 UI教程基础窗口的内容与设置起始窗口,本章我们从iOS10开发中UI的基础知识开始讲解,其中包括了窗口.视图以及UI层次结构和Views的 ...
- Atitit.获取swing ui 按钮控件的id 与名字 与JPDA 调试体系
Atitit.获取swing ui 按钮控件的id 与名字 与JPDA 调试体系 1. Swing Inspector是一个Java Swing/AWT用户界面分析和调试工具,功能与firebug类似 ...
- Layui 2.0.0 正式发布:潜心之作,开箱即用的前端UI框架(确实很多内容)
Hi,久违了.处暑逼近之际,潜水半年的 layui 是时候出来透透气了.我们带来的是全新的 2.0 版本,一次被我们定义为“破茧重生”的倾情之作.如果你已曾用过 layui,你将真正感受到一次因小而大 ...
- ApeForms | WinForm窗体UI美化库(Metro扁平风格)演示与安装
ApeForms系列① 快速上手 @ 目录 ApeForms系列① 快速上手 前言 演示视频 快速上手 安装及使用 Demo下载 联系开发者 加入我们 建议与咨询 前言 ApeForms是一套基于Wi ...
- Swing学习篇 API之JButton组件
按钮(Jbutton) Swing中的按钮是Jbutton,它是javax.swing.AbstracButton类的子类,swing中的按钮可以显示图像,并且可以将按钮设置为窗口的默认图标,而且还可 ...
- java中经常使用的Swing组件总结
1.按钮(Jbutton) Swing中的按钮是Jbutton,它是javax.swing.AbstracButton类的子类,swing中的按钮可以显示图像,并且可以将按钮设置为窗口的默认图标,而且 ...
- Swing学习篇 API [一]Swing常用组件
1.按钮(Jbutton) Swing中的按钮是Jbutton,它是javax.swing.AbstracButton类的子类,swing中的按钮可以显示图像,并且可以将按钮设置为窗口的默认图标,而且 ...
- JavaSE-26 Swing
学习要点 关于Swing Swing容器组件 Swing布局管理器 Swing组件 Swing菜单组件 关于Swing Swing和AWT都是java开发图形用户界面的工具包. AWT:早期Java版 ...
- Java基础常见英语词汇
Java基础常见英语词汇(共70个) ['ɔbdʒekt] ['ɔ:rientid]导向的 ['prəʊɡræmɪŋ]编程 OO: object ...
随机推荐
- 将activity设置成dialog样式如何设置窗口大小
具体做法和dialog窗口的设置类似,只需要在onCreate方法中,加入下列代码,既可以控制大小! // 设置窗体大小 ScreenUtil.getScreenWidth(LoadActivity ...
- http to https automatic--weblogic/jboss/tomcat--reference
weblogic reference from:http://middlewaremagic.com/weblogic/?p=2019 Many times we want to secure our ...
- 用switch判断月份的练习
import java.util.Scanner; public class SwitchTest01 { public static void main(String[] args) { Syste ...
- Android 带你玩转实现游戏2048 其实2048只是个普通的控件(转)
1.概述 博主本想踏入游戏开放行业,无奈水太深,不会游泳:于是乎,只能继续开发应用,但是原生Android也能开发游戏么,2048.像素鸟.别踩什么来着:今天给大家带来一篇2048的开发篇,别怕不分上 ...
- Activity启动机制
以下资料摘录整理自老罗的Android之旅博客,是对老罗的博客关于Android底层原理的一个抽象的知识概括总结(如有错误欢迎指出)(侵删):http://blog.csdn.net/luosheng ...
- LSI SAS 2208 配置操作
配置LSISAS2208 介绍LSISAS2208扣卡的配置方法. 2.1 登录CU界面 介绍登录LSISAS2208的CU配置界面的方法,以及CU界面的主要功能. 2.2 创建RAID 介绍创建RA ...
- linux grep常用参数
# grep [-acinv] [--color=auto] '搜寻字符串' filename选项与参数:-c :计算找到 '搜寻字符串' 的次数-i :忽略大小写的不同,所以大小写视为相同-n :顺 ...
- NYOJ528 找球号(三)位运算
找球号(三) 时间限制:2000 ms | 内存限制:3000 KB 难度:2 描述 xiaod现在正在某个球场负责网球的管理工作.为了方便管理,他把每个球都编了号,且每个编号的球的总个数都是 ...
- NuGet学习笔记(1)——初识NuGet及快速安装使用(转)
关于NuGet园子里已经有不少介绍及使用经验,本文仅作为自己研究学习NuGet一个记录. 初次认识NuGet是在去年把项目升级为MVC3的时候,当时看到工具菜单多一项Library Package M ...
- HTML5和CSS3实例教程[总结一]
关于onclick的行为与内容分离 通过链接触发弹出窗口方式 (不推荐使用此方法!!!) <a href='#' onclcik = "window.open('holiday_pay ...