Java学习——用户界面的布局
使用布局管理器
FlowLayout管理器
面板的默认布局管理器是java.awt包中的FlowLayout类。使用FlowLayout时,像在页面中排列英文单词那样排组件:从左到右排列,当前行没有空间后进入下一行。
1 import java.awt.*; 2 import javax.swing.*; 3 4 public class Crisis extends JFrame { 5 JButton panicButton; 6 JButton dontPanicButton; 7 JButton blameButton; 8 JButton mediaButton; 9 JButton saveButton; 10 11 public Crisis() { 12 super("Crisis"); 13 setLookAndFeel(); 14 setSize(348, 128); 15 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 16 // 1.默认布局 17 FlowLayout flo = new FlowLayout(); 18 setLayout(flo); 19 panicButton = new JButton("Panic"); 20 dontPanicButton = new JButton("Don't Panic"); 21 blameButton = new JButton("Blame Others"); 22 mediaButton = new JButton("Notify the Media"); 23 saveButton = new JButton("save yourself"); 24 add(panicButton); 25 add(dontPanicButton); 26 add(blameButton); 27 add(mediaButton); 28 add(saveButton); 29 setVisible(true); 30 } 31 32 private void setLookAndFeel() { 33 try { 34 UIManager.setLookAndFeel( 35 "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 36 } catch (Exception exc) { 37 // ignore error 38 } 39 } 40 41 public static void main(String[] arguments) { 42 Crisis frame = new Crisis(); 43 } 44 }
GridLayout管理器
GridLayout类位于java.awt包中,它将容器中所有的组件组织为指定的行数和列数。分配给每个组件的显示区域都相同。
当组件加入到容器中时,GridLayout将所有的组件放置到网格中的某个位置,而且组件是从左到右依次添加,当这一行满了之后,在从下一行的最左边开始添加。
1 import java.awt.*; 2 import javax.swing.*; 3 4 public class Crisis extends JFrame { 5 JButton panicButton; 6 JButton dontPanicButton; 7 JButton blameButton; 8 JButton mediaButton; 9 JButton saveButton; 10 11 public Crisis() { 12 super("Crisis"); 13 setLookAndFeel(); 14 setSize(348, 128); 15 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 16 17 // 2.GridLayout布局 18 GridLayout grid = new GridLayout(2, 3); 19 setLayout(grid); 20 panicButton = new JButton("Panic"); 21 dontPanicButton = new JButton("Don't Panic"); 22 blameButton = new JButton("Blame Others"); 23 mediaButton = new JButton("Notify the Media"); 24 saveButton = new JButton("save yourself"); 25 add(panicButton); 26 add(dontPanicButton); 27 add(blameButton); 28 add(mediaButton); 29 add(saveButton); 30 setVisible(true); 31 } 32 33 private void setLookAndFeel() { 34 try { 35 UIManager.setLookAndFeel( 36 "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 37 } catch (Exception exc) { 38 // ignore error 39 } 40 } 41 42 public static void main(String[] arguments) { 43 Crisis frame = new Crisis(); 44 } 45 }
BorderLay管理器
BorderLayout类也位于java.awt包中,它将容器中的组件放置在特定的位置,该位置有5个方位:东、西、南、北、中。
BorderLayout管理器将组件放置到5个位置:其中4个位置由罗盘方向指定,另外一个由中心区域指定。当在该布局下添加组件时,add()方法会包含第2个参数,用于指示组件应该放置的位置。该参数应该是BorderLayout类的5个类变量之一:NORTH、SOUTH、EAST、WEST和CENTER。
与GridLayout类相同,BorderLayout也会将所有可用空间都分配给组件。在周围放置4个边界组件后,余下的空间都分配给中央的组件,因此它通常是最大的。
1 import java.awt.*; 2 import javax.swing.*; 3 4 public class Crisis extends JFrame { 5 JButton panicButton; 6 JButton dontPanicButton; 7 JButton blameButton; 8 JButton mediaButton; 9 JButton saveButton; 10 11 public Crisis() { 12 super("Crisis"); 13 setLookAndFeel(); 14 setSize(348, 128); 15 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 16 BorderLayout crisisLayout = new BorderLayout(); 17 setLayout(crisisLayout); 18 19 panicButton = new JButton("Panic"); 20 dontPanicButton = new JButton("Don't Panic"); 21 blameButton = new JButton("Blame Others"); 22 mediaButton = new JButton("Notify the Media"); 23 saveButton = new JButton("save yourself"); 24 add(panicButton, BorderLayout.NORTH); 25 add(dontPanicButton, BorderLayout.SOUTH); 26 add(blameButton, BorderLayout.EAST); 27 add(mediaButton, BorderLayout.WEST); 28 add(saveButton, BorderLayout.CENTER); 29 setVisible(true); 30 } 31 32 private void setLookAndFeel() { 33 try { 34 UIManager.setLookAndFeel( 35 "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 36 } catch (Exception exc) { 37 // ignore error 38 } 39 } 40 41 public static void main(String[] arguments) { 42 Crisis frame = new Crisis(); 43 } 44 }
BoxLayout管理器
BoxLayout类位于javax.swing包中,它可以将组件排列成一行或一列。
使用该布局时,先创建一个放置组件的面板,然后再创建一个布局管理器,它带有2个参数:
1.以框式布局组织的组件;
2.BoxLayout.Y_AXIS指定垂直排列,BoxLayout.X_AXIS指定水平排列;
1 import java.awt.*; 2 import javax.swing.*; 3 4 public class Crisis extends JFrame { 5 JButton panicButton; 6 JButton dontPanicButton; 7 JButton blameButton; 8 JButton mediaButton; 9 JButton saveButton; 10 11 public Crisis() { 12 super("Crisis"); 13 setLookAndFeel(); 14 setSize(348, 128); 15 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 16 JPanel pane = new JPanel(); 17 BoxLayout box = new BoxLayout(pane, BoxLayout.Y_AXIS); 18 pane.setLayout(box); 19 panicButton = new JButton("Panic"); 20 dontPanicButton = new JButton("Don't Panic"); 21 blameButton = new JButton("Blame Others"); 22 mediaButton = new JButton("Notify the Media"); 23 saveButton = new JButton("save yourself"); 24 pane.add(panicButton); 25 pane.add(dontPanicButton); 26 pane.add(blameButton); 27 pane.add(mediaButton); 28 pane.add(saveButton); 29 add(pane); 30 31 setVisible(true); 32 } 33 34 private void setLookAndFeel() { 35 try { 36 UIManager.setLookAndFeel( 37 "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 38 } catch (Exception exc) { 39 // ignore error 40 } 41 } 42 43 public static void main(String[] arguments) { 44 Crisis frame = new Crisis(); 45 } 46 }
使用Insets将组件隔开
Insets类位于java.awt包中,它有一个接受4个参数的构造函数:在容器上、下、左、右留出的空间。每个参数都以像素为单位,像素是定义框架大小时使用的度量单位。
1 public Insets getInsets() { 2 Insets squeeze = new Insets(60, 15, 10, 15); 3 return squeeze; 4 }
布局测试
1 import java.awt.*; 2 import javax.swing.*; 3 4 public class LottoMadness extends JFrame { 5 // set up row1 6 JPanel row1 = new JPanel(); 7 ButtonGroup option = new ButtonGroup(); 8 JCheckBox quickpick = new JCheckBox("Quick Pick", false); 9 JCheckBox personal = new JCheckBox("Personal", true); 10 // set up row2 11 JPanel row2 = new JPanel(); 12 JLabel numbersLabel = new JLabel("Your picks: ", JLabel.RIGHT); 13 JTextField[] numbers = new JTextField[6]; 14 JLabel winnersLabel = new JLabel("Winners: ", JLabel.RIGHT); 15 JTextField[] winners = new JTextField[6]; 16 // set up row3 17 JPanel row3 = new JPanel(); 18 JButton stop = new JButton("Stop"); 19 JButton play = new JButton("play"); 20 JButton reset = new JButton("Reset"); 21 // set up row4 22 JPanel row4 = new JPanel(); 23 JLabel got3Label = new JLabel("3 of 6: ", JLabel.RIGHT); 24 JTextField got3 = new JTextField("0"); 25 JLabel got4Label = new JLabel("4 of 6: ", JLabel.RIGHT); 26 JTextField got4 = new JTextField("0"); 27 JLabel got5Label = new JLabel("5 of 6: ", JLabel.RIGHT); 28 JTextField got5 = new JTextField("0"); 29 JLabel got6Label = new JLabel("6 of 6: ", JLabel.RIGHT); 30 JTextField got6 = new JTextField("0"); 31 JLabel drawingsLabel = new JLabel("Drawings", JLabel.RIGHT); 32 JTextField drawings = new JTextField("0"); 33 JLabel yearsLabel = new JLabel("Years: ", JLabel.RIGHT); 34 JTextField years = new JTextField(); 35 36 public LottoMadness() { 37 super("Lotto Madness"); 38 39 setSize(550, 400); 40 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 41 GridLayout layout = new GridLayout(5, 1, 10, 10); 42 setLayout(layout); 43 44 FlowLayout layout1 = new FlowLayout(FlowLayout.CENTER, 10, 10); 45 option.add(quickpick); 46 option.add(personal); 47 row1.setLayout(layout1); 48 row1.add(quickpick); 49 row1.add(personal); 50 add(row1); 51 52 GridLayout layout2 = new GridLayout(2, 7, 10, 10); 53 row2.setLayout(layout2); 54 row2.add(numbersLabel); 55 for (int i = 0; i < 6; i++) { 56 numbers[i] = new JTextField(); 57 row2.add(numbers[i]); 58 } 59 row2.add(winnersLabel); 60 for (int i = 0; i < 6; i++) { 61 winners[i] = new JTextField(); 62 winners[i].setEditable(false); 63 row2.add(winners[i]); 64 } 65 add(row2); 66 67 FlowLayout layout3 = new FlowLayout(FlowLayout.CENTER, 10, 10); 68 row3.setLayout(layout3); 69 stop.setEnabled(false); 70 row3.add(stop); 71 row3.add(play); 72 row3.add(reset); 73 add(row3); 74 75 GridLayout layout4 = new GridLayout(2, 3, 20, 10); 76 row4.setLayout(layout4); 77 row4.add(got3Label); 78 got3.setEditable(false); 79 row4.add(got3); 80 row4.add(got4Label); 81 got4.setEditable(false); 82 row4.add(got4); 83 row4.add(got5Label); 84 got5.setEditable(false); 85 row4.add(got5); 86 row4.add(got6Label); 87 got6.setEditable(false); 88 row4.add(got6); 89 row4.add(drawingsLabel); 90 drawings.setEditable(false); 91 row4.add(drawings); 92 row4.add(yearsLabel); 93 years.setEditable(false); 94 row4.add(years); 95 add(row4); 96 97 setVisible(true); 98 } 99 100 private static void setLookAndFeel() { 101 try { 102 UIManager.setLookAndFeel( 103 "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 104 } catch (Exception exc) { 105 // ignore error 106 } 107 } 108 109 public static void main(String[] arguments) { 110 LottoMadness.setLookAndFeel(); 111 LottoMadness frame = new LottoMadness(); 112 } 113 }