java给标题栏设背景_Java 自定义窗体(标题栏、窗体背景)

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

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

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

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

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

大致说下代码要点:

设置窗体的Undecorated属性为true,阻止窗体采用本机系统修饰,这样窗体就没有标题栏和边框了。   设计背景面板类。BackgroundPanel extends JPanel。   窗体面板添加标题栏面板,位置在上方。   标题栏面板添加背景面板显示标题栏图片、标题栏面板添加面板用于放置最大化、最小化、关闭按钮。   窗体面板添加背景面板在中间。contentPane.add(mianPanel,BorderLayout.Center);   添加按钮响应、添加标题栏拖动代码。

代码:

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

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相同路径下即可)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值