我爱电脑技术论坛's Archiver

star2008 发表于 2008-4-3 07:38

Java GUI中关于布局管理器的使用方法介绍

很多初学者在用Java布局器自动布局画界面时,经常遇见不知道如何定义区域大小或按钮之间的距离等问题。我写过一篇《实现JAVA手动布局中各个组件能随窗口变化的方法》的文章,有读者反映算坐标不好算,问能不能用布局器实现文章中的界面。其实自动布局也可以解决定义区域大小或按钮之间的距离等问题,只是没有手动布局那么灵活。下面我就举一个例子。
S1n4vlsS5hj6si rr \&NQ W-L_

dY.rx _$Hg 首先,建一个frame文件(Application应用程序),在Design中将this中的layout设置为BorderLayout。
U*N z/xW
o7HL [,sh3v/q 9r8g1{v'B?N#{
第二,在组件盘内点选Swing Container页签,选取Jpanel图标,在this中上方拖拽一块区域,布局器会自动调整位置与大小;同样的方法在中下方也拖拽一块区域;在Swing Container页签,选取jScrollPane图标,将jScrollPane在中间拖拽一块区域。拖拽的顺序一定要先上后下再中间。为了方便区分,在Properties的background中,将上方的Jpanel1区域设置为红色,下方的Jpanel2区域设置为橙色,中间的jScrollPane1为粉红色。将Jpanel1和Jpanel2的layout设置为flowLayout(必须要手动设置,不要采用默认值)。
BqsKj(V'b Q r-Q!h'q%~5^:G4P
c'K[A0pi#t b
第三,在Jpanel中放入一个Jlable标题栏,JTextField1文本框和Jbutton按钮,在组件盘内点选Swing 页签,选取JLable图标在Jpanel1的中画一个标题栏,将text改为“请输入查询条件”,再选取JtextField在Jpanel1中画一个文本框,将text改为空,最后选取Jbutton在Jpanel1中再画一个按钮将text改为“查询”。画完后他们都是在中间,而且大小固定,这时点选Jpanel的flowLayout1将右边Properties中的alignment设置为LEFT,这时Jpanel1中的组键就会向左排列。选中其中一个组键,在Properties中的preferredSize可以设置组键的宽和高。同样的方法在Jpanel2中画三个Jbutton按钮,将text分别设为“增加”、“删除”、“修改”。点选Jpane2的flowLayout2将右边Properties中的hgap设置为30(按钮的间距,可根据自己的需要调整数值大小), 这样就调整了三个按钮之间的距离,设置vgap还可以改变Jpane2区域的高度。 *gz#x(GB1^R,Xs
k0ZR}R%?f:hnn
msF^A
第四,在jScrollPane1中建一个表格用来显示数据库数据的内容,在组件盘内点选Swing 页签,选取JTable图标,将Jtable加入到jScrollPane1中。
f!qpC A? S-p%@L)G3e{*Ff)m2Lb F
:Mbhnz v
最后,将this中的defaultCloseOperation改为EXIT_ON_CLOSE,这样在关闭窗口时程序会自动退出。 ^3W s/e8ai4S

.Iw? W?5Ut
}M,p{}aG\ 程序源代码如下(除中文注释部分的两句是自己加上去,其余是自动生成):
I4S2VY{L1b 4^2g2N)shj
|'^V(d8kY?
import javax.swing.*;
e|0a.e5XE
p[Gy;Pl import java.awt.*; $g5H8h C*tOK2E`

f7a\2Tll2i1^x import java.awt.event.*;
:X1W }#k"UG f#e Ng`;M8K5A \#B/Du]"\G
import java.util.Vector; 3M lNke9Z*WjX

.E^.E'E;gN9D P]b import javax.swing.table.DefaultTableModel;
:p OE"B0{G]*a1Gc r/pjpF*r0q
public class Frame1 0m_ c-gr-cv j

$W'}0m]x extends JFrame {
0i7Sj^ RyX._ 9Fa H&{L
BorderLayout borderLayout1 = new BorderLayout(); 0M![a1\#_-^G

B%[)N@q JPanel jPanel1 = new JPanel();
#W t$h ICx"u
%U'Oq1N!WjNg Y#c JPanel jPanel2 = new JPanel();
"V H&pY$[yF/S
Y$sa O s&X:Lm$uM JPanel jPanel3 = new JPanel();
4h)u)K F7[%`en \I;X t5e!YU'S;z2k+T
JLabel jLabel1 = new JLabel();
JW] t}A8XVc !VO:E(|)sPpE
JTextField jTextField1 = new JTextField(); ?:vzvz
(YOOW9R
JButton jButton1 = new JButton();
?(^m&ir+n;[x |&Ae"k Fh
FlowLayout flowLayout1 = new FlowLayout();
0r3ed#v7MHc &OM;is Ce
FlowLayout flowLayout2 = new FlowLayout();
UU PdK7}I1H(w}&f h0bY{dD$z |
JButton jButton2 = new JButton(); 0eJ{4@!i8Fu

*d7x!j*eK ]6vR!YT{Y;W _ JButton jButton3 = new JButton(); }.c%NUY Si
;N*T;K N7w3U"a
JButton jButton4 = new JButton(); w\csA&u?`"s
.NT\vl:[F$B
GridLayout gridLayout1 = new GridLayout();
ry2}kv)R kGr5DmL-D4a_,i5o
JScrollPane jScrollPane1 = new JScrollPane();
Y^b3N9_zy`L^"t
?Cq,R}:ZGxBO2i JTable jTable1 = new JTable(); v6x1\^l
gP X;o.i%p']

*P/M8]Q-EF!vO public Frame1() {
_c(b|*M U6v:i7v a2LrCzz
try {
(\&W&p:VP#e
G q la4MG jbInit(); \z }tf
$xQdP,_M0eE;\*a
} !Lo+R1[sdj+G

%`?lY-Zu2vh@ catch (Exception e) { 5s"c:y/j Lw2e
_ H w c6H$KF5_ j
e.printStackTrace(); }d k:Ie;xNrv ~
Kl{b#Y9g
} jq^gh

k:Q1K+@p SpT$i } 5V2zec TIjh:vLR!S
%N U1u9To"N)c
&@3Yy|!S{7V ?n-eQ~
public static void main(String[] args) { 6_}j(}4X+h'e

LkJ#Lg;{/[,M9ep Frame1 frame1 = new Frame1(); kd X!kv7D^*B\,~
$e4I-o"VY5@8O;E!aIj3v
frame1.setSize(new Dimension(400, 350)); 4CH H~1}v#w5b

xm} z,t C$K"zJ frame1.show(); 2lveT-p

2Z,p$`+js 6YH(Jye3Yv
} 9d m1qMt6o

G/e7f-v)m3UB rT$W5iZM#J iG
private void jbInit() throws Exception {
`s9cw5N4Jw
"B1uDKZ this.getContentPane().setLayout(borderLayout1); /T)hQ e9J^:I

`O&KX!Ft*{:Q&kP&B jPanel1.setBackground(Color.red); g._ }Fqy~ G7d@

&h,z'p\/nE jPanel1.setLayout(flowLayout1);
1As V7NYFx (e4`]1~] ^
jPanel2.setBackground(Color.red); lMA:W6asu
2Fc%RSZ\8| R
jPanel2.setLayout(flowLayout2);
8IGP#Z[1w W
N5f`9{0Ih-U%F(`#z jPanel3.setBackground(Color.pink); 'YO pw/cmD7hw

F9GIe6]d jPanel3.setLayout(gridLayout1);
({.YVx'\^ @a5l
*Mj*O,M"K-^f4e,yzT(l jLabel1.setPreferredSize(new Dimension(100, 16)); l/p9nDRX#|

(kT5[5y#zG;D{ jLabel1.setText("请输入查询条件"); !v.TS S8n(G:It

hRIB4?:T M4M$h7gS6c jTextField1.setPreferredSize(new Dimension(140, 22)); ,i4l5O(`0Q)L _6x

:C[0k:wy:vj jTextField1.setText("");
2EN'ly~2LL XE &Z:?dD](N
jButton1.setText("查询");
"gA'I-m7H%U%v+E '~I:Il"N|E
jButton1.addActionListener(new Frame1_jButton1_actionAdapter(this)); c*sK l7q ]#C

A7lZH-[]#{] flowLayout1.setAlignment(FlowLayout.LEFT);
jt/v_1` T q(xh
3\Z$O'pY%R v flowLayout1.setHgap(5); 3om{3pf4\f k4?

+Ib[C#t1s2q0z flowLayout1.setVgap(10); p!a"B2nh

t}6j Xr*y jButton2.setText("增加"); B)qrch7X$f&x
*ESdP!@/F#B]z|-J,l
jButton3.setText("删除"); qIJj(W_

LsDhhj5j5h/Z _ jButton4.setText("修改"); 6U;~DujfK"B

m2xA7iYj3E flowLayout2.setHgap(30);
h?(Up^ r J
$ji"?\c \ flowLayout2.setVgap(5);
dar6LbM Q+jXC F/WL8c0{
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
Q {4{].T!t E0y-l/X8o;d Xb7H
this.getContentPane().add(jPanel1, BorderLayout.NORTH); kYW/L:KQ
f `Cz xW9Cpn!P i}O
jPanel1.add(jLabel1, null); _k#`:W_x:R~
_p3T8lyO.{L0?
jPanel1.add(jTextField1, null); 1k/LE.M,?wa(ulF'K

!z9Ki@R4C4a'd jPanel1.add(jButton1, null); (e|f)m?b"G p
:q h'u"F t?
this.getContentPane().add(jPanel2, BorderLayout.SOUTH);
-v.A-f4|cV
1F i {8h)Q ~f jPanel2.add(jButton2, null);
,RTo/PL5`/n*@,O E ]u c3|
jPanel2.add(jButton3, null); `u A ~o!D%d

G0AQ3U]a)J jPanel2.add(jButton4, null); O$L} z?([
5p6nXIOMI,gZ
this.getContentPane().add(jPanel3, BorderLayout.CENTER); f!Jv(Ju/X{x1[
sc1Jo.{
jPanel3.add(jScrollPane1, null);
I[8]%O4^9g AR tr4U mX&G;ym
jScrollPane1.getViewport().add(jTable1, null); 0o|t E:]@

;BHk%H5R Q-O"U } 8Z]N R3L(w\[

bF-R+C@(Y ,VKxU$C8Sz W,n
//模拟查询数据库
cI1Kt}Y i .Pj M`t3C qm7h
void jButton1_actionPerformed(ActionEvent e) {
(?+f \.e%jac
9~.E@q.Jm,v@a3] C try { //制作表
@z kO1Rg(D&s F1W
A:?#y5S(}P7X*V%A Vector vcol = new Vector(); //列名
Gh5i x`!{*c
V/@Lm@ek Vector vrow = new Vector(); //内容 M m&MZ/a)?V5oa"~ R
$B6^H,TVEf2h
for (int col = 1; col < 31; col++) {
:`3Jq&fZs j@*Ojsf)N
vcol.addElement("列" + col); &CQuPs
wO$T3Nc"~
} I3@_R!Y

%aH tOZ Rsj for (int row = 1; row < 101; row++) { D-C$G'cl7Z's

VH%U7V"O3L,X Vector vr1 = new Vector(); y s+s8Nn`

'i]+jS\ for (int col = 1; col < 31; col++) {
vJ@$zVR+L f IpZ(lV-v
vr1.addElement(row + "/" + col);
C%_x.\8DS2{p0_
-{ B6}!^+Op.fM } 0D C9nQ&z#q0iY@.w0f

e3EbNr vrow.addElement(vr1); ?+m6U(ZafWuay

(N1u.b5q y'Z6q G } d;M\dx,Vn!\ l2~
Zc1d%}Z'ubqj
DefaultTableModel dtm = new DefaultTableModel(vrow, vcol); `1\2nJ.isw"}MVR
e"Sj@8ia?
jTable1 = new JTable(vrow, vcol); ]egTG1@"gP-t

0^cC n5q Ze$Z jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); //滚动条设置左右滚 AP?8vH4j,d d
7@7bEPL/S3K
this.jScrollPane1.getViewport().add(jTable1, null); //在滚动条中放入表
,WYRuN?#ST
0By1o6\OL } @7vk6} }m6?8U
2t5W1wev:b
catch (Exception ex) { .gn/[U*yMCr HR\ w
jo]Kt`
JOptionPane.showMessageDialog(null, ex); kg`J~
7d!Yk;Lw^i
} AS}R[K?6dK.x

apS/fC~ ]#hVKn G {1iwNd H
} 8T+Yg)L j{
d W,q I-xt$Dk
}
x6j3@s@z,c(@w tg#A eot
Ah:M _gW N8B7s]n
class Frame1_jButton1_actionAdapter (kJt0q K+@

B?(s`+e!pa implements java.awt.event.ActionListener { n'fo3U1N!kqP
*tZ(qFd;D5`!X*C
Frame1 adaptee;
jo4@ Jfw \{D8x,~ _'])G4ChY

t'l4^1x{%D3Ym:` Frame1_jButton1_actionAdapter(Frame1 adaptee) { &b ?0Q#H?+Q#a#a
uuX.a}%rh5F(n] J
this.adaptee = adaptee;
4n2_ZK mN &OHEel#M-lv9Z
}
G,N^6u?+A-N[y1`h
{c+Js,Q&cy
"\3E`*Y&Y8ui public void actionPerformed(ActionEvent e) { 2T/p v*M"s6P.l.D
G\eX9v,JD
adaptee.jButton1_actionPerformed(e);
hXt[ g;vbj(]
(H:a9\'s:bJ6A?)C }
S;o:]p%\vgt
pJP#Kn }

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.