Java 自定义窗体(标题栏、窗体背景)

转自:http://hi.baidu.com/chengmaoning/item/b8e3b779ceb89d4a0e0a079c


最近在书上看到这篇文章,觉得挺有意思。与大家分享一下,具体可以参见明日科技出版的《Java经典编程300例》。

默认情况下,我们用java设计的界面窗体是这样的:

 


默认的标题栏、最大化、最小化、关闭按钮、窗体边框。

如何自定义窗体达到如下效果呢?

 


大致说下代码要点:

  1. 设置窗体的Undecorated属性为true,阻止窗体采用本机系统修饰,这样窗体就没有标题栏和边框了。

  2. 设计背景面板类。BackgroundPanel extends JPanel。

  3. 窗体面板添加标题栏面板,位置在上方。

  4. 标题栏面板添加背景面板显示标题栏图片、标题栏面板添加面板用于放置最大化、最小化、关闭按钮。

  5. 窗体面板添加背景面板在中间。contentPane.add(mianPanel,BorderLayout.Center);

  6. 添加按钮响应、添加标题栏拖动代码。

 

代码:

首先是带背景图片面板类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package  cn.chengmaoning.customframe;      
              
import  java.awt.Graphics;      
import  java.awt.Image;      
              
import  javax.swing.JPanel;      
              
public  class  BackgroundPanel  extends  JPanel {      
              
     /**      
      *       
      */
     private  static  final  long  serialVersionUID = -898997756345637309L;      
     private  Image image;      
              
     /**      
      * Constructor      
      */
     public  BackgroundPanel() {      
         super ();      
         setOpaque( false );      
         setLayout( null );      
     }      
              
     /**      
      * @param image      
      *            要设置的 image      
      */
     public  void  setImage(Image image) {      
         this .image = image;      
     }      
              
     @Override
     protected  void  paintComponent(Graphics g) {      
         if  (image !=  null ) {      
             int  width = getWidth(); // 获取组件大小      
             int  height = getHeight();      
             g.drawImage(image,  0 0 , width, height,  this ); // 绘制图片与组件大小相同      
         }      
         super .paintComponent(g); // 执行超类方法      
     }      
                  
}

其次再是主类:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
package  cn.chengmaoning.customframe;     
            
import  java.awt.BorderLayout;     
import  java.awt.Dimension;     
import  java.awt.EventQueue;     
import  java.awt.FlowLayout;     
import  java.awt.GridLayout;     
import  java.awt.Image;     
import  java.awt.Point;     
import  java.awt.event.ActionEvent;     
import  java.awt.event.ActionListener;     
import  java.awt.event.ItemEvent;     
import  java.awt.event.ItemListener;     
import  java.awt.event.MouseAdapter;     
import  java.awt.event.MouseEvent;     
import  java.awt.event.MouseMotionAdapter;     
            
import  javax.jws.Oneway;     
import  javax.swing.ImageIcon;     
import  javax.swing.JButton;     
import  javax.swing.JFrame;     
import  javax.swing.JPanel;     
import  javax.swing.JToggleButton;     
            
public  class  ControlFormStatus  extends  JFrame {     
            
     /**     
      *      
      */
     private  static  final  long  serialVersionUID = -2214759764324605473L;     
     private  JPanel contentPane;     
     private  Point pressedPoint;     
                
     /**     
      * @param args     
      */
     public  static  void  main(String[] args) {     
         // TODO 自动生成的方法存根     
         EventQueue.invokeLater( new  Runnable() {     
                        
             @Override
             public  void  run() {     
                 // TODO 自动生成的方法存根     
                 try  {     
                     ControlFormStatus frame =  new  ControlFormStatus();     
                     frame.setVisible( true );     
                 catch  (Exception e) {     
                     // TODO: handle exception     
                     e.printStackTrace();     
                 }     
             }     
         });     
     }     
                
     /**     
      * Constructor     
      */
     public  ControlFormStatus(){     
         setUndecorated( true );     
         setDefaultCloseOperation(EXIT_ON_CLOSE);     
         setBounds( 100 100 450 300 );     
         contentPane =  new  JPanel();     
         contentPane.setBorder( null );     
         contentPane.setLayout( new  BorderLayout( 0 0 ));     
         setContentPane(contentPane);     
                    
         BackgroundPanel topPanel =  new  BackgroundPanel();     
         topPanel.addMouseMotionListener( new  MouseMotionAdapter() {     
             @Override
             public  void  mouseDragged(MouseEvent e){     
                 do_topPanel_mouseDragged(e);     
             }     
         });     
         topPanel.addMouseListener( new  MouseAdapter() {     
             @Override
             public  void  mousePressed(MouseEvent e) {     
                 // TODO 自动生成的方法存根     
                 do_topPanel_mousePressed(e);     
             }     
         });     
         Image centerImage =  new  ImageIcon(getClass().getResource( "frameTop.png" )).getImage();     
         Dimension dimension =  new  Dimension(centerImage.getWidth( this ), centerImage.getHeight( this ));     
         topPanel.setPreferredSize(dimension);     
         topPanel.setImage(centerImage);     
                    
         contentPane.add(topPanel,BorderLayout.NORTH);     
         topPanel.setLayout( new  FlowLayout(FlowLayout.RIGHT,  5 5 ));     
                    
         JPanel panel =  new  JPanel();     
         panel.setPreferredSize( new  Dimension( 60 22 ));     
         panel.setOpaque( false );     
         topPanel.add(panel);     
         panel.setLayout( new  GridLayout( 1 0 0 0 ));     
                    
         JButton button =  new  JButton( "" );     
         button.setRolloverIcon( new  ImageIcon(ControlFormStatus. class .getResource( "minBH.jpg" )));     
         button.addActionListener( new  ActionListener() {     
                        
             @Override
             public  void  actionPerformed(ActionEvent e) {     
                 // TODO 自动生成的方法存根     
                 do_button_actionPerformed(e);     
             }     
         });     
         button.setFocusPainted( false );     
         button.setBorderPainted( false );     
         button.setContentAreaFilled( false );     
         button.setIcon( new  ImageIcon(ControlFormStatus. class .getResource( "minB.jpg" )));     
         panel.add(button);     
                    
         JToggleButton button_1 =  new  JToggleButton( "" );     
         button_1.addItemListener( new  ItemListener() {     
                        
             @Override
             public  void  itemStateChanged(ItemEvent e) {     
                 // TODO 自动生成的方法存根     
                 do_button_1_itemStateChanged(e);     
             }     
         });     
         button_1.setRolloverIcon( new  ImageIcon(ControlFormStatus. class .getResource( "maxBH.jpg" )));     
         button_1.setRolloverSelectedIcon( new  ImageIcon(ControlFormStatus. class .getResource( "maxBH.jpg" )));     
         button_1.setIcon( new  ImageIcon(getClass().getResource( "maxB.jpg" )));     
         button_1.setContentAreaFilled( false );     
         button_1.setBorderPainted( false );     
         button_1.setFocusPainted( false );     
         panel.add(button_1);     
                    
         JButton button_2 =  new  JButton( "" );     
         button_2.addActionListener( new  ActionListener() {     
                        
             @Override
             public  void  actionPerformed(ActionEvent e) {     
                 // TODO 自动生成的方法存根     
                 do_button_2_actionPerformed(e);     
             }     
         });     
         button_2.setRolloverIcon( new  ImageIcon(getClass().getResource( "closeBH.jpg" )));     
         button_2.setIcon( new  ImageIcon(getClass().getResource( "closeB.jpg" )));     
         button_2.setFocusPainted( false );     
         button_2.setContentAreaFilled( false );     
         button_2.setBorderPainted( false );     
         panel.add(button_2);     
                    
         BackgroundPanel baclBackgroundPanel_1 =  new  BackgroundPanel();     
         Image topImage =  new  ImageIcon(getClass().getResource( "frameCenter.png" )).getImage();     
         baclBackgroundPanel_1.setImage(topImage);     
         contentPane.add(baclBackgroundPanel_1, BorderLayout.CENTER);     
                    
     }     
            
     protected  void  do_button_2_actionPerformed(ActionEvent e) {     
         // TODO 自动生成的方法存根     
         dispose();     
     }     
            
     protected  void  do_button_1_itemStateChanged(ItemEvent e) {     
         // TODO 自动生成的方法存根     
         if  (e.getStateChange() == ItemEvent.SELECTED) {     
             setExtendedState(MAXIMIZED_BOTH);     
         else  {     
             setExtendedState(NORMAL);     
         }     
     }     
            
     protected  void  do_button_actionPerformed(ActionEvent e) {     
         // TODO 自动生成的方法存根     
         setExtendedState(ICONIFIED);     
     }     
            
     protected  void  do_topPanel_mousePressed(MouseEvent e) {     
         // TODO 自动生成的方法存根     
         pressedPoint = e.getPoint();     
     }     
            
     protected  void  do_topPanel_mouseDragged(MouseEvent e) {     
         // TODO 自动生成的方法存根     
         Point point = e.getPoint();     
         Point locationPoint = getLocation();     
                    
         int  x = locationPoint.x + point.x - pressedPoint.x;     
         int  y = locationPoint.y + point.y - pressedPoint.y;     
                    
         setLocation(x, y);     
     }     
            
}

代码中用到的图片如下:(我不知道有什么更好的方法可以把图片保存到这篇文章里,所以只有贴到这里了,试验的同学可以直接另存图片到本机,放置到与.java相同路径下即可)









  • 16
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值