• 王艳 201771010127《面向对象程序设计(java)》第十四周学习总结


     实验十四  Swing图形界面组件

    一理论部分

    1.Layout Manager(布局管理器):布局管理器是一组类,实现 java.awt.LayoutManager 接口,决定容器中组件的位置和大小。

    每个容器都有与之相关的默认布局管理器。

    五种布局管理器:

    (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):可以设置组件之间的水平和垂直间隔
    2.文本域(JTextField) : 用于获取单行文本输入。
     用于文本输入的组件继承于JTextComponent抽象类

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

    4.文本区与文本域的异同:

    相同之处:

    文本域和文本区组件都可用于获取文本输入。
    不同之处:
    文本域只能接受单行文本的输入;
     文本区能够接受多行文本的输入

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

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

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

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

    8.复选框构造器

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

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

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

    9.单选按钮的构造器:
    1.JRadioButton(String label,Icon icon);创建一个带标签和图标的单选按钮
    2.JRadioButton(String label,boolean state);用指定的标签和初始化状态构造单选按钮
    10.菜单是GUI编程中经常用到的一种组件。位于窗口顶部的菜单栏(menu bar)中包括下拉菜单的名字。点击一个名字就可以打开包含菜单项(menuitems)和子菜单(submenus)的菜单.

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

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

    13.布局管理器应用总结:

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

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

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

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

     

     1、实验目的与要求

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

    (2) 掌握各类Java Swing组件用途及常用API;

    2、实验内容和步骤

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

    测试程序1

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

     掌握各种布局管理器的用法;

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

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

    import java.awt.*;
    import javax.swing.*;
    
    /**
     * @version 1.34 2015-06-12
     * @author Cay Horstmann
     */
    public class Calculator
    {
       public static void main(String[] args)
       {
          EventQueue.invokeLater(() -> {
             CalculatorFrame frame = new CalculatorFrame();
             frame.setTitle("Calculator");
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame.setVisible(true);
          });
       }
    }
    import javax.swing.*;
    
    /**
     * A frame with a calculator panel.
     */
    public class CalculatorFrame extends JFrame
    {
       public CalculatorFrame()
       {
          add(new CalculatorPanel());
          pack();
       }
    }
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    /**
     * A panel with calculator buttons and a result display.
     */
    public class CalculatorPanel extends JPanel
    {
       private JButton display;//定义显示Button组件对象
       private JPanel panel;
       private double result;//定义基本数据对象
       private String lastCommand;
       private boolean start;//布尔型:开始启动为ture
    
       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));//网格布局管理器:4行4列
    
          addButton("7", insert);
          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);//显示在窗口中心位置
       }
    
       /**
        * Adds a button to the center panel.
        * @param label the button label
        * @param listener the button listener
        */
       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;
             }
          }
       }
    
       /**
        * Carries out the pending calculation.
        * @param x the value to be accumulated with the prior result.
        */
       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:

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

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

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

    package text;
    
    import java.awt.*;
    import javax.swing.*;
    
    /**
     * @version 1.41 2015-06-12
     * @author Cay Horstmann
     */
    public class TextComponentTest
    {
       public static void main(String[] args)
       {
          EventQueue.invokeLater(() -> {
             JFrame 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;
    
    /**
     * A frame with sample text components.
     */
    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));//网格布局管理器: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");//定义Button按钮:insert
          southPanel.add(insertButton);//添加insert按钮
          insertButton.addActionListener(event ->
             textArea.append("User name: " + textField.getText() + " Password: "
                + new String(passwordField.getPassword()) + "
    "));
    
          add(southPanel, BorderLayout.SOUTH);//显示在窗口下方
          pack();
       }
    }

    程序运行结果如下:

    我们组的问题是在文本框输入姓名和密码后,如果输入过长,会显示不了,只能将文本框放大。能不能设置为根据窗口大小自动换行来显示。

    测试程序3

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

    掌握复选框组件的用法;

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

    package text;
    
    import java.awt.*;
    import javax.swing.*;
    
    /**
     * @version 1.34 2015-06-12
     * @author Cay Horstmann
     */
    public class CheckBoxTest
    {
       public static void main(String[] args)
       {
          EventQueue.invokeLater(() -> {
             JFrame frame = new CheckBoxFrame();
             frame.setTitle("CheckBoxTest");
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame.setVisible(true);
          });
       }
    }
    package text;
    
    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()//构造器
       {
          // add the sample text label
    
          label = new JLabel("The quick brown fox jumps over the lazy dog.");
          label.setFont(new Font("Serif", Font.BOLD, FONTSIZE));
          add(label, BorderLayout.CENTER);//边框布局管理器:显示在窗口中心位置
    
          // 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;
             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

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

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

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

    程序如下:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    /**
     * 带有示例文本标签和用于选择字体大小的单选按钮的框架.
     */
    public class RadioButtonFrame extends JFrame
    {
       private JPanel buttonPanel;
       private ButtonGroup group;//定义一个ButtonGroup对象
       private JLabel label;
       private static final int DEFAULT_SIZE = 36;
    
       public RadioButtonFrame()//构造器
       {      
          // add the sample text label
    
          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 name the string to appear on the button
        * @param size the font size that this button sets
        */
       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);
       }
    }
    import java.awt.*;
    import javax.swing.*;
    
    /**
     * @version 1.34 2015-06-12
     * @author Cay Horstmann
     */
    public class RadioButtonTest
    {
       public static void main(String[] args)
       {
          EventQueue.invokeLater(() -> {
             JFrame frame = new RadioButtonFrame();
             frame.setTitle("RadioButtonTest");
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame.setVisible(true);
          });
       }
    }

    程序运行结果如下:

    测试程序5

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

    掌握边框的用法;

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

    程序运行结果:

    测试程序6

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

    掌握组合框组件的用法;

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

    程序运行结果:

    测试程序7

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

    掌握滑动条组件的用法;

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

    测试程序8

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

    掌握菜单的创建、菜单事件监听器、复选框和单选按钮菜单项、弹出菜单以及快捷键和加速器的用法。

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

    运行结果:

    测试程序9

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

    掌握工具栏和工具提示的用法;

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

    运行结果:

    测试程序10

    elipse IDE中调试运行教材524页程序12-1012-11,结合运行结果理解程序,了解GridbagLayout的用法。

    elipse IDE中调试运行教材533页程序12-12,结合程序运行结果理解程序,了解GroupLayout的用法。

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

    运行结果:

     三:实验总结。

        这一周学习了Swing用户界面组件以及GUI相关组件。在学习过程中,自己对理论知识的学习学的比较混乱,混淆了这几部分的学习内容。另外,对于本周的实验,实验都有很多相同和类似的地方,在实验过程中任然没有理解的太清楚。在查了课本上的内容之后,稍微有了掌握。此外,通过小组协作进行实验,结合两个人对实验的理解,相比独自完成试验,在互相学习中有了更好的理解和掌握。

  • 相关阅读:
    ubuntu给手机建wifi
    ubuntu系统之难
    【百度之星2014~复赛 解题报告~正解】The Query on the Tree
    【百度之星2014~复赛)解题报告】The Query on the Tree
    【百度之星2014~初赛解题报告】
    【百度之星2014~初赛(第二轮)解题报告】JZP Set
    【百度之星2014~资格赛解题报告】
    【百度之星2014~初赛(第二轮)解题报告】Chess
    vi 中插入当前时间
    安装软件时依赖冲突的万能解决方案
  • 原文地址:https://www.cnblogs.com/JAVA-729/p/10046740.html
走看看 - 开发者的网上家园