在学习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); } }); } }
效果如图:
相关推荐
本人编写的一个截屏组件。详情请参见这里:http://www.cnblogs.com/zzy0471/archive/2010/09/04/1817971.html
与一般的组件包不同,CnPack 开发包除了有大量的组件外,还包括 IDE 专家包、属性编辑器、组件编辑器、公共窗体库、版本控制及其它辅助工具等,在 CnPack 的设计中,包含以下内容:不可视工具组件包。 用户界面控件...
第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 加入事件 ...
0011 如何锁定窗体中的组件 9 0012 如何改变窗体上的网格大小 10 0013 组件的选取 10 0014 改变窗体Hint背景色 11 0015 以原始风格显示控件的滚动条 11 0016 使用快捷键打开对象观察器中的“...”按钮 ...
用C#编写的一个下拉框控件,展开后内部可以有树型结构,对应WINFORM程序特别有用.
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 ...
实例029 如何在窗体中动态增加组件 实例030 如何使组件在程序运行时可以移动 实例031 如何使用组件创建托盘程序 实例032 如何使用动画组件播放动画 实例033 如何在状态栏上加载进度条 实例034 如何在编辑框内...
Access从一开始(大约14年前)就是一个关系型数据库程序,它在表中存储数据,并使用自己的查询、窗体和报表对数据进行排序、筛选、显示和打印。随着Office版本的升级,在Office组件(特别是Word、Excel和Outlook)...
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 组件的属性编辑器 ...
1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作 查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 1939.1 编写表达式作为查询...
1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作 查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 1939.1 编写表达式作为查询...
1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 1939.1 编写表达式作为查询...
1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作 查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 1939.1 编写表达式作为查询...
1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 1939.1 编写表达式作为查询...
1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 1939.1 编写表达式作为查询...
1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作 查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 1939.1 编写表达式作为查询...
实例029 如何在窗体中动态增加组件 实例030 如何使组件在程序运行时可以移动 实例031 如何使用组件创建托盘程序 实例032 如何使用动画组件播放动画 实例033 如何在状态栏上加载进度条 实例034 如何在编辑框内...