微信公眾號請搜索:【Codeplus】
組件與布局
- 1 Java Swing概述
- 2 視窗
- 2.1 JFrame常用方法
- 2.2 選單條、選單、選單項
- 3 常用組件與布局
- 3.1 常用組件
- 3.2 常用容器
- 3.3 常用布局
1 Java Swing概述
Java通過圖形用戶界面(GUI: Graphics User Interface) ,用戶和程式之間可以方便地進行互動,Java的Swing工具包中包含了許多類來支持GUI設計,如:按鈕、選單、串列、文本框等組件類,同時它還包含視窗、面板等容器類,
javax.swing包提供了功能更為強大的用來設計GUI的類,java.awt和javax.swing包中一部分類的層次關系的UML類圖如下所示:
?在學習GUI編程時,必須要很好的掌握兩個概念:容器類和組件類,
?javax.swing包中JComponent類是java.awt包中Container類的一個直接子類、是java.awt包中Component類的一個間接子類,學習GUI編程主要是學習掌握使用Component類的一些重要的子類及其使用方法,
?以下是GUI編程經常提到的基本知識點,
(1) Java把Component類的子類或間接子類創建的物件稱為一個組件.
(2) Java把Container的子類或間接子類創建的物件稱為一個容器.
(3) 可以向容器添加組件,Container類提供了一個public方法:add(),一個容器可以呼叫這個方法將組件添加到該容器中,
(4) 容器呼叫 removeAll() 方法可以移掉容器中的全部組件;呼叫remove(Component c) 方法可以移掉容器中引數c指定的組件,
(5) 注意到容器本身也是一個組件,因此可以把一個容器添加到另一個容器中實作容器的嵌套,
(6) 每當容器添加新的組件或移掉組件時,應當讓容器呼叫validate() 方法,以保證容器中的組件能正確顯示出來
2 視窗
?Java提供的JFrame類的實體是一個底層容器,即通常所稱的視窗,其他組件必須被添加到底層容器中,以便借助這個底層容器和作業系統進行資訊互動,
?JFrame類是Container類的間接子類,當需要一個視窗時,可使用JFrame或其子類創建一個物件,
?視窗也是一個容器,可以向視窗添加組件,
?需要注意的是,視窗默認地被系統添加到顯示幕螢屏上,因此不允許將一個視窗添加到另一個容器中,
2.1 JFrame常用方法
(1) 構造方法
JFrame()//創建一個無標題的視窗,
JFrame(String s)//創建標題為s的視窗,
(2) 常用方法
public void setBounds(int a,int b,int width,int height)//設定視窗的初始位置是(a,b),即距螢屏左面a個像素、距螢屏上方b個像素;視窗的寬是width,高是height,
public void setSize(int width,int height)//設定視窗的大小,
public void setLocation(int x,int y)//設定視窗的位置,默認位置是(0,0),
public void setVisible(boolean b)//設定視窗是否可見,視窗默認是不可見的,
public void setResizable(boolean b)//設定視窗是否可調整大小,默認可調整大小,
public void dispose()//撤消當前視窗,并釋放當前視窗所使用的資源,
public void setExtendedState(int state)//設定視窗的擴展狀態.
public void setDefaultCloseOperation(int operation) //該方法用來設定單擊表單右上角的關閉圖示后,程式會做出怎樣的處理,如:EXIT_ON_CLOSE
public void setLayout(LayoutManager mgr)//設定此容器的布局管理器
public Component add(Component comp)//將指定組件追加到此容器的尾部,
public void setMenuBar(MenuBar mb)//將此frame的選單欄設定為指定的選單欄,
public void validate()//使用validate方法會使容器再次布置其子組件,在修改此容器的子組件的時候(在容器中添加或移除組件,或者更改與布局相關的資訊),應該呼叫上述方法,
下面例子使用JFrame創建了兩個視窗:
import javax.swing.*;
import java.awt.*;
public class Example1 {
public static void main(String[] args) {
JFrame window1 = new JFrame("第一個視窗");
JFrame window2 = new JFrame("第二個視窗");
Container con = window1.getContentPane();
con.setBackground(Color.red);//設定視窗的顏色
window1.setBounds(60, 100, 188, 108);//設定視窗在螢屏上的位置及大小
window2.setBounds(260, 100, 188, 108);
window1.setVisible(true);
window1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//釋放當前視窗
window2.setVisible(true);
window2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出程式
}
}

2.2 選單條、選單、選單項
(1) 選單條
JComponent類的子類JMenubar負責創建選單條,JFrame類有一個將菜單條放置到視窗中的方法:setJMenuBar(JMenuBar bar); 該方法將選單條添加到視窗的頂端,
選單條JMenuBar類構造方法:
JMenuBar ();
JMenuBar Mbar = new JMenuBar ()
(2) 選單
JComponent類的子類JMenu負責創建選單,
選單JMenu類構造方法:
JMenu();
JMenu(String s);
JMenu m = new JMenu();
常用方法:
public void add(JMenuItem item)//向選單增加由引數item指定的選單項
public JMenuItem getItem(int n)//得到指定索引處的選單選項,
public int getItemCount()//得到選單選項的數目,
(3) 選單項
JComponent類的子類JMenultem負責創建選單項,JMenuItem類的主要方法有以下幾種:
JMenuItem(String s)//構造有標題的選單項,
JMenuItem(String text, Icon icon) //構造有標題和圖示的選單項
public void setAccelerator(KeyStroke keyStroke)//為選單項設定快捷鍵
例子2在main方法中用JFrame子類創建一個有選單的視窗:
WindowMenu.java
import javax.swing.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
public class WindowMenu extends JFrame {
JMenuBar menubar; //宣告一個選單條menubar
JMenu menu, subMenu; //宣告兩個選單menu,subMenu
JMenuItem itemLiterature, itemCooking; //宣告兩個選單項itemLiterature, itemCooking
public WindowMenu() {
}
public WindowMenu(String s, int x, int y, int w, int h) { //構造方法,創建視窗
init(s);//視窗初始化
setLocation(x, y);//視窗的位置
setSize(w, h);//視窗的大小
setVisible(true);//視窗可見
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//關閉視窗后的操作
}
void init(String s) {
setTitle(s); //設定視窗的標題
menubar = new JMenuBar(); //創建一個選單條menubar
menu = new JMenu("選單"); //創建一個名為“選單”的選單
subMenu = new JMenu("體育話題"); //創建一個名為“體育話題”的選單
//選單上圖示
//使用圖示類Icon,宣告一個圖示,然后創建其子類ImageIcon類創建一個圖示
//Icon icon = new ImageIcon("a.gif");
itemLiterature = new JMenuItem("文學話題", new ImageIcon("a.gif")); //創建選單項itemLiterature,并帶有標題和圖示
itemCooking = new JMenuItem("烹飪話題", new ImageIcon("b.gif")); //創建選單項itemCooking,并帶有標題和圖示
itemLiterature.setAccelerator(KeyStroke.getKeyStroke('A')); //為選單項itemLiterature設定快捷鍵
itemCooking.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK)); //為選單項itemCooking設定快捷鍵
menu.add(itemLiterature);
menu.addSeparator(); //在選單之間增加分隔線
menu.add(itemCooking);
menu.add(subMenu);
subMenu.add(new JMenuItem("足球", new ImageIcon("c.gif")));
subMenu.add(new JMenuItem("籃球", new ImageIcon("d.gif")));
menubar.add(menu); //將選單添加到選單條上
setJMenuBar(menubar); //將選單條放到視窗中
}
}
Example2.java
public class Example2 {
public static void main(String[] args) {
WindowMenu win=new WindowMenu("帶選單的視窗",20,30,200,190);
}
}

3 常用組件與布局
可以在命令列視窗反編譯組件及時查看組件所具有的屬性及常用方法,例如:
C:\>javap javax.swing.JComponent
例如:

3.1 常用組件
1 文本框:由JComponent的子類JTextField創建文本框,允許用戶在文本框中輸入單行文本
//構造方法
JTextField();
JTextField(int columns);
//常用方法
public String getText();
public void setText(String t);
2 文本區:由JComponent的子類JTexArea創建文本區,允許用戶在文本區輸入多行文本
//構造方法
JTextArea();
JTextArea(int rows, int columns);
//常用方法
public String getText();
public void setText(String t);
3 按鈕:由JComponent的子類JButton類用來創建按鈕,允許用戶單擊按鈕
//構造方法
JButton();
JButton(String text);
//常用方法
public void addActionListener(ActionListener l);
4 標簽:由JComponent的子類JLabel類用來創建標簽,為用戶提供提示資訊
//構造方法
JLabel();
JLabel(String text);
JLabel(Icon image);
//常用方法
public String getText();
public void setText(String t);
5 選擇框:由JComponent的子類JCheckBox類用來創建選擇框,為用戶提供多項選擇
//構造方法
JCheckBox();
JCheckBox(String text);
//常用方法
public void addItemListener(ItemListener l);
public void addActionListener(ActionListener l);
6 單選按鈕:由JComponent的 子類JRadioButton類用來創建單項選擇框,
//構造方法
JRadioButton();
JRadioButton(String text);
//常用方法
public void addItemListener(ItemListener l);
7 下拉串列:由JComponent的子類JComboBox類用來創建下拉串列,
//構造方法
JComboBox();
JComboBox(Object[] items)
//常用方法
public void addItemListener(ItemListener l);
public Object getSelectedItem();
public int getSelectedIndex();
8 密碼框:由JComponent的 子類JPasswordField創建密碼框,密碼框的默認回顯字符是‘*’
//構造方法
JPasswordField();
JPasswordField(int columns);
//常用方法
public String getText();
public void setText(String t);
public void setEchoChar(char c)//使用該方法重新設定回顯字符.
public char[] getPassword()//該方法可以回傳實際的密碼
下面例子展示了一些常用組件:
import javax.swing.*;
import java.awt.*;
class ComponentInWindow extends JFrame {
JCheckBox checkBox1, checkBox2; //宣告兩個復選框
JRadioButton radioM, radioF; //宣告兩個單選框
ButtonGroup group; //宣告一個按鈕組
JComboBox<String> comboBox; //下拉串列
public ComponentInWindow() { //構造方法
init(); //呼叫init()方法
setVisible(true); //視窗可見
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
void init() {
setLayout(new FlowLayout()); //設定此容器的布局管理器
comboBox = new JComboBox<>(); //創建一個下拉串列
//創建兩個復選框
checkBox1 = new JCheckBox("喜歡Java");
checkBox2 = new JCheckBox("喜歡資料結構");
group = new ButtonGroup();
radioM = new JRadioButton("男");
radioF = new JRadioButton("女");
group.add(radioM);
group.add(radioF); //歸組才能實作單選
add(checkBox1);
add(checkBox2);
add(radioM);
add(radioF);
comboBox.addItem("面向物件");
comboBox.addItem("最小生成樹");
add(comboBox);
}
}
public class Example9_3 {
public static void main(String[] args) {
ComponentInWindow win = new ComponentInWindow();
win.setBounds(100, 100, 450, 260);
win.setTitle("常用組件");
}
}

3.2 常用容器
JComponent是Container的子類,因此JComponent 子類創建的組件也都是容器,容器經常用來添加組件,JFrame是底層容器,本節提到的容器被習慣地稱做中間容器,中間容器必須被添加到底層容器中才能發揮作用,
1 JPanel 面板:
//構造方法
JPanel();
//如: JPanel p = new JPanel();
//常用方法
public void add();
使用JPanel創建面板,再向這個面板添加組件,然后把這個面板添加到其它容器中,JPanel面板的默認布局是FlowLayout布局,
2 JTabbedPane選項卡窗格
可以使用JTabbedPane容器作為中間容器,
當用戶向JTabbedPane容器添加一個組件時,JTabbedPane容器就會自動為該組件指定對應的一個選項卡,即讓一個選項卡對應一個組件,
各個選項卡對應的組件層疊式放入JTabbedPane容器,當用戶單擊選項卡時,JTabbedPane 容器將顯示該選項卡對應的組件,
選項卡默認地在JTabbedPane容器的頂部,從左向右依次排列,
JTabbedPane容器可以使用:
add(String text,Component c);
方法將組件c添加到JTabbedPane容器中,并指定和組件c對應的選項卡的文本提示是text,
3 滾動窗格JScrollPane :
滾動窗格只可以添加一個組件,可以把一個組件放到一個滾動窗格中,然后通過滾動條來觀看該組件,
JTextArea不自帶滾動條,因此就需要把文本區放到一個滾動窗格中,
例如,
JScrollPane scroll = new JScrollPane(new JTextArea());
4 拆分窗格JSplitPane
拆分窗格就是被分成兩部分的容器,拆分窗格有兩種型別:水平拆分和垂直拆分,
水平拆分窗格用一條拆分線把窗格分成左右兩部分,左面放一個組件,右面放一個組件,拆分線可以水平移動,垂直拆分窗格用一條拆分線把窗格分成上下兩部分,上面放一個組件,下面放一個組件,拆分線可以垂直移動,
/*JSplitPane的兩個常用的構造方法*/
JSplitPane(int a,Component b,Component c)
//引數a取JSplitPane的靜態常量HORIZONTAL SPLIT或VERTICAL _SPLIT,以決定是水平還是垂直拆分,
//后兩個引數決定要放置的組件,
JSplitPane(int a, boolean b,Component c,Component d)
//引數a取JSplitPane的靜態常量HORIZONTAL SPLIT或VERTICAL_ SPLIT,以決定是水平還是垂直拆分
//引數b決定當拆分線移動時,組件是否連續變化(true是連續)
5 JLayeredPane分層窗格
如果添加到容器中的組件經常需要處理重疊問題,就可以考慮將組件添加到分層窗格,分層窗格分成5個層,分層窗格使用
add(Jcomponent com, int layer);
添加組件com,并指定com所在的層,其中引數layer取值JLayeredPane類中的類常量:
DEFAULT LAYER、PALETTE I AYER、MODAL LAYER、POPUP I AYER、DRAG LAYER,
DEFAULT_ LAYER是最底層,添加到DEFAULT_ LAYER層的組件如果和其他層的組件發生重疊時,將被其他組件遮擋,DRAG LAYER層是最上面的層,如果分層窗格中添加了許多組件,當用戶用滑鼠移動一組件時,可以把該組件放到DRAG_ LAYER層,這樣,用戶在移動組件程序中,該組件就不會被其他組件遮擋,添加到同一層上的組件,如果發生重疊,后添加的會遮擋先添加的組件,分層窗格呼叫public void setLayer(Component c,int layer) 可以重新設定組件c所在的層,呼叫public int getLayer(Component c) 可以獲取組件c所在的層數,
3.3 常用布局
?當把組件添加到容器中時,希望控制組件在容器中的位置,這就需要學習布局設計的知識,
?我們將分別介紹java.awt包中的FlowLayout、BorderLayout、CardLayout、GridLayout 布局類和java.swing.border包中的BoxLayout布局類,
?容器可以使用方法:
setLayout(布局物件);
來設定自己的布局,控制組件在容器中的位置
1 FlowLayout布局:是JPanel型容器的默認布局
1)創建布局物件: FlowLayout flow=new FlowLayout();
2)容器con使用布局物件:== con.setLayout(flow);==
3)con可以使用Container類提供的add方法將組件順序地添加到容器中
FlowLayout布局物件呼叫相應的方法可以重新設定布局的對齊方式等.
如: public void setAlignment(int align)
2 BorderLayout布局:
BorderLayout布局是Window型容器的默認布局
使用BorderLayout布局的容器con,可以使用add方法將一個組件b添加到中心區域: con.add(b,BorderLayout.CENTER);
或con.add(BorderLayour.CENTER,b);
3 CardLayout 布局:使用CardLayout的一般步驟如下:
1)創建CardLayout物件 CardLayout card=new CardLayout();
2)為容器設定布局con.setLayout(card);
3)容器呼叫add(String s,Component b)將組件b加入容器,并給出了顯示該組件的代號s,
4)布局物件card用CardLayout類提供的show()方法,顯示容器con中組件代號為s的組件: card.show(con,s);
使用CardLayout的容器可以容納多個組件,但是實際上同一時刻容器只能從這些組件中選出一個來顯示,就像一疊“撲克牌”每次只能顯示最.上面一張一樣,這個被顯示的組件將占據所有的容器空間,依次排
4 GridLayout布局:
GridLayout布局策略是把容器劃分成若干行乘若干列的網格區域,組件就位于這些劃分出來的小格中,GridLayout布局編輯器的一般步驟如下:
1)創建布局物件,指定劃分網格的行數m和列數n
GridLayout grid=new new GridLayout(10, 8) ;
2)使用GridLayout布局的容器呼叫方法add (Component c) 將組件c加入容器,
5 null布局
可以把一個容器的布局設定為null布局(空布局),空布局容器可以準確地定位組件在容器的位置和大小, setBounds(int a,int b,int width,int height)方法 是所有組件都擁有的一個方法,組件呼叫該方法可以設定本身的大小和在容器中的位置,
例如,p是某個容器,
p.setLayout(null);
把p的布局設定為空布局,
向空布局的容器p添加一個組件c需要兩個步驟,
首先,容器p使用 add( c ) 方法添加組件,然后組件c再呼叫setBounds(int a,int b,int width,int height)方法設定該組件在容器p中的位置和本身的大小,組件都是一個矩形結構,方法中的引數a,b是組件c的左上角在容器p中的位置坐標,即該組件距容器p左面a個像素,距容器p上方b個像素,width,height是組件c的寬和高,
下面例子是在視窗的中心位置添加一個選項卡窗格,該選項卡窗格里添加了一個網格布局面板和一個空布局面板:
Example.java
public class Example {
public static void main(String[] args) {
new ShowLayout();
}
}
ShowLayout.java
import java.awt.*;
import javax.swing.*;
public class ShowLayout extends JFrame {
PanelGridLayout panelGridLayout; //網格布局的面板
PanelNullLayout panelNull; //空布局的面板
JTabbedPane p; //選項卡窗格
ShowLayout() {
panelGridLayout = new PanelGridLayout();//創建一個網格布局的面板
panelNull = new PanelNullLayout();//創建一個空布局的面板
p = new JTabbedPane();//創建一個選項卡,用于選擇哪種面板布局
p.add("網格布局的面板", panelGridLayout);//添加網格布局面板到選項卡窗格
p.add("空布局的面板", panelNull);//添加空布局的面板到選項卡窗格
add(p, BorderLayout.CENTER);//將選項卡窗格添加到ShowLayout面板
//添加按鈕到大面板上
add(new JButton("表單是BorderLayout布局"), BorderLayout.NORTH);
add(new JButton("南"), BorderLayout.SOUTH);
add(new JButton("西"), BorderLayout.WEST);
add(new JButton("東"), BorderLayout.EAST);
setBounds(10, 10, 570, 390);
setVisible(true);//視窗可見
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
validate();
}
}
PanelGridLayout.java
import java.awt.*;
import javax.swing.*;
public class PanelGridLayout extends JPanel {//網格布局面板
PanelGridLayout() {
GridLayout grid = new GridLayout(12, 12); //網格布局
setLayout(grid);
Label label[][] = new Label[12][12];
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++) {
label[i][j] = new Label();
if ((i + j) % 2 == 0)
label[i][j].setBackground(Color.black);
else
label[i][j].setBackground(Color.white);
add(label[i][j]);//將小的網格添加到該面板上
}
}
}
}
PanelNullLayout.java
import javax.swing.*;
public class PanelNullLayout extends JPanel {//空白頁面布局
JButton button;//“確定”按鈕
JTextField text;//文本框
PanelNullLayout() {
setLayout(null); //空布局
button = new JButton("確定"); //創建“確定”按鈕
text = new JTextField();//創建文本框
add(text); //將文本框添加到PanelNullLayout面板上
add(button); //將按鈕添加到PanelNullLayout面板上
text.setBounds(100, 30, 90, 30); //設定文本框大小
button.setBounds(190, 30, 66, 30); //設定按鈕大小
}
}
運行截圖如下:


6 BoxLayout布局
Box類的類(靜態)方法createHorizontalBox() 獲得一個行型盒式容器;
使用Box類的類(靜態)方法createVerticalBox() 獲得一個列型盒式容器,
想控制盒式布局容器中組件之間的距離,需使用水平支撐組件或垂直支撐,
下面例子中有兩個列型盒式容器boxVOne、boxVTwo和一個行型盒式容器boxH,將boxVOne、boxVTwo添加到boxH中并在它們之間添加了水平支撐,
Example.java
public class Example {
public static void main(String[] args) {
WindowBoxLayout win = new WindowBoxLayout();
win.setBounds(100, 100, 310, 260);
win.setTitle("嵌套盒式布局容器");
}
}
WindowBoxLayout .java
import javax.swing.*;
public class WindowBoxLayout extends JFrame {
Box boxH; //行式盒
Box boxVOne, boxVTwo; //列式盒
public WindowBoxLayout() {
setLayout(new java.awt.FlowLayout());
init();
setVisible(true);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
void init() {
boxH = Box.createHorizontalBox();//獲得一個行型盒式容器
boxVOne = Box.createVerticalBox();//獲得一個列型盒式容器
boxVTwo = Box.createVerticalBox();//獲得一個列型盒式容器
boxVOne.add(new JLabel("姓名:"));//列型盒式容器添加姓名標簽
boxVOne.add(new JLabel("職業:"));//列型盒式容器添加職業標簽
boxVTwo.add(new JTextField(10));//列型盒式容器添加姓名輸入框
boxVTwo.add(new JTextField(10));//列型盒式容器添加職業輸入框
boxH.add(boxVOne);
boxH.add(Box.createHorizontalStrut(10));
boxH.add(boxVTwo);
add(boxH);
}
}
運行結果如下:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/281242.html
標籤:java
