使用Eclipse做Java的WinForm程序時,並沒有拖拉控件的方式。在VS里感受了拖拉控件的好處,看到Java沒有,感覺很不習慣。但是Java提供了各種各樣的布局管理,使用這些布局管理可以做到更精確的布局吧?我只是想簡單的接觸下Java,而且這塊感覺就像Java所特有的,不太喜歡。所以簡單了解一下就可以了!
AWT(Abstract Windows Toolkit)抽象窗口開發包,用於Java Application的GUI編程。本質是希望跨平台。Container和Component是AWT中兩個核心類。
Component又包括一個子類Container。Java圖形用戶界面最基本組成部分是Component,Component類及其子類的對象用來描述以圖形化方式顯示在屏幕上並能與用戶進行交互的GUI元素。一般的Component對象不能獨立的顯示出來,必須與某一Container對象中才可以顯示出來。
創建Windows窗體的方法一

public class vvv { public static void main(String[] args) throws Exception { Frame f = new Frame("Test"); f.setSize(170,200); f.setBackground(Color.blue); f.setVisible(true); f.addWindowListener(new WindowAdapter(){ @Override public void windowClosing(WindowEvent e) { super.windowClosing(e); System.exit(0); } }); } }
創建Windows窗體的方法二

import java.awt.Color; import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class vvv { public static void main(String[] args) throws Exception { MyFrame frame = new MyFrame("這是一個窗體", 100, 100, 300, 400, Color.blue); } } class MyFrame extends Frame { MyFrame(String name, int x, int y, int width, int height, Color c) { super(name); this.setBackground(c); this.setBounds(x, y, width, height); this.setVisible(true); this.addWindowListener(new WindowAdapter(){ @Override public void windowClosing(WindowEvent e) { super.windowClosing(e); System.exit(0); } }); } }
AWT提供了5種布局管理器類:
FlowLayout 、BorderLayout、GridLayout、CardLayout、GridBagLayout
1.FlowLayout是Panel類的默認布局管理器。
FlowLayout布局管理器對組件逐行定位,行內從左到右,一行排滿后換行。可以設不同的間距及對齊方式,默認的對齊方式是局中。

import java.awt.Button; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.Panel; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class vvv { public static void main(String[] args) throws Exception { Frame f = new Frame("FlowLayout Demo"); Button btn1 = new Button("Button1"); Button btn2 = new Button("Button2"); Button btn3 = new Button("Button3"); Button btn4 = new Button("Button4"); Button btn5 = new Button("Button5"); Button btn6 = new Button("Button6"); Button btn7 = new Button("Button7"); Panel panel = new Panel(); panel.setLayout(new FlowLayout(FlowLayout.LEFT,25,25));//設置向左對齊,垂直間距5,水平間距5 panel.add(btn1); panel.add(btn2); panel.add(btn3); panel.add(btn4); panel.add(btn5); panel.add(btn6); panel.add(btn7); f.setBounds(100, 100, 500, 400); f.add(panel); f.setVisible(true); f.addWindowListener(new WindowAdapter(){ @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated method stub super.windowClosing(e); System.exit(0); } }); } }
2.BorderLayout是Frame類的默認布局管理器,BorderLayout將整個容器的布局划分成
東(EAST)西(WEST)南(SOUTH)北(NORTH)中(CENTER)
如不指定組件的加入部位,則默認加入到CENTER區。
每個區域只能加入一個組件,如加入多個,則先前加入的會被覆蓋。

import java.awt.BorderLayout; import java.awt.Button; import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class vvv { public static void main(String[] args) throws Exception { Frame f = new Frame("FlowLayout Demo"); Button btn1 = new Button("Button1"); Button btn2 = new Button("Button2"); Button btn3 = new Button("Button3"); Button btn4 = new Button("Button4"); Button btn5 = new Button("Button5"); f.setLayout(new BorderLayout()); f.add(btn1,BorderLayout.EAST); f.add(btn2,BorderLayout.WEST); f.add(btn3,BorderLayout.NORTH); f.add(btn4,BorderLayout.SOUTH); f.add(btn5,BorderLayout.CENTER); f.setBounds(100, 100, 500, 400); f.setVisible(true); f.addWindowListener(new WindowAdapter(){ @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated method stub super.windowClosing(e); System.exit(0); } }); } }
3.GridLayout型布局管理器將空間划分成規則的矩形網格,每個單元格區域大小相等。組件被添加到每個單元格中,先從左到右滿一行后換行,再從上到下。
在GridLayout構造方法中指定分割的行數和列數
如:GridLayout(3,4);
import java.awt.BorderLayout; import java.awt.Button; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Panel; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class vvv { public static void main(String[] args) throws Exception { Frame f = new Frame("GridLayout Demo"); Button btn1 = new Button("Button1"); Button btn2 = new Button("Button2"); Button btn3 = new Button("Button3"); Button btn4 = new Button("Button4"); Button btn5 = new Button("Button5"); Button btn6 = new Button("Button6"); Button btn7 = new Button("Button7"); Button btn8 = new Button("Button8"); Button btn9 = new Button("Button9"); Button btn10 = new Button("Button10"); f.setLayout(new GridLayout(3,4)); f.add(btn1); f.add(btn2); f.add(btn3); f.add(btn4); f.add(btn5); f.add(btn6); f.add(btn7); f.add(btn8); f.add(btn9); f.add(btn10); f.setBounds(100, 100, 250, 150); f.setVisible(true); f.addWindowListener(new WindowAdapter(){ @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated method stub super.windowClosing(e); System.exit(0); } }); } }
如果在Frame想加入Panel的布局,那么需先將Frame有布局方式清空。
布局管理器的總結:Frame是一個頂級窗口,Frame的缺省布局管理器為BorderLayout。所以如果直接往Frame里面放一個Panel,他將會把Panel放大居中。如果用戶需要親自設置組件大小或位置,則應取消容器的布局管理器,方法為 setLayout(null);