Swing UI

摘要:
基于JAVASwing实现的用户定义组件的可折叠JPanel组件的基本思想是:可折叠面板,它分为两部分-头面板和内容面板-头面板-显示标题,以及相应的图标图标。监听鼠标事件确定内容面板是隐藏还是显示内容面板-通用JPanel组件。

基于JAVA Swing实现的自定义组件可折叠的JPanel组件

基本思想:

可折叠面板,分为两个部分-头部面板与内容面板

头部面板– 显示标题,以及对应的icon图标,监听鼠标事件决定内容面板隐藏或者显示

内容面板– 普通的JPanel组件。

Swing UI第1张

实现:

头部面板:

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);  
	}
}

效果图:

Swing UI第2张

顶级技巧:

为了保证内容面板展开与收起时候,UI自动pack与刷新。尽量不要

设置UI的固定大小。使用JExpandablePanel时候,推荐使用GridBagLayout

免责声明:文章转载自《Swing UI》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Qt 打印机支持模块PHP Rabbitmq 报错Broken pipe下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

swing界面刷新问题

在Java Swing编程中,往往会遇到需要动态刷新界面的时候,例如动态刷新JLabel的文本,JTextField里的文本等等。但是往往却没有达到我们预期的效果,我相信很多朋友都遇到过本文将要说的这个问题。 如下图的Swing界面中,我们期望在点击按钮时,Jlabel和JTextField里的文本能不断的变化,并实时地显示出来。 这个例子中,我们期望点...

Swing自定义JTable列的宽度

  假设我的表格有4列    jTable.getColumnModel().getColumn(0).setPreferredWidth(80);   jTable.getColumnModel().getColumn(1).setPreferredWidth(80);  jTable.getColumnModel().getColumn(2).setP...

Swing菜单与工具栏(三)

6.1.6 JSeparator类 JSeparator类是一种特殊的组件,他在JMenu上提供分隔符。JPopupMenu与JToolBar类也支持分隔,但是每一个都使用JSeparator类的相应子类。除了可以放置在菜单上以外,JSeparator类也可以放置在任何我们希望使用水平或是垂直线来分隔屏幕不同区域的地方。 JSeparator是一个严格的...

JAVA Swing日期选择控件datepicker的使用

声明:本控件来自互联网,仅可应用于个人项目,不可商用,如您未遵守造成的任何问题请自行承担点击下载 datepicker.jar 使用方法1、导入 在eclipse中,单击你的项目名,右键–>Build Path–>Add External Archives–>选择datepicker.jar2、使用 importjava.awt.Colo...

Swing-布局管理器之FlowLayout(流式布局)-入门

FlowLayout应该是Swing布局管理器学习中最简单、最基础的一个。所谓流式,就是内部控件像水流一样,从前到后按顺序水平排列,直到达到容器的宽度时跳转到第二行。既然是水平排列,那么就存在三种基本的对齐方式:居中对齐(CENTER )、左对齐(LEFT )和右对齐(RIGHT )。然而,FlowLayout还提供两种对齐方式:LEADING,表示控件与...

Swing组件集合的事件处理(六)

2.3 Swing特定的事件处理 请记住,Swing组件是构建在AWT库之上的,Swing组件库具有一些改进的功能从而使得事件处理更为简单。功能改进覆盖AWT核心事件处理特性之上,由基本的动作监听到焦点管理。 为了简化事件处理,Swing库使用Action接口扩展了原始的ActionListener接口来存储具有事件处理器的可视属性。这使得事件处理器的创...