java图形用户界面组件与布局管理——四则运算练习软件界面搭建(FlowLayout、GridBagLayout、Font)

布局管理器

java.awt FlowLayout(流式布局)组件按照加入的先后顺序按照设置的对齐方式从左向右排列,从上到下排列。|
BorderLayout(边界布局)容器划分为东、西、南、北、中五个区域,每个区域只能放置一个组件。
GridLayout(网格布局)容器的空间划分成M×N列的网格区域, 每个区域只能放置一个组件。
CardLayout(卡片布局)一叠牌,每次只能显示一张,适用于在一个空间中放置多个组件的情况。
GridBagLayoutGridLayout的升级版,每个组件可以占据多个网格。
java.swingBoxLayout(箱式布局)允许在容器中纵向或者横向放置多个控件
SprigLayout(弹簧布局)根据一组约束条件放置控件

各容器默认的布局管理器

各容器默认的布局管理器

FlowLayout

构造方法说明
FlowLayout()默认居中对齐,水平和垂直间隙5像素
FlowLayout(int align)align:指定对齐方式
FlowLayout(int align, int hgap, int vgap)指定对齐方式和水平以及垂直间隙



指定对齐方式的参数(align):
0或FlowLayout.lEFT ,控件左对齐
1或FlowLayout.CENTER ,居中对齐
2或FlowLayout.RIGHT ,右对齐
3或FlowLayout.LEADING,控件与容器方向开始边对应
4或FlowLayout.TRAILING,控件与容器方向结束边对应
如果是0、1、2、3、4之外的整数,则为左对齐

设置对齐方式和间隙的方法:setAlignment(int)setHgap(int)setVgap(int)

GridBagLayout

GridBagLayout设置网格布局要比GridLayout功能要多,最主要体现在可以设置控件相对位置,而不是绝对定位控件。
在GridBagLayout中要明白的概念:网格坐标 (0,0) 位于容器的左上角,其中 X 向右递增,Y 向下递增。

构造函数:

GirdBagLayout()//建立一个新的GridBagLayout管理器。
GridBagConstraints()//建立一个新的GridBagConstraints对象。
GridBagConstraints(int gridx,int gridy,int gridwidth,int gridheight,double weightx,double weighty, int anchor,int fill, Insets insets,int ipadx,int ipady)//建立一个新的GridBagConstraints对象,并指定其参数的值。

参数说明:
gridx,gridy: gridx定位行,gridy定位列。
gridx设置为GridBagConstraints.RELATIVE代表此组件位于之前所加入组件的右边。
gridy设置为GridBagConstraints.RELATIVE代表此组件位于以前所加入组件的下面。
建议定义出gridx,gridy的位置以便以后维护程序。gridx=0,gridy=0时放在0行0列。

gridwidth,gridheight: 设置组件所占的网格数(分别表示横向纵向),默认值皆为1。
可以使用GridBagConstraints.REMAINDER常量,代表此组件为此行或此列的最后一个组件,而且会占据所有剩余的空间。

weightx,weighty:设置窗口变大时,各组件所获得的空间跟着变大的比例。
当数字越大,表示组件能得到更多的空间,默认值皆为0。注意不是组件变大,是网格变大。

anchor : 当组件空间大于组件本身时,组件在网格中所处位置。
GridBagConstraints.CENTER(默认值)/NORTH/NORTHEAST/EAST/SOUTHEAST/WEST/NORTHWEST

fill: 当组件所在位置有剩余空间时,设置其填充方式。
GridBagConstraints.(NONE,VERTICAL,HORIZONTAL,BOTH)

insets: 设置组件之间彼此的间距。
它有四个参数,分别是上,左,下,右,默认为(0,0,0,0)。//如inset = new Insets(1,1,1,1);

ipadx,ipady :设置组件内的水平和垂直间距,默认均为0。

更改Label、TextField等的字体显示效果

设计字体显示效果 Font mf = new Font(String 字体,int 风格,int 字号);
字体:TimesRoman, Courier, Arial等
风格:三个常量 lFont.PLAIN(普通), Font.BOLD(粗体), Font.ITALIC(斜体)
字号:字的大小(磅数)
设置组件当前使用的字体:setFont(Font fn)
获取组件当前使用的字体:getFont()
设置字体颜色:JLabel.setForeground(Color.XXX);

setSize和setPreferredSize

1.setPreferredSize需要在使用布局管理器的时候使用,布局管理器会获取空间的preferredsize,因而可以生效。例如borderlayout在north中放入一个panel,panel的高度可以通过这样实现:panel.setPreferredSize(new Dimension(0, 100));这样就设置了一个高度为100的panel,宽度随窗口变化。
2.setSize,setLocation,setBounds方法需要在不使用布局管理器的时候使用,也就是setLayout(null)的时候可以使用这三个方法控制布局。
另:panel增加组件的顺序非常重要,一定要按照从左到右,从上到下的顺序添加。

四则运算联系软件界面搭建代码示例

package visibleArithmeticExercise;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MyExGUI {

    private JFrame mainWindow = new JFrame("四则运算练习软件");
    private JPanel selectPanel = new JPanel();
    private JPanel mainPanel = new JPanel();
    private JPanel commandP = new JPanel();
    private JButton JBRedo = new JButton("重做");
    private JButton JBStart = new JButton("开始做题");
    private JLabel JLUsersName = new JLabel("请输入你的用户名:");
    private JLabel JLChooseOp = new JLabel("请选择运算类型:");
    private JLabel JLNumberDigit = new JLabel("请选择运算位数:");
    private JTextField JTFUserName = new JTextField(8);//10的单位不是px 而是指定列数
    private String[] operationType = {"+","-","*","/"};
    private String[] numberOfDigitType = {"1","2","3","4"};
    private JComboBox<String> JCBOperationSelect = new JComboBox<String>(operationType);//JComboBox 泛型 需要加上<E>
    private JComboBox<String> JCBNumberOfDigit = new JComboBox<String>(numberOfDigitType);
    private JLabel[] JLBQuestions= new JLabel[10];
    private JTextField[] JTFUsersAnswer = new JTextField[10];//定义变量时需要赋初值,不然会出现空指针异常问题 详见下文
    private JTextField[] JTFRemainder = new JTextField[10];
    private Font buttonFont = new Font("微软雅黑",Font.PLAIN,16);
    private Font JLBFont = new Font("微软雅黑",Font.BOLD,18);
    private Font JTFFont = new Font("微软雅黑",Font.PLAIN,18);


    public MyExGUI(){

        //布局用户名&选择面板
        selectPanel.setPreferredSize(new Dimension(700,50));
        //selectPanel.setLayout(new GridLayout(1,6,25,20));
        JLUsersName.setFont(JLBFont);
        selectPanel.add(JLUsersName);
        JTFUserName.setFont(JLBFont);
        selectPanel.add(JTFUserName);
        JLChooseOp.setFont(JLBFont);
        selectPanel.add(JLChooseOp);
        JCBOperationSelect.setPreferredSize(new Dimension(50,25));  //当selectPanel.setLayout那句存在时,这里的设置无效(为什么?set…到底是控制什么的?网格大小还是和Font一样?)
        selectPanel.add(JCBOperationSelect);
        JLNumberDigit.setFont(JLBFont);
        selectPanel.add(JLNumberDigit);
        JCBNumberOfDigit.setPreferredSize(new Dimension(50,25));
        selectPanel.add(JCBNumberOfDigit);

        //布局主面板
        mainPanel.setPreferredSize(new Dimension(700,400));
        //mainPanel.setLayout(new GridLayout(10,3,5,10));
        GridBagLayout gridbag = new GridBagLayout();
        GridBagConstraints GBC = new GridBagConstraints();
        GBC.weightx = 1;//加上这两行之后文本框的大小会和不加时不同 因为它描述的是随面板变化的情况 而现在面板的设定值是800*500 因此不同(不以设定大小为默认值)
        GBC.weighty = 1;
        //GBC.fill = GridBagConstraints.BOTH;//weightx描述的是网格的大小随面板大小变化,组件的大小并不会随之变化 要使组件随之变化需要控制它对所在位置的填充方式
        //GBC.insets = new Insets(1,1,2,2);
        mainPanel.setLayout(gridbag);
        for(int i = 0;i < 5;i++)
        {
            JLBQuestions[i] = new JLabel("3333+3333=");
            JLBQuestions[i].setFont(JLBFont);
            JTFUsersAnswer[i] = new JTextField(5);            //一定要加这行 不然会出现空指针错误
            JTFUsersAnswer[i].setFont(JTFFont);
            JTFRemainder[i] = new JTextField(3);
            JTFRemainder[i].setFont(JTFFont);

            /*gridbag.setConstraints(JLBQuestions[i],new GridBagConstraints(i,0,5,10,1,1,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(2,2,2,2),0,0));
            gridbag.setConstraints(JTFUsersAnswer[i],new GridBagConstraints(i,1,5,10,1,1,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(2,2,2,2),0,0));
            gridbag.setConstraints(JTFRemainder[i],new GridBagConstraints(i,2,5,10,1,1,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(2,2,2,2),0,0));*/

            GBC.gridx = 0;
            GBC.gridy = i+1;
            GBC.anchor = GridBagConstraints.EAST;
            gridbag.setConstraints(JLBQuestions[i], GBC);
            mainPanel.add(JLBQuestions[i]);
            GBC.anchor = GridBagConstraints.WEST;
            GBC.gridx = 1;
            gridbag.setConstraints(JTFUsersAnswer[i],GBC);
            mainPanel.add(JTFUsersAnswer[i]);

            GBC.gridx = 2;
            gridbag.setConstraints(JTFRemainder[i],GBC);
            mainPanel.add(JTFRemainder[i]);
        }

        for(int i = 5;i < 10;i++)
        {
            JLBQuestions[i] = new JLabel("题目占位符");
            JLBQuestions[i].setFont(JLBFont);
            JTFUsersAnswer[i] = new JTextField(5);              //一定要加这行 不然会出现空指针错误
            JTFUsersAnswer[i].setFont(JTFFont);
            JTFRemainder[i] = new JTextField(3);
            JTFRemainder[i].setFont(JTFFont);

            GBC.gridx = 4;
            GBC.gridy = i-4;
            GBC.anchor = GridBagConstraints.EAST;
            gridbag.setConstraints(JLBQuestions[i], GBC);
            mainPanel.add(JLBQuestions[i]);

            GBC.anchor = GridBagConstraints.WEST;
            GBC.gridx = 5;
            gridbag.setConstraints(JTFUsersAnswer[i],GBC);
            mainPanel.add(JTFUsersAnswer[i]);

            GBC.gridx = 6;
            gridbag.setConstraints(JTFRemainder[i],GBC);
            mainPanel.add(JTFRemainder[i]);
        }

        //布局命令面板
        commandP.setLayout(new FlowLayout(FlowLayout.CENTER,80,20)); 
        JBStart.setFont(buttonFont);
        commandP.add(JBStart);
        JBRedo.setFont(buttonFont);
        commandP.add(JBRedo);

        //尽量把主窗体的设置都放到最后
        mainWindow.add(selectPanel,BorderLayout.NORTH);
        mainWindow.add(mainPanel,BorderLayout.CENTER);
        mainWindow.add(commandP, BorderLayout.SOUTH);
        mainWindow.pack();
        mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainWindow.setSize(800, 500);//设置窗体大小
        mainWindow.setLocationRelativeTo(null);//将窗口置于屏幕中间
        mainWindow.setVisible(true);//设置为可见 要放在最后 放在前面则只能看见用户名和选择面板 主面板等需要拖动窗口大小才能看见 
    }

}
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值