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

来源:互联网 发布:淘宝联盟微信推广技巧 编辑:程序博客网 时间:2024/06/06 09:51

转自: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, 00, 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(100100450300);     
        contentPane = new JPanel();     
        contentPane.setBorder(null);     
        contentPane.setLayout(new BorderLayout(00));     
        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, 55));     
                    
        JPanel panel = new JPanel();     
        panel.setPreferredSize(new Dimension(6022));     
        panel.setOpaque(false);     
        topPanel.add(panel);     
        panel.setLayout(new GridLayout(1000));     
                    
        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相同路径下即可)


0 1
原创粉丝点击