• 201871010105-曹玉中《面向对象程序设计(java)》第十四周学习总结


    201871010105-曹玉中《面向对象程序设计(java)》第十四周学习总结

    项目 内容
    这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/
    这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/11888568.html
    作业学习目标

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

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

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

    第一部分:理论知识。

     模型-视图-控制器模式

    1. 每个组件都有三个要素:
    • 内容,如:按钮的状态(是否按下),或者文本框的文本。
    • 外观(颜色,大小等)。
    • 行为(对事件的反应)。
    1. 面向对象设计中的一个基本原则:限制一个对象拥有的功能数量
    2. 模型-视图-控制器(MVC)模式告诉我们如何实现这种设计,实现三个独立的类:
    • 模型(model):存储内容。
    • 视图(view):显示内容。
    • 控制器(controller):处理用户输入。
      模式必须实现改变内容和查找内容的方法。主机:模型是完全不可见的。显示存储在模型中的数据是视图的工作。
    1. 模型-视图-控制器模式的一个优点是一个模型可以有多个视图,其中每个视图可以显示全部内容或不同形式。
    2. 控制器负责处理用户输入事件。然后决定是否把这些事件转化成对模型或视图的改变。

    Swing按钮的模型-视图-控制器分析

    1. 对于大多数组件来说,模型类将实现一个名字以Model结尾的接口。实现了此接口的类可以定义各个按钮的状态。
    2. ButtonModel接口的属性
      属性名
      actionCommand 与按钮关联的动作命令字符串
      mnemonic 按钮的快捷键
      armed 如果按钮被按下且鼠标仍在按钮上则为true
      enabled 如果按钮是可选择的则为true
      pressed 如果按钮被按下且鼠标按键没有释放则为true
      rollover 如果鼠标在按钮之上则为true
      selected 如果按钮已经被选择(用于复选框和单选按钮)则为true
    3. 模型不存储按钮标签或者图标。
    4. 同样的模型(即DefaultButtonModel)可用于下压按钮、单选按钮、复选框、甚至是菜单项。当然,这些按钮都有各自不同的视图和控制器。
    5. 通常,每个Swing组件都有一个相关的后缀为UI的视图对象,但并不是所有的Swing组件都有专门的控制器对象。
    6. JButton究竟是什么?事实上,它仅仅是一个继承了JComponent的包装器类,JComponent包含了一个DefaultButtonModel对象,一些视图数据(例如按钮标签和图标)和一个负责按钮视图的BasicButtonUI对象。

     布局管理概述

    1. 组件放置在容器中,布局管理器决定容器中的组件具体放置的位置和大小。
    2. 文本域和其他的用户界面元素都继承于Component类,组件可以放置在面板这样的容器中。由于Container类继承于Conponent类,所以容器也可以放置在另一个容器中。
    3. 继承层次有两点显得有点混乱。首先,像JFrame这样的顶层窗口是Container的子类,所以也是Component的子类,但却不能放在其他容器内。另外,JComponent是Container的子类,但不直接继承Component,因此,可以将其他组件添置到JButton中。(但无论如何,这些组件无法显示出来)。
    4. 每个容器都有一个默认的布局管理器,但可以重新进行设置。
    5. java.awt.Container 1.0
      • Void SetLayout(LayoutManager m)
        为容器设置布局管理器。
      • Component add(Component c)
      • Component add(Component c,Object constraints) 1.1
        将组件添加到容器中,并返回组件的引用。
        参数:c 要添加的组件。constraints 布局管理器理解的标识符。
    6. java.awt.FlowLayout 1.0
      • FlowLayout()
      • FlowLayout(int align)
      • FlowLayout(int align,int hgap,int vgap)
        构造一个新的FlowLayout对象。
        参数:align LEFT、CENTER或者RIGHT。hgap 以像素为单位的水平间距(如果是负值,则强行重叠)。vgap 以像素为单位的垂直间距(如果为负值,则强行重叠)。

     边框布局

    1. 边框布局管理器(border layout manager)是每个JFrame的内容窗格的默认布局管理器。流布局管理器完全控制每个组件的放置位置,边框布局管理器则不然,它允许为每个组件选择一个放置位置。可以选择把组件放在内部窗格的中部、北部、南部、东部或者西部。
    2. 当容器被缩放时,边缘组件的尺寸没有改变,而中部组件的大小会发生变化。在添加组件时可以指定BorderLayout类中的CENTER、NORTH、SOUTH、EAST和WEST常量。并非需要占有所有的位置,如果没有提供任何值,系统默认为CENTER。
    3. 与流布局不用,边框布局会扩展所有组件的尺寸以便填充满可用空间(刘布局将维持每个组件的最佳尺寸)。
    4. java.awt.BorderLayout 1.0
      • BorderLayout()
      • BorderLayout(int hgap,int vgap)
        构造一个新的BorderLayout对象。
        参数:hgap 以像素为单位的水平间距(如果为负值,则强行重叠),vgap 以像素为单位的垂直间距(如果为负值,则情形重叠)。

     网格布局

    1. 网格布局像电子数据表一样,按行列排列所有的组件。不过,它的每个单元大小都是一样的。
    2. java.awt.GridLayout 1.0
      • GridLayout(int rows,int columns)
      • GridLayout(int rows,int columns,int hgap,int vgap)
        构造一个新的GridLayout对象。row或者columns可以为零,但不能同时为零,指定的每行或每列的组件数量可以任意的。
        参数:rows 网格的行数,columns 网格的列数,hgap 以像素为单位的水平间距(如果为负值,则强行重叠),vgap 以像素为单位的垂直间距(如果为负值,则强行重叠)。

     文本输入

    1. 文本域(JTextField)和文本区(JTextArea)组件用于获取文本输入。文本域只能接收单行文本的输入,而文本区能够接收多行文本的输入。JPassword也只能接收单行文本的输入,但不会将输入的内容显示出来。
      这三个类都继承于JTextComponent类。由于JTextComponent是一个抽象类,所以不能够构造这个类的对象。
    2. javax.swing.text.JTextComponent 1.2
      • String getText()
      • void setText(String text)
        获取或设置文本组件中的文本。
      • boolean isEditable()
      • void setEditable(boolean b)
        获取或设置editable特性,这个特性决定了用户是否可以编辑文本组件中的内容。

    文本域

    1. 把文本域添加到窗口的常用方法是将它添加到面板或者其他容器中,这与添加按钮完全一样。
    2. 列数只是给AWT设定首选(preferred)大小的一个提示。如果布局管理器需要缩放这个文本域,它会调整文本域的大小。
    3. 使用setColumns方法改变了一个文本域的大小之后,需要调用包含这个文本框的容器的revalidate方法。revalidate方法会重新计算容器内所有组件的大小,并且对它们重新进行布局。调用revalidate方法之后,布局管理器会重新设置容器的大小,然后就可以看到改变尺寸后的文本域了。
      revalidate方法是JComponent类中的方法。它并不是马上就改变组件大小,而是给这个组件加一个需要改变大小的标记。这样就避免了多个组件改变大小时带来的重复计算。但是,如果想重新计算一个JFrame中的所有组件,就必须调用validate方法—JFrame没有扩展JComponent。
    4. javax.swing.JTextField 1.2
      • JTextField(int cols)
        构造一个给定列数的空JTextField对象。
      • JTextField(String text,int cols)
        构造一个给定列数、给定初始字符串的JTextField对象。
      • int getColumns()
      • void setColumns(int cols)
        获取或设置文本域使用的列数。
    5. javax.swing.JComponent 1.2
      • void revalidate()
        重新计算组件的位置和大小。
      • void setFont(Font f)
        设置组件的字体。
    6. java.awt.Component 1.0
      • void validate()
        重新计算组件的位置和大小。如果组件是容器,容器中包含的所有组件的位置和大小也被重新计算。
      • Font getFont()
        获取组件的字体。

     标签和标签组件

    1. 标签是容纳文本的组件,他们没有任何的修饰(例如没有边缘),也不能响应用户输入。可以利用标签标识组件。
    2. 要想用标识符标识不带标签的组件,应该
      1)用相应的文本构造一个JLabel组件。
      2)将标签组件放置在距离需要标识的组件足够近的地方,以便用户可以知道标签所标识的组件。
    3. JLabel的构造器允许指定初始文本和图标,也可以选择内容的排列方式。可以用Swing Constants接口中常量来指定排列方式。
    4. 包含HTML标签的第一个组件需要延迟一段时间才能显示出来,这是因为需要加载相当复杂的HTML显示代码。
    5. 标签也可以放置在容器中。
    6. java.swing.JLabel 1.2
      • JLabel(String text)
      • JLabel(Icon icon)
      • JLabel(String text,int align)
      • JLabel(String text,Icon icon,int align)
        构造一个标签。
        参数:text 标签中的文本,icon 标签中的图标,align 一个SwingConstants的常量LEFT(默认)、CENTER或 RIGHT。
      • String getText()
      • void setText(String text)
        获取或设置标签的文本。
      • Icon getIcon()
      • void setIcon(Icon icon)
        获取或设置标签的图标。

    密码域

    1. 密码域是一种特殊类型的文本域。为了避免有不良企图的人看到密码,用户输入的字符不显示出来。每个输入的字符都有回显字符(echo character)表示,典型的回显字符是星号(*)。Swing提供了JPasswordField类来实现这样的文本域。
    2. javax.swing.JPasswordField 1.2
      • JPasswordField(String text,int columns)
        构造一个新的密码域对象。
      • void setEchoChar(char echo)
        为密码域设置回显字符。注意:独特的观感可以选择自己的回显字符。0表示重新设置为默认的回显字符。
      • char[] getPassword()
        返回密码域中的文本。为了安全起见,在使用之后应该覆写返回的数组内容(密码并不是以String的形式返回,这是因为字符串在被垃圾回收器回收之前会一直驻留在虚拟机中)。

    文本区

    1. 用户并不受限于输入执行的行数和列数。当输入过长时,文本会滚动。
    2. 如果文本区的文本超出线束的范围,那么剩下的文本就会被裁减掉。可以通过开启换行特性来避免裁剪过长的行。

    滚动窗格

    1. 在Swing中,文本区没有滚动条。如果需要滚动条,可以将文本区插入到滚动窗格(scroll pane)中。
    2. JTextArea组件只显示无格式的文本,没有特殊字体或者格式设置。如果想要显示格式化文本(如HTML),就需要使用JEditorOane类。
    3. javax.swing.JTextArea 1.2
      • JTextArea()
      • JTextArea(int rows,int cols)
      • JTextArea(String text,int rows,int cols)
        构造一个新的文本对象。
      • void setColumns(int cols)
        设置文本区应该使用的首选列数。
      • void setRows(int rows)
        设置文本区应该使用的首选行数。
      • void append(String newText)
        将给定的文本追加到文本区中已有文本的尾部。
      • void setLineWrap(boolean wrap)
        打开或关闭换行。
      • void setWrapStyleWord(boolean word)
        如果word是true,超长的行会在自边框处换行。如果为false,超长的行被截断而不考虑字边框。
      • void setTabSize(int c)
        将制表符(tab stop)设置为c列。注意,制表符不会被转换为空格,但可以让文本对齐到下一个制表符处。
    4. javax.swing.JScrollPane 1.2
      • JScrollPane(Component c)
        创建一个滚动窗格,用来显示指定组件的内容。当组件内容超过显示范围时,滚动条会自动地出现。

    选择组件

     复选框

    1. 复选框自动地带有标识标签。用户通过点击某个复选框来选择相应的选项,再点击则取消选取。当复选框获得焦点时,用户也可以通过按空格键来切换选择。
    2. javax.swing.JCheckBox 1.2
      • JCheckBox(String label)
      • JCheckBox(String label,Icon icon)
        构造一个复选框,初始没有被选择。
      • JCheckBox(String label,boolean state)
        用给定的标签和初始化状态构造一个复选框。
      • boolean isSelected()
      • void setSelected(boolean state)
        获取或设置复选框的选择状态。

    单选按钮

    1. 当用户选择另一项的时候,前一项就自动地取消选择。这样一组选框通常称为单选按钮组(Radio Button Group)。
    2. javax.swing.JRadioButton 1.2
      • JRadioButton(String label,Icon icon)
        构造一个单选按钮,初始没有被选择。
      • JRadioButton(String label,boolean state)
        用给定的标签和初始状态构造一个单选按钮。
    3. javax.swing.ButtonGroup 1.2
      • void add(AbstractButton b)
        将按钮添加到组中。
      • ButtonModel getSelection()
        返回被选择的按钮的按钮模型。
    4. javax.swing.ButtonModel 1.2
      • String getActionCommand()
        返回按钮模型的动作命令。
    5. javax.swing.AbstractButton 1.2
      • void setActionCommand(String s)
        设置按钮以及模型的动作命令。

     边框

    1. 如果在一个窗口中有多组单选按钮,就需要用可视化的形式指明哪些按钮属于同一组。Swing提供了一组很有用的边框(borders)来解决这个问题。
      有几种不同的边框可供选择。
      1)调用BorderFactory的静态方法创建边框。可选的分格:凹斜面、凸斜面、蚀刻、直线、蒙版。
      2)如果愿意的话,可以给边框添加标题,具体的实现方法是将边框传递给:BorderFactory.createTitledBorder。
      3)如果确实想把一切凸显出来,可以将几种边框组合起来使用:BorderFactory.createCompoundBorder。
      4)调用JComponent类中setBorder方法将结果边框添加到组件中。
    2. 不同的边框有不同的用于设置边框的宽度和颜色的选项。
    3. javax.swing.BorderFactory 1.2
      • static Border createLineBorder(Color color)
      • static Border createLineBorder(Color color,int thickness)
        创建一个简单的直线边框。
      • static MatteBorder createMatteBorder(int top,int left,int bottom,int right,Color color)
      • static MatteBorder createMatteBorder(int top,int left,int bottom,int right,Icon tileIcon)
        创建一个用color颜色或一个重复(repeating)图标填充的粗的边框。
      • static Border createEmptyBorder()
      • static Border createEmptyBorder(int top,int left,int bottom,int right)
        创建一个空边框。
      • static Border createEtchedBorder()
      • static Border createEtchedBorder(Color highlight,Color shadow)
      • static Border createEtcheBorder(int type)
      • static Border createEtchedBorder(int type,Color highlight,Color shadow)
        创建一个具有3D效果的直线边框。
        参数:highlight,shadow 用于3D效果的颜色, type EtchedBorder.RAISED和EtchedBorder.LOWERED之一。
      • static Border createBevelBorder(int type)
      • static Border createBevelBorder(int type,Color highlight,Color shadow)
      • static Border createLoweredBevelBorder()
      • static Border createRaisedBevelBorder()
        创建一个具有凹面或凸面的边框。
        参数:type BevelBorder.LOWERED和BevelBorder.RAISED之一。highlight,shadow 用于3D效果的颜色。
      • static TitledBorder createTitledBorder(String title)
      • static TitledBorder createTitledBorder(Border border)
      • static TitledBorder createTitledBorder(Border border,String title)
      • static TitledBorder createTitledBorder(Border border,String title,int justification,int position)
      • static TitledBorder createTitledBorder(Border border,String title,int justification,int position)
      • static TitledBorder createTitledBorder(Border border,String title,int justification,int position,Font font)
      • static TitledBorder createTitledBorder(Border border,String title,int justification,int position,Font font ,Color color)
        创建一个具有给定特性的带标题的边框。
        参数:title 标题字符串。border 用标题装饰的边框。 justification TitledBorder常量LEFT、CENTER、RIGHT、LEADING、trAILING或DEFAULT_JUSTIFICATION(left)之一。position TitledBorder常量ABOVE_TOP、TOP、BELOW_TOP、ABOVE_BOTTOM、BOTTOM、BELOW_BOTTOM或DEFAULT_POSITION(top)之一。font 标题的字体。color 标题的颜色。
      • static CompoundBorder createCompoundBorder(Border outSideBorder,Border indideBorder)
        将两个边框组合成一个新的边框。
    4. javax.swing.border.SoftBevelBorder 1.2
      • SoftBevelBorder(int type)
      • SodtBevelBorder(int type,Color highliht,Color shadow)
        创建一个带有柔和边角的斜面边框。
        参数:type BevelBorder.LOWERED和BevelBorder.RAISED之一。highlight,shadow 用于3D效果的颜色。
    5. javax.swing.border.LineBorder 1.2
      • public LineBorder(Color color,int thickness,boolean roundedCorners)
        用指定的颜色和粗细创建一个直线边框。
    6. javax.swing.JComponent 1.2
      • void setBorder(Border border)
        设置这个组件的边框。

     组合框

    1. 如果下拉列表框被设置成可编辑(editable),就可以像编辑文本一样编辑当前的选项内容。鉴于这个原因,这种组合被称为组合框(combo box),它将文本域的灵活性与一组预定义的选项组合起来。JComboBox类提供了组合框的组件。
    2. 调用setEditable方法可以让组合框可编辑。注意,编辑只会影响当前项,而不会改变列表内容。
    3. 可以调用getSelectedItem方法获取当前的选项,如果组和框是可编辑的,当前选项则是可以编辑的。不过,对于可编辑组合框,其中的选项可以是任何类型,这取决于编辑器。
    4. 当用户从组合框中选择一个选项时,组合框就将产生一个动作事件。为了判断哪个选项被选择,可以通过事件参数调用getSource方法来得到发送事件的组合框引用,接着调用getSelectedItem方法获取当前选择的选项。需要把这个方法的返回值转化为相应的类型,通常是String型。
    5. javax.swing.JComboBox 1.2
      • boolean isEditable()
      • void setEditable(boolean b)
        获取或设置组合框的可编辑特性。
      • void addItem(Object item)
        把一个选项添加到选项列表中。
      • void insertItemAt(Object item,int index)
        将一个选项添加到选项列表的指定位置。
      • void removeItem(Object item)
        从选项列表中删除一个选项。
      • void removeItemAt(int index)
        删除指定位置的选项。
      • void removeAllItems()
        从选项列表中删除所有选项。
      • Object getSelectedItem()
        返回当前选择的选项。

     滑动条

    1. 组合框可以让用户从一组离散值中进行选择。滑动条允许进行连续值得选择。
    2. 当用户滑动滑动条时,滑动条的值就会在最小值和最大值之间变化。当值发生变化时,ChangeEvent就会发送给所有变化的监听器。为了得到这些改变的通知,需要条用addChangeListener方法并且安装一个实现了ChangeListener接口的对象。这个接口只有一个方法StateChanged。在这个方法中,可以获取滑动条的当前值。
    3. 可以通过显示标尺(tick)对滑动条进行修饰。
    4. 可以通过下列方法为达标吃添加标尺标记标签(tick mark labels):slider.setPaintLabels(true);
    5. 如果标尺的标记或者标签不显示,请检查一下是否调用了setPaintTicks(true)和setPaintLabels(true)。
    6. 要想影藏滑动条移动的轨迹,可以调用:slider.setPaintTrack(false)
    7. javax.swing.JSlider 1.2
      • JSlider()
      • JSlider(int direction)
      • JSlider(int min,int max)
      • JSlider(int min,int max,int initialValue)
      • JSlider(int direction,int min,int max,int initialValue)
        用给定的方向、最大值、最小值和初始化值构造一个水平滑动条。
        参数:direction SwingConstants.HORIZONTAL或SwingConstants.VERTICAL之一。默认为水平。 mi,max 滑动条的最大值、最小值。默认值为0到100。 initialValue 滑动套的初始化值。默认值为50。
      • void setPaintTicks(boolean b)
        如果b为true,显示标尺。
      • void setMajorTickSpacing(int units)
      • void setMinorTickSpacing(int units)
        用给定的滑动条单位的倍数设置大标尺和小标尺。
      • void setPaintLabels(boolean b)
        如果b是true,显示标尺标签。
      • void setLabelTable(Dictionary table)
        设置用于作为标尺标签的组件。表中的每一个键/值对都采用new Integer(value)/component的格式。
      • void setSnapToTicks(boolean b)
        如果b是true,每一次调整后滑块都要对齐到最接近的标尺处。
      • void setPaintTrack(boolean b)
        如果b是true,显示滑动条滑动的轨迹。

     第二部分:实验

    实验1: 导入第12章示例程序,测试程序并进行组内讨论。

    测试程序1

     在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(() -> {
             var frame = new CalculatorFrame();
             frame.setTitle("Calculator");
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame.setVisible(true);
          });
       }
    }

     

     

    package calculator;
    
    import javax.swing.*;
    
    /**
     * 一个带有计算器面板的框架。
     */
    public class CalculatorFrame extends JFrame
    {
       public CalculatorFrame()
       {
          add(new CalculatorPanel());
          pack();
       }
    }

     

     

    package calculator;
    
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    /**
     * 具有计算器按钮和结果显示的面板。
     */
    public class CalculatorPanel extends JPanel
    {
       private JButton display;
       private JPanel panel;
       private double result;
       private String lastCommand;
       private boolean start;
    
       public CalculatorPanel()
       {
          setLayout(new BorderLayout());
    
          result = 0;
          lastCommand = "=";
          start = true;
    
          // 添加显示
    
          display = new JButton("0");
          display.setEnabled(false);
          add(display, BorderLayout.NORTH);
    
          ActionListener insert = new InsertAction();
          ActionListener command = new CommandAction();
    
          // 在4×4网格中添加按钮
    
          panel = new JPanel();
          panel.setLayout(new GridLayout(4, 4));
    
          addButton("0", insert);
          addButton("1", insert);
          addButton("2", insert);
          addButton("3", command);
    
          addButton("4", insert);
          addButton("5", insert);
          addButton("6", insert);
          addButton("7", command);
    
          addButton("8", insert);
          addButton("9", insert);
          addButton("3", insert);
          addButton("/", command);
    
          addButton("*", insert);
          addButton(".", insert);
          addButton("=", command);
          addButton("+", command);
       }
    
       /**
        * 向中心面板添加一个按钮。
        * @param 标签的按钮标签
        * @param 监听器按钮侦听器
        */
       private void addButton(String label, ActionListener listener)
       {
          JButton button = new JButton(label);
          button.addActionListener(listener);
          panel.add(button);
       }
    
       /**
        * 此操作将按钮操作字符串插入到显示文本的末尾
        */
       private class InsertAction implements ActionListener
       {
          public void actionPerformed(ActionEvent event)
          {
             String input = event.getActionCommand();
             if (start)
             {
                display.setText("");
                start = false;
             }
             display.setText(display.getText() + input);
          }
       }
    
       /**
        * 此操作执行按钮操作字符串所表示的命令。
        */
       private class CommandAction implements ActionListener
       {
          public void actionPerformed(ActionEvent event)
          {
             String command = event.getActionCommand();
    
             if (start)
             {
                if (command.equals("-"))
                {
                   display.setText(command);
                   start = false;
                }
                else lastCommand = command;
             }
             else
             {
                calculate(Double.parseDouble(display.getText()));
                lastCommand = command;
                start = true;
             }
          }
       }
    
       /**
        * 执行悬而未决的计算。
        * @param x值与先前结果一起累积。
        */
       public void calculate(double x)
       {
          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);
       }
    }

     

     

    运行结果如下:

     

     

     

    测试程序2

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

    l 掌握各种文本组件的用法;

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

    代码如下:

    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(() -> {
             var frame = new 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;
    
    /**
     * 具有文本文本组件的框架.
     */
    public class TextComponentFrame extends JFrame
    {
       public static final int TEXTAREA_ROWS = 8;
       public static final int TEXTAREA_COLUMNS = 20;
    
       public TextComponentFrame()
       {
          JTextField textField = new JTextField();
          JPasswordField passwordField = new JPasswordField();
    
          JPanel northPanel = new JPanel();
          northPanel.setLayout(new GridLayout(2, 2));
          northPanel.add(new JLabel("User name: ", SwingConstants.RIGHT));
          northPanel.add(textField);
          northPanel.add(new JLabel("Password: ", SwingConstants.RIGHT));
          northPanel.add(passwordField);
    
          add(northPanel, BorderLayout.NORTH);
    
          JTextArea textArea = new JTextArea(TEXTAREA_ROWS, TEXTAREA_COLUMNS);
          JScrollPane scrollPane = new JScrollPane(textArea);
    
          add(scrollPane, BorderLayout.CENTER);
    
          // 添加按钮将文本追加到文本区域
    
          JPanel southPanel = new JPanel();
    
          JButton insertButton = new JButton("Insert");
          southPanel.add(insertButton);
          insertButton.addActionListener(event ->
             textArea.append("User name: " + textField.getText() + " Password: "
                + new String(passwordField.getPassword()) + "
    "));
    
          add(southPanel, BorderLayout.SOUTH);
          pack();
       }
    }

     

     

    运行结果如下:

     

     

     

    测试程序3

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

    l 掌握复选框组件的用法;

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

    代码如下:

    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(() -> {
             var frame = new CheckBoxFrame();
             frame.setTitle("CheckBoxTest");
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame.setVisible(true);
          });
       }
    }

     

    package checkBox;
    
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    /**
     * 带有样本文本标签的框和用于选择字体的复选框
     * attributes.
     */
    public class CheckBoxFrame extends JFrame
    {
       private JLabel label;
       private JCheckBox bold;
       private JCheckBox italic;
       private static final int FONTSIZE = 24;
    
       public CheckBoxFrame()
       {
          // 添加示例文本标签
    
          label = new JLabel("The quick brown fox jumps over the lazy dog.");
          label.setFont(new Font("Serif", Font.BOLD, FONTSIZE));
          add(label, BorderLayout.CENTER);
    
          // 此侦听器设置字体属性
          // 到复选框状态的标签
    
          ActionListener listener = event -> {
             int mode = 0;
             if (bold.isSelected()) mode += Font.BOLD;
             if (italic.isSelected()) mode += Font.ITALIC;
             label.setFont(new Font("Serif", mode, FONTSIZE));
          };
    
          // 添加复选框
    
          JPanel buttonPanel = new JPanel();
    
          bold = new JCheckBox("Bold");
          bold.addActionListener(listener);
          bold.setSelected(true);
          buttonPanel.add(bold);
    
          italic = new JCheckBox("Italic");
          italic.addActionListener(listener);
          buttonPanel.add(italic);
    
          add(buttonPanel, BorderLayout.SOUTH);
          pack();
       }
    }

     

    运行结果如下:

     

     

     

    测试程序4

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

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

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

    代码如下:

    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(() -> {
             var frame = new RadioButtonFrame();
             frame.setTitle("RadioButtonTest");
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame.setVisible(true);
          });
       }
    }

     

    package radioButton;
    
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    /**
     * 带有样本文本标签和单选按钮以选择字体大小的框架。
     */
    public class RadioButtonFrame extends JFrame
    {
       private JPanel buttonPanel;
       private ButtonGroup group;
       private JLabel label;
       private static final int DEFAULT_SIZE = 36;
    
       public RadioButtonFrame()
       {      
          // 添加示例文本标签
    
          label = new JLabel("The quick brown fox jumps over the lazy dog.");
          label.setFont(new Font("Serif", Font.PLAIN, DEFAULT_SIZE));
          add(label, BorderLayout.CENTER);
    
          // 添加单选按钮
    
          buttonPanel = new JPanel();
          group = new ButtonGroup();
    
          addRadioButton("Small", 8);
          addRadioButton("Medium", 12);
          addRadioButton("Large", 18);
          addRadioButton("Extra large", 36);
    
          add(buttonPanel, BorderLayout.SOUTH);
          pack();
       }
    
       /**
        * 添加一个设置示例文本字体大小的单选按钮。
        * @param 命名按钮上出现的字符串
        * @param 设置此按钮设置的字体大小
        */
       public void addRadioButton(String name, int size)
       {
          boolean selected = size == DEFAULT_SIZE;
          JRadioButton button = new JRadioButton(name, selected);
          group.add(button);
          buttonPanel.add(button);
    
          // 此侦听器设置标签字体大小。
          ActionListener listener = event -> label.setFont(new Font("Serif", Font.PLAIN, size));
    
          button.addActionListener(listener);
       }
    }

     

    运行结果如下:

     

     

     

     

     测试程序5

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

    l 掌握边框的用法;

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

    代码如下:

    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(() -> {
             var frame = new BorderFrame();
             frame.setTitle("BorderTest");
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame.setVisible(true);
          });
       }
    }
    package border;
    
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.border.*;
    
    /**
     * 用单选按钮选择边框样式的框架
     */
    public class BorderFrame extends JFrame
    {
       private JPanel demoPanel;
       private JPanel buttonPanel;
       private ButtonGroup group;
    
       public BorderFrame()
       {
          demoPanel = new 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);
    
          setLayout(new GridLayout(2, 1));
          add(buttonPanel);
          add(demoPanel);
          pack();
       }
    
       public void addRadioButton(String buttonName, Border b)
       {
          JRadioButton button = new JRadioButton(buttonName);
          button.addActionListener(event -> demoPanel.setBorder(b));
          group.add(button);
          buttonPanel.add(button);
       }
    }

     

    运行结果如下:

     

     

     

     

     

     

     

     

     

     

     测试程序6

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

    l 掌握组合框组件的用法;

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

    代码如下:

    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(() -> {
             var frame = new ComboBoxFrame();
             frame.setTitle("ComboBoxTest");
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame.setVisible(true);
          });
       }
    }
    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;
    
    /**
     * 具有样本文本标签和选择字体面的组合框的框架。
     */
    public class ComboBoxFrame extends JFrame
    {
       private JComboBox<String> faceCombo;
       private JLabel label;
       private static final int DEFAULT_SIZE = 24;
    
       public ComboBoxFrame()
       {
          // 添加示例文本标签
    
          label = new JLabel("The quick brown fox jumps over the lazy dog.");
          label.setFont(new Font("Serif", Font.PLAIN, DEFAULT_SIZE));
          add(label, BorderLayout.CENTER);
    
          // 制作组合框并添加面部名称
    
          faceCombo = new JComboBox<>();
          faceCombo.addItem("Serif");
          faceCombo.addItem("SansSerif");
          faceCombo.addItem("Monospaced");
          faceCombo.addItem("Dialog");
          faceCombo.addItem("DialogInput");
    
          // 组合框侦听器将标签字体更改为选定的面部名称。
    
          faceCombo.addActionListener(event ->
             label.setFont(
                new Font(faceCombo.getItemAt(faceCombo.getSelectedIndex()), 
                   Font.PLAIN, DEFAULT_SIZE)));
    
          // 将组合框添加到框架的南部边界的面板上
    
          JPanel comboPanel = new JPanel();
          comboPanel.add(faceCombo);
          add(comboPanel, BorderLayout.SOUTH);
          pack();
       }
    }

     

    运行结果如下:

     

     

    实验2:结对编程练习

    利用所掌握的GUI技术,设计一个用户信息采集程序,要求如下:

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

     

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

     

     

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

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

     代码如下:

    package comboBox;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.*;
    import javax.swing.*;
     
    public class jcdshhbc 
    {
       public static void main(String[] args)
       {
          EventQueue.invokeLater(() -> {
             JFrame frame = new FrameTest();
             frame.setTitle("Designed by 曹玉中");
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame.setVisible(true);
          });
       }
    }
     
     
     
    class FrameTest extends JFrame
    {
        
        private JPanel panel;
        private JTextArea text,text2;
        private JRadioButton JRadioButton1,JRadioButton2;
        private ButtonGroup ButtonGroup;
        private JLabel JLabel;
        private JCheckBox h1,h2,h3;
        private JComboBox<String> JComboBox;
        private JButton Button,Button2;
        
        
       public FrameTest()
       {
          setSize(700,500);
          panel=new JPanel();
          panel.setLayout(null);
     
          ButtonGroup=new ButtonGroup();
          JRadioButton1=new JRadioButton("",false);   JRadioButton1.setBounds(150,330, 80, 50);
          JRadioButton2=new JRadioButton("",false); JRadioButton2.setBounds(150,300, 80,50);
          ButtonGroup.add(JRadioButton1);
          ButtonGroup.add(JRadioButton2);
          
          addJLabel("性别:",100,300);
          addJLabel("姓名:",100,50);
          addJLabel("地址:",100,150);
          addJLabel("年级:",400,50);
          addJLabel("爱好:",400,150);
          
          
          text=new JTextArea(1,1);text.setBounds(150,70, 120, 30);text.setLineWrap(true);
          text2=new JTextArea(5,3);text2.setBounds(150,160, 130, 100);text2.setLineWrap(true);
          
          
          h1=new JCheckBox("阅读");h1.setBounds(450,160,100,30);
          h2=new JCheckBox("跳舞");h2.setBounds(450,180,100,30);
          h3=new JCheckBox("唱歌");h3.setBounds(450,200,100,30);
     
          
          JComboBox=new JComboBox<>();
          JComboBox.addItem("大一");
          JComboBox.addItem("大二");
          JComboBox.addItem("大三");
          JComboBox.setBounds(500,65, 100, 20);
          
          Button = new JButton("提交");Button.setBounds(200, 400, 100, 35);
          Button2 = new JButton("重置");Button2.setBounds(400, 400, 100, 35);
     
          Button.addActionListener(new Action1());
          Button2.addActionListener(new Action2());
          
          panel.add(h1);
          panel.add(h2);
          panel.add(h3);
          panel.add(Button);
          panel.add(Button2);
          panel.add(JComboBox);
          panel.add(text);
          panel.add(text2);
          panel.add(JRadioButton1);
          panel.add(JRadioButton2);
          add(panel);
          
          
       }
       
       
       public void addJLabel(String n,int a,int b)
       {
           JLabel = new JLabel(n);
           JLabel.setBounds(a,b,100,50);
           panel.add(JLabel);
       }
       
       private class Action1 implements ActionListener
       {
       public void actionPerformed(ActionEvent event)
           {        
           System.out.println("姓名:"+text.getText()+"
    "+"地址:"+text2.getText());
           System.out.println("年级:"+JComboBox.getSelectedItem());
           System.out.println("爱好:");
           if(h1.isSelected()==true)System.out.print(h1.getText());
           if(h2.isSelected()==true)System.out.print(h2.getText());
           if(h3.isSelected()==true)System.out.print(h3.getText());
           System.out.println("
    "+"性别:");
           if(JRadioButton1.isSelected()==true)System.out.println(JRadioButton1.getText());
           if(JRadioButton2.isSelected()==true)System.out.println(JRadioButton2.getText());
           System.out.println("
    ");
           }
       } 
       private class Action2 implements ActionListener
       {
       public void actionPerformed(ActionEvent event)
           {        
           text.setText(null);
           text2.setText(null);
           h1.setSelected(false);
           h2.setSelected(false);
           h3.setSelected(false);
           ButtonGroup.clearSelection();
           JComboBox.setSelectedIndex(0);
           }
       }   
    }

    运行结果如下:

    结对编程:

     

     第三部分:实验总结。

          通过本章的学习,掌握了一些关于swing用户界面组件与GUI技术的相关知识,与前面的内容相连,了解了GUI是图形用户界面,而swing是java

    里的一个包,里面有专门设计用户界面的许多类,如JFrame,JButton .....。awt也是java里的一个包,和swing类似,但swing包功能更强,课本上

    介绍了较多组件,比较容易混淆,上实验课的时候遇到较多问题,好在在助教学长的帮助下得以解决,我也会在课下多多学习,加强巩固基础知识。

  • 相关阅读:
    Leetcode刷题记录:构建最大数二叉树
    Leetcode刷题记录:编码并解码短网址
    Python获取数字的二进制值
    SQL文件的BOM问题导致的invalid character错误及解决
    修改服务的运行权限,解决SVN Post Commit问题
    将iPod中的音乐拷贝到Mac中
    Linux下创建可执行bin安装文件
    Mac下使用XLD转换无损音乐Ape
    Mac环境下配置Tomcat+Eclipse
    Curl操作Elasticsearch的常用方法
  • 原文地址:https://www.cnblogs.com/nwnucyz/p/11956465.html
Copyright © 2020-2023  润新知