java笔记 常用容器和常用布局器

    科技2026-02-19  6

    一.常用容器

    面板JPanel(默认布局方式为FlowLayout)是一个容器,之前学的窗口JFrame也是容器 然而JPanel更像一个中间容器 在一个窗口中,不同的容器有不同的布局 方便管理

    注:add(new JScrollPane(textArea));可以使这个文本框带滚动条

    二.布局器

    布局器是在awt包里面的

    1.FlowLayout()

    import java.awt.*; import javax.swing.*; //定义带有按钮的Frame class myFlowLayoutFrame extends JFrame { private int buttons; public myFlowLayoutFrame(int buttonNumber) { buttons = buttonNumber; // 设置按钮数量 setTitle("FlowLayout布局的窗体"); setSize(320,240); Panel buttonPanel = new Panel(); setDefaultCloseOperation(EXIT_ON_CLOSE); //增加相应的按钮 for(int i=0;i<buttons;i++) { Button addButton=new Button("按钮"+(i+1)); buttonPanel.add(addButton); } //Panel的默认布局管理器是FlowLayout,此处修改参数 //FlowLayout(对齐方式,横向间隙,纵向间隙) buttonPanel.setLayout(new FlowLayout(1,10,80)); // 0左对齐,1居中,2右对齐 //Frame的默认布局管理器为BorderLayout this.add(buttonPanel); } } public class test { public static void main(String[] args) { //显示的按钮数目 int buttonNumber=18; myFlowLayoutFrame frm = new myFlowLayoutFrame(buttonNumber); frm.setVisible(true); } }

    2.BorderLayout

    //BorderLayout之例 import javax.swing.*; import java.awt.*; class myBorderLayoutFrame extends JFrame { public myBorderLayoutFrame() { super("BorderLayout布局的窗口"); Panel myPanel = new Panel(); myPanel.setLayout(new BorderLayout()); JButton north=new JButton("北面"); JButton south=new JButton("南面"); JButton east=new JButton("东面"); JButton west=new JButton("西面"); JButton center=new JButton("中心"); myPanel.add(north, BorderLayout.NORTH); //显示上按钮 myPanel.add(south, BorderLayout.SOUTH); myPanel.add(east, BorderLayout.EAST); //显示东按钮 myPanel.add(west, BorderLayout.WEST); myPanel.add(center, BorderLayout.CENTER);//显示中心按钮 this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.add(myPanel); this.setSize(320,240); this.setVisible(true); } } public class test { public static void main(String args[]) { myBorderLayoutFrame frm = new myBorderLayoutFrame(); } }

    3.CardLayout

    //CardLayout之例 import java.awt.*; import java.awt.event.*; import javax.swing.*; class myCardLayoutFrame extends JFrame implements ActionListener { CardLayout mycard; JButton buttonFirst,buttonLast,buttonNext; Panel pCenter; myCardLayoutFrame() //构造函数 { setTitle("CardLayout布局的窗体"); mycard = new CardLayout(); pCenter = new Panel(); // 中间的容器 pCenter.setLayout(mycard);//设置CardLayout布局 buttonFirst = new JButton("第一个"); buttonLast = new JButton("末一个"); buttonNext = new JButton("下一个"); for(int i=1;i<=20;i++) { pCenter.add(new JButton("我是第 "+i+" 个按钮")); // 这些按钮必须被存在一个面板容器中 } //给按钮添加事件监听器 buttonFirst.addActionListener(this); buttonLast.addActionListener(this); buttonNext.addActionListener(this); //添加带有按钮的panel Panel pSouth = new Panel(); // 下面的容器 pSouth.add(buttonFirst); pSouth.add(buttonNext); pSouth.add(buttonLast); add(pCenter, BorderLayout.CENTER); add(pSouth, BorderLayout.SOUTH); setBounds(0,0,320,240); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); } //按钮事件处理 public void actionPerformed(ActionEvent e) { if(e.getSource() == buttonFirst) { mycard.first(pCenter); // 必须要有参数,确定这个first是哪个容器的 } else if(e.getSource() == buttonNext) { mycard.next(pCenter); } else if(e.getSource() == buttonLast) { mycard.last(pCenter); } } } public class test{ public static void main(String args[]) { myCardLayoutFrame frm = new myCardLayoutFrame(); } }

    4.GridLayout

    //GridLayoutTest.java import java.awt.*; import javax.swing.*; class myGridLayoutFrame extends JFrame { JButton[] buttons = new JButton[20]; public myGridLayoutFrame() { super("GridLayout布局的窗体"); setSize(320,240); setLayout(new GridLayout(4,5)); // 4行5列 for(int i=0;i<buttons.length;i++) { buttons[i] = new JButton(""+ (i+1) ); // 只输入i+1不能识别为字符串标号,所以利用一个小技巧将int转为string add(buttons[i]); } } } public class test { public static void main(String args[]) { myGridLayoutFrame frm = new myGridLayoutFrame(); frm.show(); } }

    5.GirdBagLayout

    //GridBagLayout之例 import java.awt.*; import javax.swing.*; class myGridBagFrame extends JFrame { public myGridBagFrame() { super("GridBagLayout布局的窗体"); Panel panel1 = new Panel(); setSize(500,500); panel1.setLayout(new GridBagLayout()); GridBagConstraints gbdc = new GridBagConstraints(); gbdc.fill=GridBagConstraints.BOTH; //向两面扩张 gbdc.weightx=1; //设置行(weightx)的量 gbdc.weighty=1; gbdc.gridwidth=2; //添加进入的部件就会变成为2个单元格的宽度。 gbdc.gridx=0; //另起一行,从x = 0的单元格开始填充。 panel1.add(new JButton("No.1"), gbdc); gbdc.gridx=2; //从x = 2的单元格开始填充。 gbdc.gridwidth=1; gbdc.gridheight=2; panel1.add(new JButton("No.2"), gbdc); gbdc.gridx=0; // gbdc.gridheight=1; panel1.add(new JButton("No.3"), gbdc); gbdc.gridx=1; panel1.add(new JButton("No.4"), gbdc); gbdc.gridx = 3; gbdc.gridwidth = 1; gbdc.gridheight = 1; panel1.add(new JButton("No.5"), gbdc); //gbdc.gridx = 0; // 每当gbdc.gridx重新设定为0时,就代表新建了一行 //gbdc.gridwidth = 1; //gbdc.gridheight = 1; //panel1.add(new JButton("No.6"), gbdc); add(panel1); setDefaultCloseOperation(EXIT_ON_CLOSE); } } public class test { public static void main(String args[]) { myGridBagFrame frm= new myGridBagFrame(); frm.setVisible(true); } }

    weightx,weighty:用来设置窗口变大时,各组件跟着变大的比例,当数字越大,表示组件能得到更多的空间,默认值皆为0。 这个我还是不知道有什么用,设置为0的话就是按钮原大小,其他值都是一样的效果。

    这种布局器是控制每个组件的,先设设置布局器的位置大小,再设置按钮 而且这种布局是铺满整个面板的,每个组件的大小 <= 面板的大小 如果按钮5的宽设为3,显示的大小还是2,如果是1,就会空缺一部分 而且这种布局不能隔行新建,也就是不能中间空一行什么组件都不添加


    如果新建一个6,再把5的宽设定为3,就能显示了

    Processed: 0.009, SQL: 9