• 201871010119-帖佼佼《面向对象程序设计(java)》第十四周学习总结


    博文正文开头格式:(2分)

    项目

    内容

    这个作业属于哪个课程

     https://www.cnblogs.com/nwnu-daizh/

    这个作业的要求在哪里

       https://www.cnblogs.com/nwnu-daizh/p/11435127.html

    作业学习目标

    (1)掌握GUI布局管理器用法;

    (2)掌握Java Swing文本输入组件用途及常用API;

    (3)掌握Java Swing选择输入组件用途及常用API。

    随笔博文正文内容包括:

    第一部分:总结第十二章本周理论知识(25分)

    1.布局管理器

    (1)为了设计美观合理的GUI界面,需要考虑组件在容器组件中的位置和相互关系,就需要学习布局设计的知识。

    (2)在java的GUI应用程序界面设计中,布局控制通过为容器设置布局管理器来实现的。

      按钮放置在一个JPanel对象中,组件放在容器中,布局管理器决定容器中的组件具体放置的位置和大小;

      边框布局会扩展所有·边框布局管理器是每个JFrame内容窗格的默认布局管理器;边框组件的厚度不会随窗口大小改变而改变;

      网格布局:每个单元大小都是一样的,缩放窗口,计算器按钮随之变大或变小,但所有按钮尺寸保持一致;

      构造器:panel.steLayout(new GridLayout(5,4)); ;void pack() 缩放窗口

    5种布局管理器

    (1)FlowLayout: 流布局(Applet和Panel的默认布局管理器):从左到右,从上到下逐行摆放。

    (2)BorderLayout:边框布局( Window、Frame和Dialog的默认布局管理器):分上下左右中五个方位

    (3)GridLayout: 网格布局

    (4)GridBagLayout: 网格组布局:容许组件扩展到多行、多列。

    (5)CardLayout :卡片布局:把组件象一系列卡片一样叠放,一个时刻只能看到最上面的。

    通过setLayout( )方法为容器设置新的布局。格式 :容器组件名.setLayout( 布局类对象名)。

    a.FlowLayout (流布局管理器)

    – FlowLayout( ):生成一个默认的流式布局对象

    – FlowLayout(int align): 设定每一行组件的对齐方式(FlowLayout.LEFT, FlowLayout.CENTER, FlowLayout.RIGHT)

    – FlowLayout(int align,int hgap,int vgap):可以设定组件间的水平和垂直距离(缺省时组件之间没有空隙)

    b.边框布局管理器是每个JFrame的内容窗格的默认布局管理器

      向容器中加入组件时,若使用两个参数的add()方法,第二个参数必须说明加入组件在容器中的放置位置;

      位置参数是BorderLayout 类的常量:CENTER、NORTH、SOUTH、EAST、 WEST.

    c.网格布局按行列排列所有的组件;在网格布局对象的构造器中,需要指定行数和列数:panel.setLayout(new GridLayout(6,10));

      放置组件的每个单元具有相同的尺寸。
      添加组件,从第一行和第一列开始,然后是第一行的第二列。以此类推
    d.
    GridLayout的构造函数如下:

    (1)GridLayout():生成一个单行单列的网格布局
    (2)GridLayout(int rows,int cols):生成一个设定行数和列数的网格布局
    (3)GridLayout(int rows,int columns,int hgap,int vgap):可以设置组件之间的水平和垂直间隔。

    布局管理器应用总结:

       FlowLayout是 Applet 和面板的缺省布局管理器。组件从左上角到右下角进行排列。

      BorderLayout 按北、南、东、西、中的不同区域划分将组件排列于容器中。

      GridLayout 将组件按行和列排列。所有组件大小相同。
      GridBagLayout 能将组件放置在最精确的位置。各组件的大小可以不同

    2.文本域(JTextField) : 用于获取单行文本输入。
       用于文本输入的组件继承于JTextComponent抽象类

      文本域和文本区组件用于获取文本输入;  

    (1)文本域(JTextField)只能进行单行文本输入; 

    (2)文本区(JTextArea)能进行多行文本输入;  

    (3)JPassword也只能单行文本输入,但不会显示内容;

      三个类均继承于抽象类JTextComponent类,子类获取(get)、设置(set)文本的方法由超类JTextComponent提供;

      文本区(JTextArea)组件可让用户输入多行文本。生成JTextArea组件对象时,可以指定文本区的行数和列数:textArea = new JTextArea(8, 40); 

    3.文本域

      把文本域添加到窗口:将文本域添加到面板或其他容器中, ·任意时候可以构造文本域使用setText方法,从JTextComponent中继承;

    4.标签

      标签是容纳文本的组件,它们没有任何修饰(如没有边界 ),也不响应用户输入。

      可以用标签标识组件:构造一个JLabel组件将;

      JLabel的构造器允许指定初始文本和图标,也可以选择内容的排列方式;可以用SwingConstants接口中的常量来指定排列方式;

    5、标签的常用用途之一就是标识组件.

    6.密码域:

      密码域是一种特殊类型的文本域。每个输入的字符都用回显字符实现,典型的回显字符是 *。

    7.滚动窗格

      将文本区插入到滚动窗格中 textArea=new JTextArea(8,40); JScrollPane scrollPane=new JScrollPane(textArea);  如果文本超过文本区,则滚动条将会自动的出现;

      Swing中文本区没有滚动条,若需要滚动条。将文本区放入一个滚动窗格中即可.

    8.复选框:指定文本标签:bold = new JCheckBox("Bold");选定或取消复选框:bold.setSelected(true);;方法isSelected返回每个复选框的状态;

      复选框构造器

    1.bold = new JCheckBox("Bold");复选框自动地带有表示标签。

    2. JCheckBox(String label,Icon icon);构造带有标签与图标的复选框,默认初始未被选择。

    3.JCheckBox(String label,boolean state);用指定的标签和初始化选

    9:为单选按钮组构建一个ButtonGroup的对象,将JRadioButton类对象添加到按钮中,在新按钮被按下时,取消前一个被按下的按钮;

      单选按钮的构造器:
    1.JRadioButton(String label,Icon icon);创建一个带标签和图标的单选按钮
    2.JRadioButton(String label,boolean state);用指定的标签和初始化状态构造单选按钮

    组合框:

      文本域和预定的选项组合起来;JCmboBox类提供了组合框的组件;setEditable方法可让组合框成为可编辑状态;getselectedItem方法获取当前的选项或被编辑的文本;方法addItem增加选项;
    10.菜单

      菜单是GUI编程中经常用到的一种组件。位于窗口顶部的菜单栏(menu bar)中包括下拉菜单的名字。点击一个名字就可以打开包含菜单项(menuitems)和子菜单(submenus)的菜单.

    11.单选按钮菜单项与普通单选按钮的工作方式一样,必须将它们加入的按钮组中。当按钮组中的一个按钮被选中时,其它按钮就自动变为选择项。

    12.弹出菜单:创建一个弹出菜单与创建一个常规菜单的方法类似 ,但是弹出菜单没有标题。

    13、对话框是一种大小不能变化、不能有菜单的容器窗口;
      对话框不能作为一个应用程序的主框架,而必须包含在其它容器。

    第二部分:实验部分

    实验1:测试程序1(5分)

    在elipse IDE中运行教材479页程序12-1,结合运行结果理解程序;

    掌握布局管理器的用法;

    理解GUI界面中事件处理技术的用途。

    在布局管理应用代码处添加注释;

    实验代码如下:

    package calculator;
    import java.awt.*;
    import javax.swing.*;
    
    /**
     * @version 1.35 2018-04-10
     * @author Cay Horstmann
     */
    public class Calculator
    {
       public static void main(String[] args)
       {
          EventQueue.invokeLater(() -> {     	//lambda表达式
             CalculatorFrame frame = new CalculatorFrame();    //创建一个CalculatorFrame类对象
             frame.setTitle("Calculator");      //调用setTitle方法设置框架标题
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   //调用setDefaultCloseOperation方法设置取消按钮
             frame.setVisible(true);//调用setVisible方法设置组件可见。
          });
       }
    }
    

      

    package calculator;
    import javax.swing.*;
    
    /**
     * A frame with a calculator panel.
     */
    public class CalculatorFrame extends JFrame    //CalculatorFrame类继承JFrame类
    {
       public CalculatorFrame()    //CalculatorFrame构造器
       {
          add(new CalculatorPanel());   //add方法添加新建的CalculatorPanel类对象
          pack();//调整窗口的大小,考虑到其组件的首先大小
       }
    }
    

      

    package calculator;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    /**
     * A panel with calculator buttons and a result display.
     */
    public class CalculatorPanel extends JPanel    //CalculatorPanel类继承JPanel类
    {
       private JButton display;     //私有成员域的定义
       private JPanel panel;
       private double result;
       private String lastCommand;
       private boolean start;
    
       public CalculatorPanel()    //CalculatorPanel构造器
       {
          setLayout(new BorderLayout());    //setLayout方法为容器设置布局管理器,将布局管理器类对象设置为边框布局管理器
    
          result = 0;	//初始化私有成员域的变量
          lastCommand = "=";
          start = true;
    
          // add the display
    
          display = new JButton("0");  //创建一个 JButton类对象
          display.setEnabled(false);  //调用setEnabled方法,值为false,说明按钮不可选择,
          add(display, BorderLayout.NORTH);
          //调用add方法,向display容器中加入组件,BorderLayout.NORTH说明了组件添加在容器中的位置,NORTH
          InsertAction insert = new InsertAction();     //创建一个InsertAction类对象insert
          CommandAction command = new CommandAction();  //创建一个CommandAction类对象command
    
          // add the buttons in a 4 x 4 grid
    
          panel = new JPanel();     
          panel.setLayout(new GridLayout(4, 4));    //调用setLayout方法设置面板的布局管理器为4行4 列的网格布局管理器
    
          addButton("7", insert);   //调用addButton方法将带有7的标签插入
          addButton("8", insert);
          addButton("9", insert);
          addButton("/", command);
    
          addButton("4", insert);
          addButton("5", insert);
          addButton("6", insert);
          addButton("*", command);
    
          addButton("1", insert);
          addButton("2", insert);
          addButton("3", insert);
          addButton("-", command);
    
          addButton("0", insert);
          addButton(".", insert);
          addButton("=", command);
          addButton("+", command);
    
          add(panel, BorderLayout.CENTER);
          //调用add方法,向panel容器中加入组件,BorderLayout.center说明了组件添加在容器中的位置居中center,其他位置被挤掉
       }
    
       /**
        * Adds a button to the center panel.
        * @param label the button label
        * @param listener the button listener
        */
       private void addButton(String label, ActionListener listener)    
       //addButton方法,入口参数为label以及ActionListener动作监听器对象listener
       {
          JButton button = new JButton(label);   //创建一个JButton类对象,参数为标签值的标签
          button.addActionListener(listener);   //调用addActionListener方法
          panel.add(button);   //向面板当中添加这个按钮
       }
    
       /**
        * This action inserts the button action string to the end of the display text.
        */
       private class InsertAction implements ActionListener    //InsertAction类是实现ActionListener接口的类
       //不执行运算功能
       {
          public void actionPerformed(ActionEvent event)    //actionPerformed方法,ActionEvent event事件对象的入口参数
          {
             String input = event.getActionCommand();   //调用getActionCommand方法
             if (start)
             {
                display.setText("");//调用setText方法设置文本组件中的文本
                start = false;	//不计算
             }
             display.setText(display.getText() + input);//调用getText方法获取文本组件的文本
          }
       }
    
       /**
        * This action executes the command that the button action string denotes.
        */
       private class CommandAction implements ActionListener     //CommandAction类是实现ActionListener接口的类
       //执行运算功能
       {
          public void actionPerformed(ActionEvent event)
          {
             String command = event.getActionCommand();
    
             if (start)  //开始
             {
                if (command.equals("-"))    //开始命令为“-”时,
                {
                   display.setText(command);    //setText方法设置文本组件中的文本为command命令值,即“-”号
                   start = false; //不运行
                }
                else lastCommand = command;
             }
             else
             {
                calculate(Double.parseDouble(display.getText()));//调用parseDouble方法将获取的文本组件的文本为数字,把字符串转换成数字
                lastCommand = command;
                start = true;
             }
          }
       }
    
       /**
        * Carries out the pending calculation.
        * @param x the value to be accumulated with the prior result.
        */
       public void calculate(double x)     //calculate方法
       {
          if (lastCommand.equals("+")) result += x;	   //加法运算
          else if (lastCommand.equals("-")) result -= x;  //减法运算
          else if (lastCommand.equals("*")) result *= x;   //乘法运算
          else if (lastCommand.equals("/")) result /= x; 	//除法运算
          else if (lastCommand.equals("=")) result = x; 	//等于
          display.setText("" + result);    
       }
    }
    

      运行结果如下:

                            

    上述运行结果计算了 7 + 99 = 106 这个式子;

    实验1:测试程序2(5分)

    在elipse IDE中调试运行教材486页程序12-2,结合运行结果理解程序;

    掌握文本组件的用法;

    记录示例代码阅读理解中存在的问题与疑惑。

    实验代码如下:

    package text;
    import java.awt.*;
    import javax.swing.*;
    
    /**
     * @version 1.42 2018-04-10
     * @author Cay Horstmann
     */
    public class TextComponentTest
    {
       public static void main(String[] args)
       {
          EventQueue.invokeLater(() -> {    //lambda表达式
             TextComponentFrame frame = new TextComponentFrame();  //创建一个TextComponentFrame类对象
             frame.setTitle("TextComponentTest");  //框架标题
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗口关闭操作
             frame.setVisible(true);//组件可见
          });
       }
    }
    

      

    package text;
    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JPasswordField;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    import javax.swing.SwingConstants;
    
    /**
     * A frame with sample text components.
     */
    public class TextComponentFrame extends JFrame
    {
       public static final int TEXTAREA_ROWS = 8;   //常量的定义,8行20列
       public static final int TEXTAREA_COLUMNS = 20;
    
       public TextComponentFrame()    //TextComponentFrame构造器
       {
          JTextField textField = new JTextField();     //创建JTextField文本域类对象对象
          JPasswordField passwordField = new JPasswordField();  //创建JPasswordField密码域类对象
    
          JPanel northPanel = new JPanel();     //创建一个JPanel类对象
          northPanel.setLayout(new GridLayout(2, 2));   //调用setLayout方法设置面板的布局为2行2列的网格布局管理器
          northPanel.add(new JLabel("User name: ", SwingConstants.RIGHT));
          //新建一个JLabel标签User name,在最右边,调用add方法添加到northPanel上
          northPanel.add(textField); //调用add方法添加文本域
          northPanel.add(new JLabel("Password: ", SwingConstants.RIGHT));
        //新建一个JLabel标签Password,在最右边,调用add方法添加到northPanel上
          northPanel.add(passwordField); //添加密码域文本
    
          add(northPanel, BorderLayout.NORTH);//添加northPanel面板到边框布局管理器的north位置
    
          JTextArea textArea = new JTextArea(TEXTAREA_ROWS, TEXTAREA_COLUMNS);
          //创建一个新的TEXTAREA_ROWS行, TEXTAREA_COLUMNS列文本域
          JScrollPane scrollPane = new JScrollPane(textArea);
          //创建一个滚动条类对象
          add(scrollPane, BorderLayout.CENTER);
          //添加到布局管理器居中的位置
          // add button to append text into the text area
    
          JPanel southPanel = new JPanel();
          
          JButton insertButton = new JButton("Insert");
          //创建一个JButton类对象,Insert按钮
          southPanel.add(insertButton);   //在southPanel上添加insertButton,即将Insert按钮添加到southPanel上
          insertButton.addActionListener(event ->
             textArea.append("User name: " + textField.getText() + " Password: "
                + new String(passwordField.getPassword()) + "
    "));
          //调用addActionListener方法添加动作监听器类对象,append方法将给定的文本追加到文本区中已有文本的尾部
          add(southPanel, BorderLayout.SOUTH);//添加southPanel面板到边框布局管理器的SOUTH位置
          pack();//调整窗口的大小,考虑组建的首选大小
       }
    }
    

      运行结果如下:

    实验1:测试程序3(5分)

    在elipse IDE中调试运行教材489页程序12-3,结合运行结果理解程序;

    掌握复选框组件的用法;

    记录示例代码阅读理解中存在的问题与疑惑。

    实验代码如下:

    package checkBox;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    /**
     * A frame with a sample text label and check boxes for selecting font
     * attributes.
     */
    public class CheckBoxFrame extends JFrame
    {
       private JLabel label;    //私有属性的定义,一个面板,两个复选框,
       private JCheckBox bold;
       private JCheckBox italic;
       private static final int FONTSIZE = 24;  //常量的
    
       public CheckBoxFrame()     //CheckBoxFrame构造器
       {
          // add the sample text label
    
          label = new JLabel("The quick brown fox jumps over the lazy dog.");
          //新建一个JLabel对象,The quick brown fox jumps over the lazy dog.标签
          label.setFont(new Font("Serif", Font.BOLD, FONTSIZE));
          //调用setFont方法
          add(label, BorderLayout.CENTER);//将label添加到边框布局管理器的中间位置
    
          // this listener sets the font attribute of
          // the label to the check box state
    
          ActionListener listener = event -> {
             int mode = 0;
             if (bold.isSelected()) mode += Font.BOLD;
             //如果bold是可选择的,字体会加粗
             if (italic.isSelected()) mode += Font.ITALIC;
             //如果italic是可选择的,字体会边倾斜
             label.setFont(new Font("Serif", mode, FONTSIZE));//设置字体,衬线以及字体的大小
          };
    
          // add the check boxes
          //添加到复选框
          JPanel buttonPanel = new JPanel();
    
          bold = new JCheckBox("Bold"); //创建一个JCheckBox对象,
          bold.addActionListener(listener);//添加事件监听器对象
          bold.setSelected(true);//调用setSelected方法表示可选择
          buttonPanel.add(bold); //将bold添加到buttonPanel上
    
          italic = new JCheckBox("Italic");
          italic.addActionListener(listener);
          buttonPanel.add(italic);
    
          add(buttonPanel, BorderLayout.SOUTH);   //将buttonPanel添加到边框布局管理器的SOUTH位置
          pack();//调整窗口的大小,考虑组件的首选大小
       }
    }
    

      

    package checkBox;
    
    import java.awt.*;
    import javax.swing.*;
    
    /**
     * @version 1.35 2018-04-10
     * @author Cay Horstmann
     */
    public class CheckBoxTest
    {
       public static void main(String[] args)
       {
          EventQueue.invokeLater(() -> {    //lambda表达式
             CheckBoxFrame frame = new CheckBoxFrame();  //创建一个CheckBoxFrame类对象
             frame.setTitle("CheckBoxTest");   //设置框架的标题为CheckBoxTest
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//调用setDefaultCloseOperation方法设置窗口是否可见
             frame.setVisible(true);//调用setVisible方法设置组件是否可见
          });
       }
    }
    

      运行结果如下:

        

    实验总结:

    在选中不同的复选框Bold和italic时,The quick brown fox jumps over the lazy dog.这句话的字体会发生相应的变化,如果选中Bold这个框时,它的字体是不倾斜的,但是去掉后,选了italic之后,它的字体会变得倾斜,同时选中之后,会加粗并且倾斜。

    实验1:测试程序4(5分)

    在elipse IDE中调试运行教材491页程序12-4,运行结果理解程序;

    掌握单选按钮组件的用法;

    记录示例代码阅读理解中存在的问题与疑惑。

    实验代码如下:

    package radioButton;
    
    import java.awt.*;
    import javax.swing.*;
    
    /**
     * @version 1.35 2018-04-10
     * @author Cay Horstmann
     */
    public class RadioButtonTest
    {
       public static void main(String[] args)
       {
          EventQueue.invokeLater(() -> {   //lambda表达式
             RadioButtonFrame frame = new RadioButtonFrame();  //创建一个RadioButtonFrame(单选按钮框架)对象
             frame.setTitle("RadioButtonTest");    //调用setTitle方法设置框架的标题为RadioButtonTest
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  //调用setDefaultCloseOperation方法设置窗口是否可见
             frame.setVisible(true);    //调用setVisible方法设置组件是否可见
          });
       }
    }
    

      

    package radioButton;
    
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    /**
     * A frame with a sample text label and radio buttons for selecting font sizes.
     */
    public class RadioButtonFrame extends JFrame
    {
       private JPanel buttonPanel;    //私有属性的定义
       private ButtonGroup group;
       private JLabel label;   
       private static final int DEFAULT_SIZE = 36;   //常量的定义
    
       public RadioButtonFrame()  //RadioButtonFrame构造器
       {      
          // add the sample text label
    
          label = new JLabel("The quick brown fox jumps over the lazy dog.");
          //创建一个带有“The quick brown fox jumps over the lazy dog.”字符串的JLabel对象
          label.setFont(new Font("Serif", Font.PLAIN, DEFAULT_SIZE));//调用setFont方法设置字体的状态,字形大小,默认
          add(label, BorderLayout.CENTER);
          //将面板添加到边框布局管理器的居中位置
          // add the radio buttons
    
          buttonPanel = new JPanel();
          group = new ButtonGroup();
          
          addRadioButton("Small", 8);     //调用addRadioButton方法将带有"Small"字符串标签添加到单选按钮组当中,字体设置为8号
          addRadioButton("Medium", 12);   //调用addRadioButton方法将带有"Medium"字符串标签添加到单选按钮组当中,字体设置为12号
          addRadioButton("Large", 18);    //调用addRadioButton方法将带有"Large"字符串标签添加到单选按钮组当中,字体设置为18号
          addRadioButton("Extra large", 36); //调用addRadioButton方法将带有"Extra large"字符串标签添加到单选按钮组当中,字体设置为36号
    
          add(buttonPanel, BorderLayout.SOUTH);//将buttonPanel添加到边框布局管理器的SOUTH位置
          pack();   //调整窗口的大小,考虑组件的首选大小
       }
    
       /**
        * Adds a radio button that sets the font size of the sample text.
        * @param name the string to appear on the button
        * @param size the font size that this button sets
        */
       public void addRadioButton(String name, int size)  //addRadioButton方法
       {
          boolean selected = size == DEFAULT_SIZE;    //将是否可选择,以及字形大小设置为默认状态
          JRadioButton button = new JRadioButton(name, selected);
          group.add(button);    //添加按钮
          buttonPanel.add(button);    //将按钮添加到面板
    
          // this listener sets the label font size
    
          ActionListener listener = event -> label.setFont(new Font("Serif", Font.PLAIN, size));
          //动作监听器对象,调用setFont方法设置字体的字形大小
          button.addActionListener(listener);
       }  //将动作监听器对象添加到按钮
    }
    

      运行结果如下:

    实验1:测试程序5(5分)

    在elipse IDE中调试运行教材494页程序12-5,结合运行结果理解程序;

    掌握边框的用法;

    记录示例代码阅读理解中存在的问题与疑惑。

    实验代码如下:

    package border;
    
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.border.*;
    
    /**
     * A frame with radio buttons to pick a border style.
     */
    public class BorderFrame extends JFrame {
    	private JPanel demoPanel; // 私有属性的定义
    	private JPanel buttonPanel;
    	private ButtonGroup group;
    
    	public BorderFrame() // BorderFrame构造器
    	{
    		demoPanel = new JPanel(); // 创建两个JPanel对象
    		buttonPanel = new JPanel();
    		group = new ButtonGroup();
    
    		addRadioButton("Lowered bevel", BorderFactory.createLoweredBevelBorder());
    		//添加单选按钮到
    		addRadioButton("Raised bevel", BorderFactory.createRaisedBevelBorder());
    		addRadioButton("Etched", BorderFactory.createEtchedBorder());
    		addRadioButton("Line", BorderFactory.createLineBorder(Color.BLUE));
    		addRadioButton("Matte", BorderFactory.createMatteBorder(10, 10, 10, 10, Color.BLUE));
    		addRadioButton("Empty", BorderFactory.createEmptyBorder());
    		
    		//将带有标题的蚀刻边框添加到一个面板上
    		Border etched = BorderFactory.createEtchedBorder();  
    		Border titled = BorderFactory.createTitledBorder(etched, "Border types");
    		buttonPanel.setBorder(titled);   //调用setBorder方法设置标题字符串的边框
    
    		setLayout(new GridLayout(2, 1));     //设置布局管理器为2行1列的网格布局
    		add(buttonPanel);   //添加按面板buttonPanel
    		add(demoPanel);   //添加面板demoPanel
    		pack();  //调整窗口的大小,考虑组件首选大小
    	}
    
    	public void addRadioButton(String buttonName, Border b) // addRadioButton方法来添加单选按钮
    	{
    		JRadioButton button = new JRadioButton(buttonName); // 创建一个JRadioButton对象
    		button.addActionListener(event -> demoPanel.setBorder(b));
    		// addActionListener动作监听器,调用setBorder方法来设置这个组件的边框
    		group.add(button);  //将按钮添加到按钮组当中
    		buttonPanel.add(button);   //在添加到面板当中
    	}
    }
    

      

    package border;
    
    import java.awt.*;
    import javax.swing.*;
    
    /**
     * @version 1.35 2018-04-10
     * @author Cay Horstmann
     */
    public class BorderTest
    {
       public static void main(String[] args)
       {
          EventQueue.invokeLater(() -> {  //lambda表达式
             BorderFrame frame = new BorderFrame();   //创建一个BorderFrame对象
             frame.setTitle("BorderTest");   //调用setTitle方法设置框架的标题为BorderTest
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  //调用setDefaultCloseOperation方法设置窗口是否可见
             frame.setVisible(true);  //调用setVisible方法设置组件是否可见
          });
       }
    }
    

      运行结果如下:

                

        

        

    实验1:测试程序6(5分)

    在elipse IDE中调试运行教材498页程序12-6,结合运行结果理解程序;

    掌握组合框组件的用法;

    记录示例代码阅读理解中存在的问题与疑惑。

    实验代码如下:

    package comboBox;
    
    import java.awt.*;
    import javax.swing.*;
    
    /**
     * @version 1.36 2018-04-10
     * @author Cay Horstmann
     */
    public class ComboBoxTest
    {
       public static void main(String[] args)
       {
          EventQueue.invokeLater(() -> {    //lambda表达式
             ComboBoxFrame frame = new ComboBoxFrame();
             frame.setTitle("ComboBoxTest");   //调用setTitle方法设置框架的标题为ComboBoxTest
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  //调用setDefaultCloseOperation方法设置窗口是否可见
             frame.setVisible(true);   //调用setVisible方法设置组件是否可见
          }); 
       }
    }
    

      

    package comboBox;
    
    import java.awt.BorderLayout;
    import java.awt.Font;
    
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    /**
     * A frame with a sample text label and a combo box for selecting font faces.
     */
    public class ComboBoxFrame extends JFrame
    {
       private JComboBox<String> faceCombo;     //JComboBox<String>是泛型类,包含String类型的对象
       private JLabel label;
       private static final int DEFAULT_SIZE = 24;  //常量的定义
    
       public ComboBoxFrame()   //ComboBoxFrame构造器
       { 
          // add the sample text label
    
          label = new JLabel("The quick brown fox jumps over the lazy dog.");
          //创建一个JLabel对象,标签内容为The quick brown fox jumps over the lazy dog.
          label.setFont(new Font("Serif", Font.PLAIN, DEFAULT_SIZE));
          //调用setFont方法设置标题的字体,字形大小为默认
          add(label, BorderLayout.CENTER);
          //将label添加到边框布局管理器的居中位置
          // make a combo box and add face names
          
          faceCombo = new JComboBox<>();    //新建一个JComboBox<>类对象
          faceCombo.addItem("Serif");       //把一个选项添加到选项列表中
          faceCombo.addItem("SansSerif");
          faceCombo.addItem("Monospaced");
          faceCombo.addItem("Dialog");
          faceCombo.addItem("DialogInput");
    
          // the combo box listener changes the label font to the selected face name
          //组合框的监听器改变面板字体
          faceCombo.addActionListener(event ->
             label.setFont(
                new Font(faceCombo.getItemAt(faceCombo.getSelectedIndex()),
                   Font.PLAIN, DEFAULT_SIZE)));   //调用getSelectedIndexd方法获得当前的选项,不是可编辑的
    
          // add combo box to a panel at the frame's southern border
    
          JPanel comboPanel = new JPanel();
          comboPanel.add(faceCombo);	//添加组合框到面板
          add(comboPanel, BorderLayout.SOUTH);   //将面板添加到边框布局管理器的SOUTH位置
          pack();  //调整窗口的大小,考虑组件的首选大小
       }
    }
    

      运行结果如下:

            

                

    实验2:结对编程练习包含以下4部分:(30分)

    (1)  用户信息输入界面如下图所示:

    (2)用户点击提交按钮时,用户输入信息显示在录入信息显示区,格式如下:

    (3)  用户点击重置按钮后,清空用户已输入信息;

    (4)  点击窗口关闭,程序退出。

          

    1)   程序设计思路简述;

    2)   符合编程规范的程序代码;

    3)   程序运行功能界面截图;

    4)   结对过程描述,提供两人在讨论、细化和编程时的结对照片(非摆拍)。

    实验代码如下:

    package zmo;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.border.*;
    public class demo extends JFrame {
        public demo() {
            JPanel panel1 = new JPanel();
            panel1.setPreferredSize(new Dimension(700, 45));
            panel1.setLayout(new GridLayout(1, 4));
            JLabel label1 = new JLabel("姓名:");
            JTextField j1 = new JTextField("");
            JLabel label2 = new JLabel("选择的条件:");
            JComboBox<Object> j2 = new JComboBox<>();
            j2.addItem("有好爱");
            j2.addItem("无爱好");
            panel1.add(label1);
            panel1.add(j1);
            panel1.add(label2);
            panel1.add(j2);
    
            JPanel panel2 = new JPanel();
            panel2.setPreferredSize(new Dimension(700, 50));
            panel2.setLayout(new GridLayout(1, 4));
            JLabel label3 = new JLabel("地址:");
            JTextArea j3 = new JTextArea();
            JLabel label4 = new JLabel("爱好:");
            JPanel p = new JPanel();
            p.setLayout(new GridLayout(3, 1));
            p.setBorder(BorderFactory.createLineBorder(null));
            JCheckBox c1 = new JCheckBox("阅读");
            JCheckBox c2 = new JCheckBox("唱歌");
            JCheckBox c3 = new JCheckBox("跳舞");
            p.add(c1);
            p.add(c2);
            p.add(c3);
            panel2.add(label3);
            panel2.add(j3);
            panel2.add(label4);
            panel2.add(p);
    
            JPanel panel3 = new JPanel();
            panel3.setPreferredSize(new Dimension(700, 150));
            FlowLayout flowLayout1 = new FlowLayout(FlowLayout.LEFT, 20, 40);
            panel3.setLayout(flowLayout1);
            JLabel label5 = new JLabel("性别:");
            JPanel p1 = new JPanel();
            p1.setLayout(new GridLayout(2,1));
            p1.setBorder(BorderFactory.createLineBorder(null));
            ButtonGroup bu = new ButtonGroup();
            JRadioButton jr1 = new JRadioButton("男");
            JRadioButton jr2 = new JRadioButton("女");
            bu.add(jr1);
            bu.add(jr2);
            p1.add(jr1);
            p1.add(jr2);
            panel3.add(label5);
            panel3.add(p1);
            add(panel1);
            add(panel2);
            add(panel3);
    
            JPanel panel4 = new JPanel();
            panel4.setPreferredSize(new Dimension(700, 150));
            JButton b1 = new JButton("确定");
            panel4.add(b1);
            JButton b2 = new JButton("重置");
            panel4.add(b2);
            add(panel4);
    
            FlowLayout flowLayout = new FlowLayout();
            this.setLayout(flowLayout);
            this.setTitle("Students Detail");
            this.setBounds(200, 200, 800, 400);
            this.setVisible(true);
            this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    
            b1.addActionListener(new ActionListener() {
    
            
                public void actionPerformed(ActionEvent e) {
                    // TODO 自动生成的方法存根
                    String xueli = j2.getSelectedItem().toString();
                    System.out.println("姓名:" + j1.getText());
                    System.out.println("选择的条件是:" + xueli);
                    String hobbystring = "爱好:";
                    if (c1.isSelected()) {
                        hobbystring += "阅读";
                    }
                    if (c2.isSelected()) {
                        hobbystring += "唱歌";
                    }
                    if (c3.isSelected()) {
                        hobbystring += "跳舞";
                    }
                    System.out.println("地址:" + j3.getText());
                    if (jr1.isSelected()) {
                        System.out.println("性别:男");
                    }
                    if (jr2.isSelected()) {
                        System.out.println("性别:女");
                    }
                    System.out.println(hobbystring);
                }
            });
            b2.addActionListener(new ActionListener() {
    
                public void actionPerformed(ActionEvent e) {
                    // TODO 自动生成的方法存根
                    j1.setText(null);
                    j3.setText(null);
                    j2.setSelectedIndex(0);
                    c1.setSelected(false);
                    c2.setSelected(false);
                    c3.setSelected(false);
                    bu.clearSelection();
                }
            });
        }
    
        public static void main(String args[]) {
            new demo();
        }
    
    }
    

      

    package zmo;
    import java.awt.EventQueue;
    
    import javax.swing.JFrame;
    
    public class Mian {
        public static void main(String[] args) {
            EventQueue.invokeLater(() -> {
                demo page = new demo();
            });
    

      

    package zmo;
    import java.awt.Dimension;
    import java.awt.Toolkit;
    import java.awt.Window;
    
    public class WinCenter {
        public static void center(Window win){
            Toolkit tkit = Toolkit.getDefaultToolkit();
            Dimension sSize = tkit.getScreenSize();
            Dimension wSize = win.getSize();
            if(wSize.height > sSize.height){
                wSize.height = sSize.height;
            }
            if(wSize.width > sSize.width) {
                wSize.width = sSize.width;
            }
            win.setLocation((sSize.width - wSize.width)/ 2, (sSize.height - wSize.height)/ 2);
        }
    }
    

      运行结果如下:

     

    import java.awt.Dimension;
    import java.awt.Toolkit;
    import java.awt.Window;
    
    public class WinCenter {
        public static void center(Window win){
            Toolkit tkit = Toolkit.getDefaultToolkit();
            Dimension sSize = tkit.getScreenSize();
            Dimension wSize = win.getSize();
            if(wSize.height > sSize.height){
                wSize.height = sSize.height;
            }
            if(wSize.width > sSize.width){
                wSize.width = sSize.width;
            }
            win.setLocation((sSize.width - wSize.width)/ 2, (sSize.height - wSize.height)/ 2);
        }
    }
    

      

    import java.awt.EventQueue;
    
    import javax.swing.JFrame;
    
    public class Mian
    {
       public static void main(String[] args)
       {
          EventQueue.invokeLater(() -> {
              DemoJFrame page = new DemoJFrame();
            
              page.setTitle("UserGUITest");// 设置标题
              page.setSize(800, 400);// 设置窗口大小
              page.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭操作
              page.setVisible(true);//设置可见性
          });
       }
    }
    

      

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.GridLayout;
    import java.awt.LayoutManager;
    import java.awt.Panel;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.Timer;
    import java.util.TimerTask;
    
    import javax.swing.BorderFactory;
    import javax.swing.ButtonGroup;
    import javax.swing.ButtonModel;
    import javax.swing.JButton;
    import javax.swing.JCheckBox;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    
    public class DemoJFrame extends JFrame {
        private JPanel jPanel1;
        private JPanel jPanel2;
        private JPanel jPanel3;
        private JPanel jPanel4;
        private JTextField fieldname;
        private JComboBox comboBox;
        private JTextField fieldadress;
        private ButtonGroup bg;
        private JRadioButton man;
        private JRadioButton woman;
        private JCheckBox sing;
        private JCheckBox dance;
        private JCheckBox reading;
    
        public DemoJFrame() {
            //设置窗口居中
            WinCenter.center(this);
            jPanel1 = new JPanel();
            setJPanel1(jPanel1);
            jPanel2 = new JPanel();
            setJPanel2(jPanel2);
            jPanel3 = new JPanel();
            setJPanel3(jPanel3);
            jPanel4 = new JPanel();
            setJPanel4(jPanel4);
            // 设置容器的为流布局
            FlowLayout flowLayout = new FlowLayout();
            this.setLayout(flowLayout);
            // 将四个面板添加到容器中
            this.add(jPanel1);
            this.add(jPanel2);
            this.add(jPanel3);
            this.add(jPanel4);
    
        }
    
     //设置面板1
        private void setJPanel1(JPanel jPanel) {
            
            // 给面板的布局设置为网格布局 一行4列
            jPanel.setLayout(new GridLayout(1,4));
            JLabel name = new JLabel("姓名:");
            jPanel.setPreferredSize(new Dimension(260, 45));
            name.setSize(260, 45);
            fieldname = new JTextField("");
            fieldname.setSize(80, 20);      
            jPanel.add(name);
            jPanel.add(fieldname);
    
        }
    
      //地址爱好添加
        private void setJPanel2(JPanel jPanel) {
            jPanel.setPreferredSize(new Dimension(300, 45));
            // 给面板的布局设置为网格布局 一行4列
            jPanel.setLayout(new GridLayout(1, 4));
            JLabel name = new JLabel("地址:");
            fieldadress = new JTextField();
            fieldadress.setPreferredSize(new Dimension(300, 45));
            //FlowLayout flowLayout = new FlowLayout(FlowLayout.RIGHT);
            JLabel study = new JLabel("爱好:");
            JPanel selectBox = new JPanel();
            selectBox.setBorder(BorderFactory.createTitledBorder(""));
            selectBox.setLayout(new GridLayout(3, 1));
            sing = new JCheckBox("唱歌");
            dance = new JCheckBox("跳舞");
            reading = new JCheckBox("阅读");
            selectBox.add(sing);
            selectBox.add(dance);
            selectBox.add(reading);
            jPanel.add(name);
            jPanel.add(fieldadress);
            jPanel.add(study);
            jPanel.add(selectBox);
        }
    //性别按钮的添加
        private void setJPanel3(JPanel jPanel) {
            jPanel.setPreferredSize(new Dimension(700, 150));
            FlowLayout flowLayout = new FlowLayout(FlowLayout.LEFT);
            jPanel.setLayout(flowLayout);
            JLabel sex = new JLabel("性别:");
            JPanel selectBox = new JPanel();
            selectBox.setBorder(BorderFactory.createTitledBorder(""));
            selectBox.setLayout(new GridLayout(2, 1));
            bg = new ButtonGroup();
            man = new JRadioButton("男");
            woman = new JRadioButton("女");
            bg.add(man);
            bg.add(woman);
            selectBox.add(man);
            selectBox.add(woman);
            jPanel.add(sex);
            jPanel.add(selectBox);
    
        }
    //
        private void setJPanel4(JPanel jPanel) {
            // TODO 自动生成的方法存根
        	JTextArea textArea = new JTextArea(3, 20);
    	    JScrollPane scrollPane = new JScrollPane(textArea);
    	    add(scrollPane, BorderLayout.SOUTH);
            jPanel.setPreferredSize(new Dimension(700, 150));
            FlowLayout flowLayout = new FlowLayout(FlowLayout.CENTER, 50, 10);
            jPanel.setLayout(flowLayout);
            jPanel.setLayout(flowLayout);
            JButton sublite = new JButton("提交");
            JButton reset = new JButton("重置");
            sublite.addActionListener((e) -> 
            textArea.append("姓名 " + fieldname.getText()  + "
    "+ "地址" + fieldadress.getText() + 
               	 "
    "));
            reset.addActionListener((e) -> Reset());
            jPanel.add(sublite);
            jPanel.add(reset);
        }
    
    //重置方法
            private void Reset() {
            // TODO 自动生成的方法存根
            fieldadress.setText(null);
            fieldname.setText(null);
            comboBox.setSelectedIndex(0);
            sing.setSelected(false);
            dance.setSelected(false);
            reading.setSelected(false);
            bg.clearSelection();
        }
    }
    

      运行结果如下:

               

     结对照片:

     

    实验总结:(10分)

       这周主要学习了事件处理以及Swing用户界面组件,理论知识理解的还可以,在前面的几个验证性的实验中,对代码的理解觉得对这章知识掌握的还可以,但是在结对编程的环节当中,确实存在很大的问题,试了很多次,就是改不到老师要求的那种排版,外观丑陋,而且单选按钮以及复选框的信息我无法显示出来,还有就是那个录入信息输出框不在准确的位置。我会在改的。

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    006——数组(六)array_fill()array_filter()array_flip()array_key_exists()array_keys()
    005——数组(五)array_diff_ukey()array_diff_uassoc()array_intersect()array_intersect_assoc()array_intersect_key()array_intersect_ukey()array_intersect_uassoc()
    004——数组(四)array_search() array_change_key_case() array_chunk() array_combine() array_diff() array_diff_key() array_diff_assoc
    laravel中资源路由的控制器创建方法:
    003——数组(三)count()reset()end()prev()next()current()
    002——数组(二)each() list() implode() explode() in_array()
    001——数组(一)数组知识及foreach函数应用
    JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
    tomcat 启动参数 Xms, Xmx, XX:MaxNewSize, XX:PermSize, -XX:MaxPermSize, Djava.awt.headless
    CentOS 7 中firewall-cmd命令
  • 原文地址:https://www.cnblogs.com/-8tjj/p/11959016.html
Copyright © 2020-2023  润新知