Java——用户界面的布局

用户界面的布局

       开始为Java程序设计图形用户界面时,面临的一个障碍是组件会移动。容器大小发生变化时,容器中的组件将会根据容器的新尺寸重新排列。这种变化对程序员有利,因为它考虑到了界面组件在不同操作系统中的显示方式。对于同一个Java程序,可单击的按钮在Windows、linux和Mac操作系统中的外观可能不同。

       使用一组被称为布局管理器的类来排列界面中的组件,这些类定义了组件如何在容器中显示。界面中的每个容器都有自己的布局管理器。

1、使用布局管理器

       1)、FlowLayout管理器

       它是面板的默认布局管理器类,使用时,想在页面中排列英文单词那样排列组件:从左到右,当前行没有空间后进入下一行。

       当框架中添加进组件时,可以使用如下代码示例来调用浮动的布局:

       FlowLayout layout = new FlowLayout();

       setLayout(layout);

       也可以指定用于特定容器(如JPanle对象)的布局管理器,为此可以使用该容器对象的setLayout()方法。

FlowLayout类仅根据容器的尺寸来排列组件。调整应用程序窗口的大小时,组件将立刻重新排列。将窗口的宽度增大到原来的两倍,将发现所有的JButton组件都显示在同一行。

       2)、GridLayout容器

       它将容器中所有的组件组织为指定的行数和列数。分配给每个组件的显示区域都相同,因此如果指定3*3的网格,容器将被划分为9个大小相等的区域。

       当组件加入到容器中时,GridLayout将所有的组件放置到网格中的某个位置,而且组件是从左向右一次添加,当这一行满了之后,再从下一行的最左边开始添加。下面的语句创建了一个2行3列的网格布局:

        GridLayoutgridLayout = new GridLayout(2, 3);

        setLayout(gridLayout);

        JButton button1 = new JButton("1号按钮");

        JButton button2 = new JButton("2号按钮");

        JButton button3 = new JButton("3号按钮");

        JButton button4 = new JButton("4号按钮");

        JButton button5 = new JButton("5号按钮");

        add(button1);

        add(button2);

        add(button3);

        add(button4);

        add(button5);

       使用此布局时,如果组件容纳不下标签文本,将使用省略号(...)表示省略的文本。

       3)、BorderLayout管理器

       它将容器中的组件放置在特定的位置,该位置有5个方位:东、南、西、北、中。其中4个位置由方向罗盘方向指定,另外一个由中心区域指定。

       与GridLayout类相同,BorderLayout也会将所有可用空间都分配给组件。在周围放置4个边界组件后,余下的空间都分配给中央的组件,因此它通常是最大的。下面的语句创建一个使用边界布局的容器:

       //参数10,20用于指定组件之间的水平,垂直距离

        BorderLayout borderLayout = newBorderLayout(10, 20);

        setLayout(borderLayout);

        JButton button1 = new JButton("1号按钮");

        JButton button2 = new JButton("2号按钮");

        JButton button3 = new JButton("3号按钮");

        JButton button4 = new JButton("4号按钮");

        JButton button5 = new JButton("5号按钮");

        add(button1 , BorderLayout.NORTH);

        add(button2 , BorderLayout.SOUTH);

        add(button3 , BorderLayout.WEST);

        add(button4 , BorderLayout.EAST);

        add(button5 , BorderLayout.CENTER);

       4)、BoxLayout管理器

       它可以讲组件排列成一行或一列。使用该布局时,先创建一个放置组件的面板,然后再创建一个布局管理器,它带有两个参数:

              以框式布局(box layout)组织的组件;

              BoxLayout.Y_AXIS指定垂直排列,BoxLayout.Y_AXIS指定水平排列。

       下面的语句创建一个使用BoxLayout的容器:

              JPanel panel = new JPanel();

               BoxLayout boxLayout = newBoxLayout(panel, BoxLayout.Y_AXIS);

               panel.setLayout(boxLayout);

               JButton button1 = new JButton("1号按钮");

               JButton button2 = new JButton("2号按钮");

               JButton button3 = new JButton("3号按钮");

               JButton button4 = new JButton("4号按钮");

               JButton button5 = new JButton("5号按钮");

               panel.add(button1);

               panel.add(button2);

               panel.add(button3);

               panel.add(button4);

               panel.add(button5);

               add(panel);

       5)、使用Insets将组件隔开

       在容器中排列组件时,可以使用Insets令组件远离容器边缘,Insets是代表容器边界区域的对象,它有一个接受4个参数的构造函数:在容器上下左右留出的空间。每个参数都以像素为单位,像素是定义框架大小时使用的度量单位。下面的语句创建一个Insets对象:

              Insets insets =new Insets(10 , 6 , 10 , 3);

       意思是insets对象代表的容器边界:上左下右边缘内10,6,10,3像素。

       要想在容器中使用Insets对象,必须覆盖容器的getInsets()方法。该方法不接受任何参数,并返回一个Insets对象,如下所示:

              Public InsetsgetInsets(){
                     return new Insets(50 , 15 ,10 , 15); }

       Jframe容器有内置的Insets,用于为标题栏留出空间。当覆盖getInsets()方法并设置自定义值时,过小的insets将导致容器将组件显示在标题栏下面。

 

2、应用程序的界面布局

       到目前为止,布局管理器应用于整个框架:调用框架的setLayout方法,所有组件遵循相同的规则。这适用于有些程序,但使用Swing开发图形用户界面时,将经常发现这些布局管理器都不合适。

       解决这种问题的方式之一是,将一组JPanel对象作为容器,用于放置图形用户界面的不同部分。对于其中每部分,可以使用JPanel对象的setLayout()方法设置不同的布局规则。这些面板包含需要包含的组件后,就可以将这些面板直接加入到框架中。

       接下来我们将开发一个完整的界面,该程序是一个猜数游戏,确定用户一生中赢得百万大奖的机会。它不断随机生成6个数,知道用户选择的数字与要出的数字相同。界面如下:

 

 源码为:

package guessyourchance;

import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class GuessYourChance extends JFrame{

    JPanel row1 = new JPanel();
    ButtonGroup btgOption = new ButtonGroup();
    JCheckBox quickPick = new JCheckBox("快速选择", false);
    JCheckBox personal = new JCheckBox("个人的" , true);
    
    JPanel row2 = new JPanel();
    JLabel numbersLabel = new JLabel("你的输入" , JLabel.RIGHT);
    JTextField[] numbers = new JTextField[6];
    JLabel winnersLabel = new JLabel("中奖数" , JLabel.RIGHT);
    JTextField[] winners = new JTextField[6];
    
    JPanel row3 = new JPanel();
    JButton stop = new JButton("停止");
    JButton play = new JButton("开始");
    JButton reset = new JButton("重置");
    
    JPanel row4 = new JPanel();
    JLabel got3Label = new JLabel("6中3" , JLabel.RIGHT);
    JTextField got3 = new JTextField("0");
    JLabel got4Label = new JLabel("6中4" , JLabel.RIGHT);
    JTextField got4 = new JTextField("0");
    JLabel got5Label = new JLabel("6中5" , JLabel.RIGHT);
    JTextField got5 = new JTextField("0");
    JLabel got6Label = new JLabel("6中36" , JLabel.RIGHT);
    JTextField got6 = new JTextField("0");
    JLabel drawingsLabel = new JLabel("Drawing" , JLabel.RIGHT);
    JTextField drawings = new JTextField("0");
    JLabel yearsLabel = new JLabel("Years" , JLabel.RIGHT);
    JTextField years = new JTextField("0");

    public GuessYourChance() throws HeadlessException {
        super("看看你滴运气咋样");
        setSize(500 , 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        GridLayout gridLayout = new GridLayout(5, 1, 10, 10);
        setLayout(gridLayout);
        
        FlowLayout flowLayout1 = new FlowLayout(FlowLayout.CENTER , 10 , 10);
        btgOption.add(quickPick);
        btgOption.add(personal);
        row1.setLayout(flowLayout1);
        row1.add(quickPick);
        row1.add(personal);
        add(row1);
        
        GridLayout gridLayout1 = new GridLayout(2, 7, 10, 10);
        row2.setLayout(gridLayout1);
        row2.add(numbersLabel);
        for (int i = 0; i < 6; i++) {
            numbers[i] = new JTextField();
            row2.add(numbers[i]);
        }
        row2.add(winnersLabel);
        for (int i = 0; i < 6; i++) {
            winners[i] = new JTextField();
            winners[i].setEditable(true);
            row2.add(winners[i]);
        }
        add(row2);
        
        FlowLayout flowLayout2 = new FlowLayout(FlowLayout.CENTER);
        row3.setLayout(flowLayout2);
        stop.setEnabled(false);
        row3.add(stop);
        row3.add(play);
        row3.add(reset);
        add(row3);
        
        GridLayout gridLayout2 = new GridLayout(2, 3, 20, 10);
        row4.setLayout(gridLayout2);
        row4.add(got3Label);
        row4.add(got3);
        row4.add(got4Label);
        row4.add(got4);
        row4.add(got5Label);       
        row4.add(got5);
        row4.add(got6Label);
        row4.add(got6);
        row4.add(drawingsLabel);
        row4.add(drawings);
        drawings.setEditable(false);
        row4.add(yearsLabel);
        row4.add(years);
        years.setEditable(false);
        add(row4);
        setVisible(true);
    }
    
    
    public static void main(String[] args) {
        GuessYourChance guessYourChance = new GuessYourChance();
    }
}

 

 

  • 14
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值