201871010111-刘佳华《面向对象程序设计(java)》第十四周学习总结

实验十二  Swing图形界面组件(一)

实验时间 2019-11-29

第一部分:基础知识总结

1.设计模式

设计模式(Design pattern)是设计者一种流行的思考设计问题的方法,是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。每一个模式描述了一个不断重复发生的设计问题,以及该问题的核心解决方案

模型-视图-控制器设计模式(Model –ViewController )是Java EE平台下创建 Web 应用程序 的重要设计模式。

MVC设计模式 – Model(模型):是程序中用于处理程序数据逻辑的部分,通常模型负责在数据库中存取数据。– View(视图):是程序中处理数据显示的部分,通常视图依据模型存取的数据创建。 – Controller(控制器):是程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

MVC模式可应用于Java的GUI组件设计中。MVC模式GUI组件设计的唯一的模式,还有很多设计的模式(设计方法)。

Java组件有内容、外观、行为三个主要元素;这三个主要元素与模型—视图—控制器模式的 三部件的对应关系为:内容——控制器(作用:处理用户输入)  外观——视图(作用:显示内容)行为——模型(作用:存储内容)

2.布局管理:

布局管理器是一组类。实现 java.awt.LayoutManager 接口;决定容器中组件的位置和大小

Java.awt包中定义了5种布局管理类,每一种布局管理类对应一种布局策略。每个容器都有与之相关的默认布局管理器。当一个容器选定一种布局策略时,它应该创建该 策略对应的布局管理器对象,并将此对象设置为 自己的布局管理器。

5种布局管理器:(1)FlowLayout:流布局(Applet和Panel的默认布局管理器) (2)BorderLayout:边框布局( Window、Frame和Dialog的默认布局管理器)(3)GridLayout:网格布局(4)GridBagLayout: 网格组布局(5)CardLayout :卡片布局

FlowLayout Manager 组件采用从左到右,从上到下逐行摆放。

GridBagLayout不需要组件的尺寸一致,容许组件扩展到多行、多列。

每个容器对象在没有设置新的布局前,在容器中添加组件都按照该容器的缺省布局排列。通过setLayout( )方法为容器设置新的布局。格式 : 容器组件名.setLayout( 布局类对象名)

FlowLayout (流布局管理器):用于对组件逐行地定位,每完成一行,一个新行便又开始。与其他布局管理器不同的是,流布局管理器不限制它所管理组件的大小,允许它们有自己的最佳大小。

构造函数有:FlowLayout( ):生成一个默认的流式布局对象 ; FlowLayout(int align): 设定每一行组件的对齐方式(FlowLayout.LEFT, FlowLayout.CENTER, FlowLayout.RIGHT);FlowLayout(int align,int hgap,int vgap):可以设定组件间的水平和垂直距离(缺省时组件之间没有空隙)

流布局是panel面板的默认布局管理器

BorderLayout (边框布局管理器):边框布局管理器是每个JFrame的内容窗格的默认布局管理器;流布局管理器可将组件置于内容窗格的中部,北 部、南部、东部或西部位置。流布局管理器会扩展组件尺寸并填满指定方位区域。

BorderLayout的使用方法:设置容器的布局管理器为BorderLayout ;向容器中加入组件时,若使用两个参数的add() 方法,第二个参数必须说明加入组件在容器中的放置位置;位置参数是BorderLayout 类的常量:CENTER、 NORTH、SOUTH、EAST、WEST 例如: frame.add(component,BorderLayout.SOUTH);

BorderLayout( ) :创建新的BorderLayout,组件之间没有间距 ;setHgap(int hgap) :将组件间的水平间距设置为指定的值; setVgap(int vgap) :将组件间的垂直间距设置为指定的值

GridLayout (网格布局管理器):网格布局按行列排列所有的组件;在网格布局对象的构造器中,需要指定行数和列数: panel.setLayout(new GridLayout(6,10));放置组件的每个单元具有相同的尺寸。添加组件,从第一行和第一列开始,然后是第一行的第二列。以此类推。

GridLayout:指定网格中的行数和列数,创建网格布局

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

由于网格中所有单元的宽度、高度是相同的,所以Grid布局管理器总是忽略组件的最佳大小。将组件添加到网格中的命令次序决定组件占有的单元。单元的列数是从左到右填充,而行是从上到下由行填充。

3.Swing组件:

3.1  文本域(JTextField)

文本域(JTextField) : 用于获取单行文本输入。文本域的使用方法:JPanel panel = new JPanel(); JTextField textField = new JTextField("Default input", 20); panel.add(textField);第一个参数“Default input”:将文本域的缺省显示值为Default input ;第二个参数20:表示文本域显示宽度为20列。若要重新设置列数,可使用setColumns方法。

文本输入常用API:用于文本输入的组件继承于JTextComponent抽象类, java.swing.text.JTextComponent 1.2:String getText() ;  void setText(String text) 获取或设置文本组件中的文本 。 boolean isEditable() ; void setEditable(boolean b) 获取或设置editable特性,这个特性决定了用户是否可以编辑文本组件中的内容。 Java.swing. JComponent : void revalidate( ) :重新计算容器内所有组件的大小和位置,并对它们重新布局。 如 panel.revalidate()

文本域JTextField常用API : Java.swing. JTextField:  JTextField(int cols) 构造一个指定列数的空JTextField对象。  JTextField(String text,int cols) 构造一个指定列数、指定初始字符串的JTextField对象 。 int getColumns(int cols) ; void setColumns(int cols) 获取或设置文本域使用的列数

文本域初始化 :只要不为JTextField构造器提供字符串参数,就可以构造一个空白文本域。 JTextField textField=newJTextField(20);可在任何时候调用setText方法改变文本域内容。 textField.setText("Hello!"); 可调用getText方法获取键入的文本。要将返回的文本域内容的前后空格去掉,就需调用trim方法:String text=textField.getText().trim();若想改变显示文本的字体,则调用setFont方法。

3.2  文本区(JTextArea)

文本区(JTextArea)组件可让用户输入多行文本。生成JTextArea组件对象时,可以指定文本区的行数和列数: textArea = new JTextArea(8, 40); // 8行40列。输入时,如果文本区的文本超出显示范围,则其余的文本会被剪裁;可以使用换行来避免过长的行被裁减: textArea.setLineWrap(true);在Swing中,文本区没有滚动条,需要手动安装 :JScrollPane scrollPane = new JScrollPane(textArea)

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

文本区JTextArea的常用API:JTextArea(int rows, int cols) 构造一个rows行cols列的文本区对象 。JTextArea(String text,int rows, int cols) 用初始文本构造一个文本区对象。void setRows(int rows) 设置文本域使用的行数。 void append(String newText) 将给定文本附加到文本区中已有文本的后面。 void setLineWrap(boolean wrap) 打开或关闭换行。

3.3   标签

标签是容纳文本的组件。它们没有任何修饰(如没有边界 ),也不响应用户输入。标签的常用用途之一就是标识组件,例如标识文本域。其使用步骤如下: 1. 创建一个JLabel组件。例: JLabel label = new JLabel(“hours”, SwingConstants.RIGHT); 或者 JLabel label = new JLabel(“hours”, JLabel.RIGHT);以上代码创建了一个label,并指定label的对齐方式为右对齐。 2. 将标签组件放置在距离被标识组件足够近的地方。

标签组件常用API:JLable(String text)   JLable(Icon icon)    JLable(String text,int align) JLable(String text,Icon icon,int align) 构造一个标签。 String getText()   void setText(String text) 获取或设置标签的文本。 Icon getIcon()   void setIcon(Icon icon) 获取或设置标签的图标

3.4  密码域

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

3.5  复选框( JCheckBox )

复选框( JCheckBox ):如果想要接收的输入只是“是”或“非”,就可以使用复选框组件。用户通过单击某个复选框来选择相应的选项,再点击则取消选择。当复选框获得焦点时,用户也可以通过空格键来切换选择。

复选框构造器:1.bold = new JCheckBox("Bold"); 复选框自动地带有表示标签。 2. JCheckBox(String label,Icon icon); 构造带有标签与图标的复选框,默认初始未被选择。 3.JCheckBox(String label,boolean state); 用指定的标签和初始化选择状态构造一个复选框

复选框常用API: 1.void setSelected(boolean state); 设置复选框的选择状态 2.boolean isSelected(); 获取复选框的选择状态

3.6  单选按钮

单选按钮:当需要用户只选择几个选项中的一个。即当用户选择另一项的时候,前一项就自动的取消选择。

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

按钮组:为单选按钮组构造一个ButtonGroup的对象。 然后,再将JRadioButton类型的对象添加到按钮组中。按钮组负责在新按钮被按下的时,取消前一个按钮的选择状态。 ButtonGroup group = new ButtonGroup() group.add(JRadioButton对象); 注意:按钮组仅仅控制按钮的行为,如果想把这些按钮组织在一起布局,还需要把它们添加到容器中 ,如JPanel.

  3.6.1边框设置

边框:如果在一个窗口中有多组复选框或单选按 钮,就需要可视化的形式指明哪些按钮属于同 一组。Swing提供了一 组很有用的边框 ( borders)来解决这个问题。

边框的创建方法:可以调用BorderFactory类的静态方法创建。可选的风格有:凹斜面:BorderFactory.createLoweredBevelBorder() 凸斜面:BorderFactory.createRaisedBevelBorder() 蚀刻:BorderFactory.createEtchedBorder() 直线:BorderFactory.createLineBorder(Color) 不光滑:BorderFactory.createMatteBorder()还可以给边框加标题 BorderFactory.createTitledBorder()

        3.7  组合框

组合框:如果有多个选择项,使用单选按钮占据的屏幕空间太大时,就可以选择组合框。

组合框构造器与常用方法:faceCombo = new JComboBox(); faceCombo.setEditable(true); 让组合框可编辑 faceCombo.addItem("Serif"); faceCombo.insertItemAt("Monospace",0); 增加组合框选项 faceCombo.removeItem("Monospace"); faceCombo.removeItemAt(0); 删除组合框选项内容

3.8  滑动条( JSlider )

滑动条( JSlider ):可以让用户从一组离散值中进行选择,并且它还允许进行连续值得选择。

滑动条的修饰可通过显示标尺(tricks)对滑动条进行修饰。 slider.setMajorTickSpacing(20); 大标尺标记 slider.setMinorTickSpacing(5); 小标尺标记要想显示以上标记,还需调用: slider.setPaintTicks(true);

可以调用下列方法为大标尺添加标尺标签: slider.setPaintLabels(true); 会根据构建标尺时的min,max,和大标尺的间距自动添加 还可以提供其他形式的标尺标记: Hashtable<integer,component> labelTable = new Hashtable<integer,component>(); 构造一个键为Integer类型且值为Component类型 的散列表。

 

第二部分:实验部分

1、实验目的与要求

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

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

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

2、实验内容和步骤

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

测试程序1

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

掌握布局管理器的用法;

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

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

  1 package calculator;
  2 
  3 import java.awt.*;
  4 import java.awt.event.*;
  5 import javax.swing.*;
  6 
  7 /**
  8  * A panel with calculator buttons and a result display.
  9  */
 10 public class CalculatorPanel extends JPanel
 11 {
 12    private JButton display;
 13    private JButton display1;
 14    private JPanel panel;
 15    private double result;
 16    private String lastCommand;
 17    private boolean start;
 18 
 19    public CalculatorPanel()
 20    {
 21       setLayout(new BorderLayout());//将CalculartorPanel布局方法设置为边框布局
 22 
 23       result = 0;
 24       lastCommand = "=";
 25       start = true;
 26 
 27       // add the display
 28       
 29       display = new JButton("0");//添加Jbutton显示运算结果 
 30       display1=new JButton("00");
 31       display.setEnabled(false);//设置按钮不可选择
 32       display1.setEnabled(false);
 33       add(display, BorderLayout.NORTH);//将Jbutton布局为CalculatorPanel的最上侧
 34       add(display1,BorderLayout.SOUTH);
 35       var insert = new InsertAction();
 36       var command = new CommandAction();
 37 
 38       // add the buttons in a 4 x 4 grid
 39 
 40       panel = new JPanel();
 41       panel.setLayout(new GridLayout(4, 4));//创建一个panel布局为4*4的网格布局
 42 
 43       addButton("7", insert);
 44       addButton("8", insert);
 45       addButton("9", insert);
 46       addButton("/", command);
 47 
 48       addButton("4", insert);
 49       addButton("5", insert);
 50       addButton("6", insert);
 51       addButton("*", command);
 52 
 53       addButton("1", insert);
 54       addButton("2", insert);
 55       addButton("3", insert);
 56       addButton("-", command);
 57 
 58       addButton("0", insert);
 59       addButton(".", insert);
 60       addButton("=", command);
 61       addButton("+", command);
 62 
 63       add(panel, BorderLayout.CENTER);//将panel添加至CalculatorPanel中,布局为中心布局
 64    }
 65 
 66    /**
 67     * Adds a button to the center panel.
 68     * @param label the button label
 69     * @param listener the button listener
 70     */
 71    private void addButton(String label, ActionListener listener)//创建按钮,注册,添加至panel中
 72    {
 73       var button = new JButton(label);
 74       button.addActionListener(listener);
 75       panel.add(button);
 76    }
 77 
 78    /**
 79     * This action inserts the button action string to the end of the display text.
 80     */
 81    private class InsertAction implements ActionListener
 82    {
 83       public void actionPerformed(ActionEvent event)
 84       {
 85          String input = event.getActionCommand();
 86          if (start)
 87          {
 88             display.setText("");
 89             start = false;
 90          }
 91          display.setText(display.getText() + input);//计算结果显示
 92       }
 93    }
 94 
 95    /**
 96     * This action executes the command that the button action string denotes.
 97     */
 98    private class CommandAction implements ActionListener
 99    {
100       public void actionPerformed(ActionEvent event)
101       {
102          String command = event.getActionCommand();
103 
104          if (start)
105          {
106             if (command.equals("-"))
107             {
108                display.setText(command);
109                start = false;
110             }
111             else lastCommand = command;
112          }
113          else
114          {
115             calculate(Double.parseDouble(display.getText()));
116             lastCommand = command;
117             start = true;
118          }
119       }
120    }
121 
122    /**
123     * Carries out the pending calculation.
124     * @param x the value to be accumulated with the prior result.
125     */
126    public void calculate(double x)//calculate构造器实现最后字符判断操作
127    {
128       if (lastCommand.equals("+")) result += x;
129       else if (lastCommand.equals("-")) result -= x;
130       else if (lastCommand.equals("*")) result *= x;
131       else if (lastCommand.equals("/")) result /= x;
132       else if (lastCommand.equals("=")) result = x;
133       display.setText("" + result);
134    }
135 }
CalculatorPanel 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-02-09
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案