接著前兩篇學習筆記,這篇主要介紹佈局管理器和對話框兩部分內容。 一、佈局管理器 先拿一個小例子來引出話題,就按照我們隨意的添加兩個按鈕來說,會產生什麼樣的效果,看執行結果。 執行結果: 從運行程式中,只看到了第二個按鈕B。 原因是每個組件,在容器中都有一個具體的位置和大小,想在容器中排列組件時很難確 ...
接著前兩篇學習筆記,這篇主要介紹佈局管理器和對話框兩部分內容。
一、佈局管理器
先拿一個小例子來引出話題,就按照我們隨意的添加兩個按鈕來說,會產生什麼樣的效果,看執行結果。
import java.awt.Button; import java.awt.Frame; public class Test25 { public static void main(String[] args) { Frame f = new Frame("佈局管理器"); f.setSize(300, 400); f.add(new Button("按鈕A")); f.add(new Button("按鈕B")); f.setVisible(true); } }
執行結果:
從運行程式中,只看到了第二個按鈕B。
原因是每個組件,在容器中都有一個具體的位置和大小,想在容器中排列組件時很難確定其位置,為簡化用戶的控制,Java採取佈局管理器進行管理可以為容器指定不同的佈局管理器。
1.BorderLayout (邊界佈局,預設的模式) 將容器分為東南西北中五個區域
Frame f=new Frame("佈局管理器"); f.add(new Button("按鈕A"),BorderLayout.NORTH); f.add(new Button("按鈕B")); f.add(new Button("按鈕C"),"East"); f.setBounds(20,20,300,300); f.setVisible(true);
2. FlowLayout 從左到右,從上到下,如果我們在FlowLayout佈局中加入 "North","East" 之類的參數,將被忽略
Frame f=new Frame("佈局管理器"); f.setLayout(new FlowLayout() ); f.add(new Button("按鈕A"),BorderLayout.NORTH); f.add(new Button("按鈕B")); f.add(new Button("按鈕B"));
3. GridLayout 網格,從左到右,從上到下,該佈局總是忽略組件的最佳大小,所有單元的寬度是相同的
4.CardLayout 選項卡佈局
5.GridBagLayout 佈局之王,功能強大,使用複雜,
6.BoxLayOut Swing 中新增的一種佈局管理器,允許多個組件全部垂直或水平擺放,嵌套多個該佈局管理器的Panel,可以實現類似
7.GridBagLayout 的功能,但要比使用 GridBagLayOut 簡單的多
比較複雜點的代碼例子(目的是左邊一列三行網格佈局,右邊選項卡佈局,並且左邊的按鈕按下會引發右邊相應變化)
import java.awt.BorderLayout; import java.awt.Button; import java.awt.CardLayout; import java.awt.Color; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; //佈局的例子 class LayoutTest { public LayoutTest() { init(); } CardLayout cl = new CardLayout(); // 卡片佈局 Panel plCenter = new Panel(); // 面板,容器 private void init() { Frame f = new Frame(); Panel plWest = new Panel(); plWest.setBackground(Color.pink); plCenter.setBackground(Color.DARK_GRAY); f.add(plWest, BorderLayout.WEST); // 往左邊放 f.add(plCenter); plWest.setLayout(new GridLayout(3, 1)); // 網格佈局,三行,一列 Button btnPrev = new Button("前一個"); Button btnNext = new Button("後一個"); Button btnThree = new Button("第三個"); plWest.add(btnPrev); plWest.add(btnNext); plWest.add(btnThree); plCenter.setLayout(cl); // 中間的主面板,設為卡片佈局 plCenter.add(new Button("A"), "1AAA"); plCenter.add(new Button("B"), "2AAA"); plCenter.add(new Button("C"), "3AAA"); plCenter.add(new Button("D"), "4AAA"); plCenter.add(new Button("E"), "5AAA"); plCenter.add(new Button("F"), "6AAA"); // 用於按鈕事件處理的內部類 class MyActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("前一個")) { cl.previous(plCenter); } else if (e.getActionCommand().equals("後一個")) { cl.next(plCenter); } else if (e.getActionCommand().equals("第三個")) { cl.show(plCenter, "5AAA"); // 指定顯示哪一個 } } } MyActionListener listener = new MyActionListener(); btnPrev.addActionListener(listener); btnNext.addActionListener(listener); btnThree.addActionListener(listener); f.setSize(300, 300); f.setVisible(true); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } } class Test26 { public static void main(String[] args) { new LayoutTest(); } }
註意:取消佈局管理器(代碼例子如下)
可以使用絕對座標的方式來指定組件的位置和大小,這時,我們要調用Container.setLayout(null), 然後再調用 Container.setBounds()方法。
import java.awt.Button; import java.awt.Frame; public class Test27 { // 例子,自定義按鈕的位置 public static void main(String[] args) { Frame f = new Frame(); f.setSize(500, 400); f.setLayout(null); // 取消佈局管理器 Button btn = new Button("這是按鈕"); btn.setBounds(50, 50, 80, 40); f.add(btn); f.setVisible(true); } }
二、對話框(Dialog)
對話框在我們日常用電腦時經常見到,不再贅述。直接上代碼例子,熟練一下應用。
import java.awt.Button; import java.awt.Dialog; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.Label; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; public class Test28 { public static void main(String[] args) { new MyWindow(); } } class MyWindow { MyWindow() { init(); } private Dialog dlg; // 對話框 private Label lblMsg; // 標簽 private Frame f; private Button btn; private TextField txtDir; // 用來輸入目錄名稱 private TextArea txtFileList; // 用來顯示文件列表 private void init() { f = new Frame("目錄查看器"); f.setBounds(30, 30, 400, 400); f.setLayout(new FlowLayout()); txtDir = new TextField(30); // 30個字元長度 btn = new Button("顯示文件"); txtFileList = new TextArea(20, 35); // 用來顯示文件列表的區域 f.add(txtDir); f.add(btn); f.add(txtFileList); dlg = new Dialog(f, "提示信息"); // 這個true代表它是否是模態的
//如果是dlg=new Dialog(f, "提示信息",true),代表彈出來對話框以後,就不可以再對後面的對話框進行操作了
lblMsg = new Label("輸入的目錄不正確"); dlg.add(lblMsg); dlg.setBounds(200, 200, 250, 100); dlg.setLayout(new FlowLayout()); initEvent(); f.setVisible(true); } private void initEvent() { dlg.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { ((Dialog) e.getSource()).setVisible(false); // dlg.setVisible(false); }; }); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { txtFileList.setText(""); String dirStr = txtDir.getText(); // 取出用戶輸入的路徑 File file = new File(dirStr); if (file.isDirectory() && file.exists()) { String[] fileNameList = file.list(); for (String s : fileNameList) { txtFileList.append(s + "\r\n"); // 不要忘了加換行符 } } else { // txtFileList.append("你輸入的都是啥?"); dlg.setVisible(true); } } }); } }