先看代码:
package lfl.swing.comp;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
/**
* 可以伸缩的面板
*
* @author 李富粮
* @since 20120806
* @version 0.0.1
* */
public class JExtensionPanel extends JPanel implements MouseListener {
private static final long serialVersionUID = 1L;
private boolean expand;// 是否展开
private String title;// 标题
private JLabel label;// 标题面板
private Component panel;// 主面板
private ImageIcon up_icon, down_icon;// 图标
// ----各种构造函数---------------------------------------
/**
* 可以伸缩的面板,默认展开
*
* @author 李富粮
* @since 20120806
* @version 0.0.1
*
* */
public JExtensionPanel() {
this("", null, true);
}
/**
* 可以伸缩的面板,默认展开
*
* @author 李富粮
* @since 20120806
* @version 0.0.1
* @param c
* 内容面板
* */
public JExtensionPanel(Component c) {
this("", c, true);
}
/**
* 可以伸缩的面板,默认展开
*
* @author 李富粮
* @since 20120806
* @version 0.0.1
* @param title
* 标题
* @param c
* 内容面板
* */
public JExtensionPanel(String title, Component c) {
this(title, c, true);
}
/**
* 可以伸缩的面板
*
* @author 李富粮
* @since 20120806
* @version 0.0.1
* @param title
* 标题
* @param c
* 内容面板
* @param expand
* 默认展开与否
* */
public JExtensionPanel(String title, Component c, boolean expand) {
this.title = title;
this.expand = expand;
this.panel = c;
init();
}
// ----各种方法---------------------------------------
/**
* 返回面板伸缩的状态
* */
public boolean isExpand() {
return expand;
}
/**
* 设置面板的伸缩
*
* @param true 展开
* @param false 收缩
* */
public void setExpand(boolean expand) {
this.expand = expand;
if (this.expand) {
this.label.setIcon(down_icon);
this.label.setBorder(BorderFactory.createLoweredBevelBorder());
if (null != this.panel) {
panel.setVisible(true);
}
} else {
this.label.setIcon(up_icon);
this.label.setBorder(BorderFactory.createRaisedBevelBorder());
if (null != this.panel) {
panel.setVisible(false);
}
}
this.updateUI();
this.updateUI();
}
/**
* 返回面板的内容面板
* */
public Component getPanel() {
return panel;
}
/**
* 设置内容面板
*
* @param panel
* 内容面板
* */
public void setPanel(Component panel) {
if (null != panel) {
this.remove(this.panel);
this.panel = panel;
this.add(this.panel, BorderLayout.CENTER);
if (this.expand) {
panel.setVisible(true);
} else {
panel.setVisible(false);
}
} else {
this.remove(this.panel);
this.panel = null;
}
this.updateUI();
}
/**
* 返回面板标题
* */
public String getTitle() {
return title;
}
/**
* 设置面板标题
*
* @param panel
* 面板标题
* */
public void setTitle(String title) {
this.title = title;
this.label.setText(title);
this.updateUI();
}
/**
* 创建标题指示图标
* */
private void createImages() {
int w = this.getPreferredSize().width, h = this.getPreferredSize().height;
BufferedImage open = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB), close = new BufferedImage(
w, h, BufferedImage.TYPE_INT_RGB);
// 展开的图标
Graphics2D g2 = open.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setPaint(this.getBackground());
g2.fillRect(0, 0, w, h);
int[] x = { 0, w / 2, w };
int[] y = { h / 4, 3 * h / 4, h / 4 };
Polygon p = new Polygon(x, y, 3);
g2.setPaint(Color.BLACK);
g2.fill(p);
g2.setPaint(Color.BLACK);
g2.draw(p);
g2.dispose();
down_icon = new ImageIcon(open);
// 收缩的的图标
g2 = close.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setPaint(getBackground());
g2.fillRect(0, 0, w, h);
x = new int[] { w / 4, 3 * w / 4, w / 4 };
y = new int[] { 0, h / 2, h };
p = new Polygon(x, y, 3);
g2.setPaint(Color.GRAY);
g2.fill(p);
g2.setPaint(Color.GRAY);
g2.draw(p);
g2.dispose();
up_icon = new ImageIcon(close);
}
/**
* 初始化工作
* */
private void init() {
this.createImages();// 获得图标
this.setLayout(new BorderLayout());
if (this.expand) {
this.label = new JLabel(this.title, this.down_icon,
SwingConstants.LEADING);
this.label.setBorder(BorderFactory.createLoweredBevelBorder());
if (null != this.panel) {
this.add(this.panel, BorderLayout.CENTER);
}
} else {
this.label = new JLabel(this.title, this.up_icon,
SwingConstants.LEADING);
this.label.setBorder(BorderFactory.createRaisedBevelBorder());
if (null != this.panel) {
this.add(this.panel, BorderLayout.CENTER);
this.panel.setVisible(false);
}
}
this.add(this.label, BorderLayout.NORTH);
this.label.addMouseListener(this);
}
// ----接口方法的实现---------------------------------------
@Override
public void mouseClicked(MouseEvent e) {
if (e.getSource() == label) {
expand = !expand;
if (this.expand) {
this.label.setIcon(down_icon);
this.label.setBorder(BorderFactory.createLoweredBevelBorder());
if (null != this.panel) {
panel.setVisible(true);
}
} else {
this.label.setIcon(up_icon);
this.label.setBorder(BorderFactory.createRaisedBevelBorder());
if (null != this.panel) {
panel.setVisible(false);
}
}
this.updateUI();
}
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = f.getContentPane();
c.setLayout(new BorderLayout());
c
.add(new JExtensionPanel("test1", new JButton("test1"),false),
BorderLayout.NORTH);
c
.add(new JExtensionPanel("test2", new JButton("test2"),false),
BorderLayout.CENTER);
f.setSize(360, 500);
f.setLocation(200, 100);
f.setVisible(true);
}
}
看看效果吧:
自己写的一个软件:
- 大小: 7.9 KB
- 大小: 9.1 KB
- 大小: 14.6 KB
- 大小: 14.2 KB
- 大小: 45.7 KB
分享到:
相关推荐
在Windows Forms(WinForm)开发环境中,创建一个类似于Outlook的可伸缩面板控件是一项常见的需求,这有助于实现更加灵活且用户友好的界面布局。Outlook风格的面板控件通常包括可折叠、展开的区域,能够显示不同的...
在Windows Presentation Foundation(WPF)中,创建一个可以伸缩的面板效果,通常是通过使用`Expander`控件来实现的。`Expander`控件允许用户通过点击一个标题来展开或折叠其内容区域,这在展示大量信息时非常有用,...
6. **多面板支持**:如果应用有多个可伸缩面板,需要考虑它们之间的交互,例如只允许一个面板展开,或者支持同时展开多个面板。 使用第三方库如"OutLookExUI"的好处是它可以提供已经封装好的、经过测试的实现,减少...
"类似于Outlook的可折叠面板可伸缩面板"是一种常见的设计模式,它模仿了Microsoft Outlook应用程序中的功能,允许用户根据需要调整和组织界面元素。这种设计能够提高工作效率,让用户在大量信息中快速定位和管理内容...
在IT行业中,创建类似QQ面板或微软Outlook界面的可伸缩控件是一项常见的需求,尤其是在开发用户界面(UI)时。这样的控件通常被称为OutlookBar或Docking Bar,它们提供了一种灵活的方式来组织和展示应用程序的功能,...
在网页设计中,"竖直伸缩面板"是一种常见的交互元素,主要用于节省空间并提供良好的用户体验。这种设计通常应用于导航菜单、侧边栏或者内容区域,使得用户可以通过简单的鼠标悬停动作来展开或隐藏具体内容。在给定的...
VB.NET可伸缩性技术手册VB.NET可伸缩性技术手册VB.NET可伸缩性技术手册VB.NET可伸缩性技术手册VB.NET可伸缩性技术手册VB.NET可伸缩性技术手册VB.NET可伸缩性技术手册VB.NET可伸缩性技术手册VB.NET可伸缩性技术手册VB...
可伸缩的控制面板,类似于Outlook的面板
可伸缩网络服务是当前信息技术领域的一个重要研究方向,尤其在网络基础设施和服务提供方面,它具有巨大的价值。在本文中,我们将深入探讨可伸缩网络服务的相关理论、技术和应用,以期为读者提供全面的理解。 首先,...
分布式系统可伸缩性是衡量一个系统在面对不断增长的工作负载或资源变化时,能否保持其性能和功能稳定性的重要指标。陈斌等人的研究综述深入探讨了这一关键概念,指出可伸缩性不仅涉及系统的基本性能,还与资源管理和...
构建可伸缩的系统是现代IT架构设计中的关键议题,特别是在面对互联网应用、大数据处理以及云计算等场景时,系统的可伸缩性成为了决定其成功与否的重要因素。在“可伸缩的系统技术方案”这一主题下,我们探讨了一系列...
本教程将深入探讨如何创建一个可伸缩的Panel自定义控件,该控件具备自由扩展缩进的功能,并能实现多个Panel间的联动伸缩。 首先,我们需要了解.NET Framework或.NET Core中的UserControl类,它是所有自定义控件的...
jQuery EasyUI Accordion 是一款基于 jQuery 的用户界面插件,它提供了一种简单的方式来创建可伸缩的面板组件,使得在 Web 页面中可以很方便地对内容区域进行折叠和展开的操作。可伸缩面板通常用于节省页面空间,将...
CollapsiblePanel.rar CollapsiblePanel -- AjaxControlToolkit 之一(伸缩面板) CollapsiblePanel,asp.net,ajax,AjaxControlToolkit QQ:292258449
《可伸缩服务架构:框架与中间件》以高可用服务架构为主题,侧重于讲解高可用架构设计的核心要点:可伸缩和可扩展,从应用层、数据库、缓存、消息队列、大数据查询系统、分布式定时任务调度系统、微服务等层面详细...
本代码实现了对MPEG2 SNR可伸缩性编码,可以作为理解SNR可伸缩性编码的入门。
在IT领域,尤其是在系统管理和架构设计中,"可伸缩性"是一个至关重要的概念。Windows操作系统作为广泛应用的桌面和服务器平台,同样面临着如何提供高效、灵活的可伸缩性解决方案的挑战。本篇将深入探讨"Windows可...
可伸缩和可扩展,从应用层、数据库、缓存、消息队列、大数据查询系统、分布式定时任务调度系统、微服务等层面详细讲解如何设计可伸缩、可扩展的框架,并给出在各个领域解决特定问题的方法论和实践总结。包括数据库分...
《可伸缩服务架构:框架与中间件》以高可用服务架构为主题,侧重于讲解高可用架构设计的核心要点:可伸缩和可扩展,从应用层、数据库、缓存、消息队列、大数据查询系统、分布式定时任务调度系统、微服务等层面详细...
在IT行业中,创建一个可伸缩的窗口是常见的需求,特别是在网页应用或用户界面设计中。这个场景下,我们讨论的是一种类似于在线客服系统的可伸缩窗口代码,它能够用于构建功能菜单。在线客服系统通常需要一个不显眼但...