`
lj_gzy2014
  • 浏览: 16799 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

编写自定义窗体和组件

    博客分类:
  • java
 
阅读更多



            在学习java图形界面的时候,就想编写一个属于自己的窗体,可以自己定义组件的形状颜色等,今天终于实现了,和大家分享一下大笑

首先编写自定义panel

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class MyPane extends JPanel { 

@Override 
protected void paintComponent(Graphics g) { 
Graphics2D g2d = (Graphics2D) g; 
// g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

g2d.setColor(new Color(255,255,255,140)); 
g2d.fillRoundRect(3, 3, getWidth()-7, getHeight()-7, 20, 20); 

g2d.setClip(0, 0, getWidth(), 30); 
g2d.setColor(Color.WHITE); 
g2d.fillRoundRect(1, 3, getWidth()-2, getHeight()-1, 20, 20); 
g2d.setClip(null); 

g2d.setColor(Color.darkGray); 
g2d.setStroke(new BasicStroke(6)); 
g2d.drawRoundRect(3, 3, getWidth()-7, getHeight()-7, 20, 20); 

g2d.setFont(new Font("Arial", Font.BOLD, 16)); 
g2d.setColor(Color.DARK_GRAY); 
g2d.drawString("Swing UI Test", 15, 24); 
} 
} 

 

 

自定义按钮UI

package jcomponent_v3;
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Rectangle;

import javax.swing.AbstractButton;
import javax.swing.ButtonModel;
import javax.swing.JComponent;
import javax.swing.LookAndFeel;
import javax.swing.plaf.basic.BasicButtonUI;

public class MyButton extends BasicButtonUI  {
	@Override
	protected void installDefaults(AbstractButton b) {
		// TODO Auto-generated method stub
		super.installDefaults(b);
		LookAndFeel.installProperty(b, "opaque", Boolean.FALSE);
	}
	@Override
	public void paint(Graphics g, JComponent c) {
		g.setColor(new Color(255,0,0,150));
		g.fillRoundRect(0, 0, c.getWidth(), c.getHeight(), 50, 50);
		super.paint(g, c);
	}
	@Override
	protected void paintText(Graphics g, AbstractButton b, Rectangle textRect,
			String text) {
		// TODO Auto-generated method stub
		super.paintText(g, b, textRect, text);
	}

	@Override
	protected void paintFocus(Graphics g, AbstractButton b, Rectangle viewRect,
			Rectangle textRect, Rectangle iconRect) {
		// TODO Auto-generated method stub
		super.paintFocus(g, b, viewRect, textRect, iconRect);
	}

	@Override
	protected void paintButtonPressed(Graphics g, AbstractButton b) {
		g.setColor(new Color(255,200,0,150));
		g.fillRoundRect(0, 0, b.getWidth(), b.getHeight(), 50, 50);
	}
	
	@Override
	protected void paintIcon(Graphics g, JComponent c, Rectangle iconRect) {
		// TODO Auto-generated method stub
		super.paintIcon(g, c, iconRect);
	}

	@Override
	protected void paintText(Graphics g, JComponent c, Rectangle textRect,
			String text) {
		super.paintText(g, c, textRect, text);
	}
}

 自定义窗体

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Point;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.LayoutStyle.ComponentPlacement;


public class MyFrame extends JFrame {

	private MyPane contentPane;
	int mx,my,jfx,jfy;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					MyFrame frame = new MyFrame();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public MyFrame() {
		setTitle("TestSwingAPI");
		addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				if (e.getKeyCode() == 0) {
					System.exit(0);
				}
			}
		});
		setUndecorated(true);
		setBackground(new Color(0,0,0,0));
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new MyPane();
		contentPane.addMouseMotionListener(new MouseMotionAdapter() {
			@Override
			public void mouseDragged(MouseEvent e) {
				setLocation(jfx+(e.getXOnScreen()-mx), jfy+(e.getYOnScreen()-my));
			}
		});
		contentPane.addMouseListener(new MouseAdapter() {
			@Override
			public void mousePressed(MouseEvent e) {
				mx = e.getXOnScreen();
				my = e.getYOnScreen();
				jfx = getX();
				jfy = getY();
			}
		});
		contentPane.setOpaque(false);
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JPanel panel = new JPanel();
		panel.setOpaque(false);
		panel.setBounds(6, 31, 438, 263);
		contentPane.add(panel);
		
		JButton btnExit = new JButton("EXIT");
		btnExit.setUI(new MyButtonUI());
		
		JButton btnMax = new JButton("MAX");
		btnMax.setUI(new MyButtonUI());
		btnMax.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				if (getExtendedState() == JFrame.MAXIMIZED_BOTH) {
					setExtendedState(JFrame.NORMAL);
				}else {
					setExtendedState(JFrame.MAXIMIZED_BOTH);
				}
			}
		});
		
		JButton btnMin = new JButton("MIN");
		btnMin.setUI(new MyButtonUI());
		btnMin.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				setExtendedState(JFrame.ICONIFIED);
			}
		});
		GroupLayout gl_panel = new GroupLayout(panel);
		gl_panel.setHorizontalGroup(
			gl_panel.createParallelGroup(Alignment.TRAILING)
				.addGroup(gl_panel.createSequentialGroup()
					.addContainerGap(195, Short.MAX_VALUE)
					.addComponent(btnMin)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(btnMax)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(btnExit)
					.addContainerGap())
		);
		gl_panel.setVerticalGroup(
			gl_panel.createParallelGroup(Alignment.TRAILING)
				.addGroup(Alignment.LEADING, gl_panel.createSequentialGroup()
					.addContainerGap()
					.addGroup(gl_panel.createParallelGroup(Alignment.BASELINE)
						.addComponent(btnExit)
						.addComponent(btnMax)
						.addComponent(btnMin))
					.addContainerGap(228, Short.MAX_VALUE))
		);
		panel.setLayout(gl_panel);
		btnExit.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				System.exit(0);
			}
		});
	}

}

 效果如图:

  • 大小: 21.9 KB
分享到:
评论

相关推荐

    C# 截屏程序(全屏、区域、窗体)

    本人编写的一个截屏组件。详情请参见这里:http://www.cnblogs.com/zzy0471/archive/2010/09/04/1817971.html

    CnWizards v0.7.5.105 (IDE专家包)

    与一般的组件包不同,CnPack 开发包除了有大量的组件外,还包括 IDE 专家包、属性编辑器、组件编辑器、公共窗体库、版本控制及其它辅助工具等,在 CnPack 的设计中,包含以下内容:不可视工具组件包。 用户界面控件...

    D5开发人员指南-05卷

    第21章 编写自定义组件 607 21.1 组件设计基础 607 21.1.1 确定是否需要编写组件 607 21.1.2 编写组件的一般步骤 607 21.1.3 确定一个祖先类 608 21.1.4 创建一个组件单元 609 21.1.5 添加属性 609 21.1.6 加入事件 ...

    delphi 开发经验技巧宝典源码

    0011 如何锁定窗体中的组件 9 0012 如何改变窗体上的网格大小 10 0013 组件的选取 10 0014 改变窗体Hint背景色 11 0015 以原始风格显示控件的滚动条 11 0016 使用快捷键打开对象观察器中的“...”按钮 ...

    C#编写的一个带树型结构的下拉框控件

    用C#编写的一个下拉框控件,展开后内部可以有树型结构,对应WINFORM程序特别有用.

    Delphi5开发人员指南

    1.8 可扩展的组件和环境 13 1.9 IDE最重要的十点功能 13 1.10 总结 15 第2章 Object Pascal语言 16 2.1 注解 16 2.2 新的过程和函数特征 17 2.2.1 圆括号 17 2.2.2 重载 17 2.2.3 缺省值参数 17 2.3 变量 18 2.4 ...

    C++Builder精彩编程实例集锦的源代码后3部分.rar

    实例029 如何在窗体中动态增加组件 实例030 如何使组件在程序运行时可以移动 实例031 如何使用组件创建托盘程序 实例032 如何使用动画组件播放动画 实例033 如何在状态栏上加载进度条 实例034 如何在编辑框内...

    Access 2007 VBA宝典 1/4

     Access从一开始(大约14年前)就是一个关系型数据库程序,它在表中存储数据,并使用自己的查询、窗体和报表对数据进行排序、筛选、显示和打印。随着Office版本的升级,在Office组件(特别是Word、Excel和Outlook)...

    Delphi 程序设计基础教程

    Delphi 集成开发环境、Delphi 的编程语言、Delphi 窗体与组件、菜单设计、 对话框、工具栏和状态栏设计、Delphi 多媒体应用、Delphi 异常处理与调试、数据库编程、报表与图表、 面向对象的程序设计、Delphi 自定义...

    Delphi_程序设计基础教程

    Delphi 集成开发环境、Delphi 的编程语言、Delphi 窗体与组件、菜单设计、 对话框、工具栏和状态栏设计、Delphi 多媒体应用、Delphi 异常处理与调试、数据库编程、报表与图表、 面向对象的程序设计、Delphi 自定义...

    Delphi深度编程技术

    第3章 自定义组件的编写 3.1 组件的基本概念 3.1.1 属性 3.1.2 方法 3.1.3 事件 3.1.4 拥有关系 3.1.5 父子关系 3.2 组件创建实例 3.3 组件的高级技术--属性编辑器和组件编辑器 3.3.1 组件的属性编辑器 ...

    Access 2000数据库系统设计(PDF)---001

    1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作 查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 1939.1 编写表达式作为查询...

    Access 2000数据库系统设计(PDF)---002

    1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作 查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 1939.1 编写表达式作为查询...

    Access 2000数据库系统设计(PDF)---018

    1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 1939.1 编写表达式作为查询...

    Access 2000数据库系统设计(PDF)---003

    1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作 查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 1939.1 编写表达式作为查询...

    Access 2000数据库系统设计(PDF)---011

    1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 1939.1 编写表达式作为查询...

    Access 2000数据库系统设计(PDF)---020

    1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 1939.1 编写表达式作为查询...

    Access 2000数据库系统设计(PDF)---009

    1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作 查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 1939.1 编写表达式作为查询...

    C++Builder精彩编程实例集锦的源代码(1,2,3部分).rar

    实例029 如何在窗体中动态增加组件 实例030 如何使组件在程序运行时可以移动 实例031 如何使用组件创建托盘程序 实例032 如何使用动画组件播放动画 实例033 如何在状态栏上加载进度条 实例034 如何在编辑框内...

Global site tag (gtag.js) - Google Analytics