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

java

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

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

l 掌握布局管理器的用法;

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

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

  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 

 1 package calculator;

2

3 import javax.swing.*;

4

5 /**

6 * A frame with a calculator panel.

7 */

8 public class CalculatorFrame extends JFrame

9 {

10 public CalculatorFrame()

11 {

12 add(new CalculatorPanel());//将Panel添加至frame中,匿名对象的方法

13 pack();

14 }

15 }

CalculatorFrame 

 1 package calculator;

2

3 import java.awt.*;

4 import javax.swing.*;

5

6 /**

7 * @version 1.35 2018-04-10

8 * @author Cay Horstmann

9 */

10 public class Calculator

11 {

12 public static void main(String[] args)

13 {

14 EventQueue.invokeLater(() -> {

15 var frame = new CalculatorFrame();

16 frame.setTitle("Calculator");

17 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

18 frame.setVisible(true);

19 });

20 }

21 }

View Code

运行结果:

测试程序2

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

l 掌握文本组件的用法;

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

 1 package text;

2

3 import java.awt.BorderLayout;

4 import java.awt.GridLayout;

5

6 import javax.swing.JButton;

7 import javax.swing.JFrame;

8 import javax.swing.JLabel;

9 import javax.swing.JPanel;

10 import javax.swing.JPasswordField;

11 import javax.swing.JScrollPane;

12 import javax.swing.JTextArea;

13 import javax.swing.JTextField;

14 import javax.swing.SwingConstants;

15

16 /**

17 * A frame with sample text components.

18 */

19 public class TextComponentFrame extends JFrame

20 {

21 public static final int TEXTAREA_ROWS = 8;

22 public static final int TEXTAREA_COLUMNS = 20;

23

24 public TextComponentFrame()

25 {

26 var textField = new JTextField();

27 var passwordField = new JPasswordField();

28 //northPanel 2*2网格布局

29 var northPanel = new JPanel();

30 northPanel.setLayout(new GridLayout(2, 2));

31 northPanel.add(new JLabel("User name: ", SwingConstants.CENTER));

32 northPanel.add(textField);

33 northPanel.add(new JLabel("Password: ", SwingConstants.CENTER));

34 northPanel.add(passwordField);

35

36 add(northPanel, BorderLayout.NORTH);

37 //textArea ,依附。

38 var textArea = new JTextArea(TEXTAREA_ROWS, TEXTAREA_COLUMNS);

39 var scrollPane = new JScrollPane(textArea);

40

41 add(scrollPane, BorderLayout.CENTER);

42

43 // 添加按钮将文本附加到文本区域

44 //southPanel button 控制

45

46 var southPanel = new JPanel();

47

48 var insertButton = new JButton("Insert");

49 southPanel.add(insertButton);

50 insertButton.addActionListener(event ->

51 textArea.append("User name: " + textField.getText() + " Password: "

52 + new String(passwordField.getPassword()) + "\n"));

53

54 add(southPanel, BorderLayout.SOUTH);

55 pack();//自适应显示窗口

56 }

57 }

TextComponentFrame

 1 package text;

2

3 import java.awt.*;

4 import javax.swing.*;

5

6 /**

7 * @version 1.42 2018-04-10

8 * @author Cay Horstmann

9 */

10 public class TextComponentTest

11 {

12 public static void main(String[] args)

13 {

14 EventQueue.invokeLater(() -> {

15 var frame = new TextComponentFrame();

16 frame.setTitle("TextComponentTest");

17 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

18 frame.setVisible(true);

19 });

20 }

21 }

TextComponentTest

测试程序3

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

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

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

 1 package checkBox;

2

3 import java.awt.*;

4 import java.awt.event.*;

5 import javax.swing.*;

6

7 /**

8 * A frame with a sample text label and check boxes for selecting font

9 * attributes.

10 */

11 public class CheckBoxFrame extends JFrame

12 {

13 private JLabel label;

14 private JCheckBox bold;

15 private JCheckBox italic;

16 private static final int FONTSIZE = 24;

17

18 public CheckBoxFrame()

19 {

20 // add the sample text label

21

22 label = new JLabel("The quick brown fox jumps over the lazy dog.");

23 label.setFont(new Font("Serif", Font.BOLD, FONTSIZE));//字体

24 add(label, BorderLayout.CENTER);

25

26 // ActionPerformed 方法查询bold和italic两个复选框的状态,并且把面板中的字体设置加粗,常规,倾斜

27

28 ActionListener listener = event -> {

29 int mode = 0;

30 if (bold.isSelected()) mode += Font.BOLD;

31 if (italic.isSelected()) mode += Font.ITALIC;

32 label.setFont(new Font("Serif", mode, FONTSIZE));

33 };

34

35 // 添加JCheckBox组件

36

37 var buttonPanel = new JPanel();

38

39 bold = new JCheckBox("Bold");

40 bold.addActionListener(listener);

41 bold.setSelected(true);

42 buttonPanel.add(bold);

43

44 italic = new JCheckBox("Italic");

45 italic.addActionListener(listener);

46 buttonPanel.add(italic);

47

48 add(buttonPanel, BorderLayout.SOUTH);

49 pack();

50 }

51 }

CheckBoxFrame

 1 package checkBox;

2

3 import java.awt.*;

4 import javax.swing.*;

5

6 /**

7 * @version 1.35 2018-04-10

8 * @author Cay Horstmann

9 */

10 public class CheckBoxTest

11 {

12 public static void main(String[] args)

13 {

14 EventQueue.invokeLater(() -> {

15 var frame = new CheckBoxFrame();

16 frame.setTitle("CheckBoxTest");

17 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

18 frame.setVisible(true);

19 });

20 }

21 }

CheckBoxTest

运行截图:

  

测试程序4

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

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

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

 1 package radioButton;

2

3 import java.awt.*;

4 import java.awt.event.*;

5 import javax.swing.*;

6

7 /**

8 * A frame with a sample text label and radio buttons for selecting font sizes.

9 */

10 public class RadioButtonFrame extends JFrame

11 {

12 private JPanel buttonPanel;

13 private ButtonGroup group;

14 private JLabel label;

15 private static final int DEFAULT_SIZE = 36;

16

17 public RadioButtonFrame()

18 {

19 // add the sample text label

20

21 label = new JLabel("The quick brown fox jumps over the lazy dog.");

22 label.setFont(new Font("Serif", Font.PLAIN, DEFAULT_SIZE));

23 add(label, BorderLayout.CENTER);

24

25 // 添加单选按钮

26

27 buttonPanel = new JPanel();

28 group = new ButtonGroup();

29

30 addRadioButton("Small", 8);

31 addRadioButton("Medium", 12);

32 addRadioButton("Large", 18);

33 addRadioButton("Extra large", 36);

34

35 add(buttonPanel, BorderLayout.SOUTH);

36 pack();

37 }

38

39 /**

40 * Adds a radio button that sets the font size of the sample text.

41 * @param name the string to appear on the button

42 * @param size the font size that this button sets

43 */

44 public void addRadioButton(String name, int size)

45 {

46 boolean selected = size == DEFAULT_SIZE;

47 var button = new JRadioButton(name, selected);

48 group.add(button);

49 buttonPanel.add(button);

50

51 // 监听器设置 label 字体大小

52

53 ActionListener listener = event -> label.setFont(new Font("Serif", Font.PLAIN, size));

54

55 button.addActionListener(listener);

56 }

57 }

RadioButtonFrame

 1 package radioButton;

2

3 import java.awt.*;

4 import javax.swing.*;

5

6 /**

7 * @version 1.35 2018-04-10

8 * @author Cay Horstmann

9 */

10 public class RadioButtonTest

11 {

12 public static void main(String[] args)

13 {

14 EventQueue.invokeLater(() -> {

15 var frame = new RadioButtonFrame();

16 frame.setTitle("RadioButtonTest");

17 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

18 frame.setVisible(true);

19 });

20 System.out.println();

21 }

22 }

View Code

运行截图:

   

  

测试程序5

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

l 掌握边框的用法;

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

 1 package border;

2

3 import java.awt.*;

4 import javax.swing.*;

5 import javax.swing.border.*;

6

7 /**

8 * A frame with radio buttons to pick a border style.

9 */

10 public class BorderFrame extends JFrame

11 {

12 private JPanel demoPanel;

13 private JPanel buttonPanel;

14 private ButtonGroup group;

15

16 public BorderFrame()

17 {

18 demoPanel = new JPanel();

19 buttonPanel = new JPanel();

20 group = new ButtonGroup();

21 //设置不同的边框类型按钮,共六种(提供标准 Border 对象的工厂类)

22 addRadioButton("Lowered bevel", BorderFactory.createLoweredBevelBorder());

23 addRadioButton("Raised bevel", BorderFactory.createRaisedBevelBorder());

24 addRadioButton("Etched", BorderFactory.createEtchedBorder());

25 addRadioButton("Line", BorderFactory.createLineBorder(Color.BLUE));

26 addRadioButton("Matte", BorderFactory.createMatteBorder(10, 10, 10, 10, Color.BLUE));

27 addRadioButton("Empty", BorderFactory.createEmptyBorder());

28

29 Border etched = BorderFactory.createEtchedBorder();

30 Border titled = BorderFactory.createTitledBorder(etched, "Border types");

31 buttonPanel.setBorder(titled);

32

33 setLayout(new GridLayout(2, 1));

34 add(buttonPanel);

35 add(demoPanel);

36 pack();

37 }

38

39 public void addRadioButton(String buttonName, Border b)

40 {

41 var button = new JRadioButton(buttonName);

42 button.addActionListener(event -> demoPanel.setBorder(b));

43 group.add(button);

44 buttonPanel.add(button);

45 }

46 }

BorderFrame

 1 package border;

2

3 import java.awt.*;

4 import javax.swing.*;

5

6 /**

7 * @version 1.35 2018-04-10

8 * @author Cay Horstmann

9 */

10 public class BorderTest

11 {

12 public static void main(String[] args)

13 {

14 EventQueue.invokeLater(() -> {

15 var frame = new BorderFrame();

16 frame.setTitle("BorderTest");

17 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

18 frame.setVisible(true);

19 });

20 }

21 }

BorderTest

运行截图:

测试程序6

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

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

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

 1 package ComboBoxFrame;

2

3 import java.awt.BorderLayout;

4 import java.awt.Font;

5

6 import javax.swing.JComboBox;

7 import javax.swing.JFrame;

8 import javax.swing.JLabel;

9 import javax.swing.JPanel;

10

11 /**

12 * 具有示例文本标签和用于选择字体外观的组合框的框架。

13 * 组合框:将按钮或可编辑字段与下拉列表组合的组件。

14 * 用户可以从下拉列表中选择值,下拉列表在用户请求时显示。

15 * 如果使组合框处于可编辑状态,则组合框将包括用户可在其中键入值的可编辑字段。

16 */

17 public class ComboBoxFrame extends JFrame

18 {

19 private JComboBox<String> faceCombo;

20 private JLabel label;

21 private static final int DEFAULT_SIZE = 24;

22

23 public ComboBoxFrame()

24 {

25 // 添加示例文本标签

26

27 label = new JLabel("The quick brown fox jumps over the lazy dog.");

28 label.setFont(new Font("Serif", Font.PLAIN, DEFAULT_SIZE));

29 add(label, BorderLayout.CENTER);

30

31 // 创建一个组合框对象并添加项目名称

32

33 faceCombo = new JComboBox<>();

34 faceCombo.addItem("Serif");

35 faceCombo.addItem("SansSerif");

36 faceCombo.addItem("Monospaced");

37 faceCombo.addItem("Dialog");

38 faceCombo.addItem("DialogInput");

39

40 // 组合框监听器将标签字体更改为所选的名称(添加监听器,使用lambda表达式)

41

42 faceCombo.addActionListener(event ->

43 label.setFont(

44 new Font(faceCombo.getItemAt(faceCombo.getSelectedIndex()),

45 Font.PLAIN, DEFAULT_SIZE)));

46

47 // 将组合框添加到框架南部边界的面板

48 var comboPanel = new JPanel();

49 comboPanel.add(faceCombo);

50 add(comboPanel, BorderLayout.SOUTH);

51 pack();

52 }

53 }

ComboBoxFrame

 1 package ComboBoxFrame;

2

3 import java.awt.*;

4 import javax.swing.*;

5

6 /**

7 * @version 1.36 2018-04-10

8 * @author Cay Horstmann

9 */

10 public class ComboBoxTest

11 {

12 public static void main(String[] args)

13 {

14 //lambda表达式

15 EventQueue.invokeLater(() -> {

16 //构造frame框架对象

17 JFrame frame = new ComboBoxFrame();

18 //设置标题

19 frame.setTitle("ComboBoxTest");

20 //设置用户在此窗体上发起 "close" 时默认执行的操作。

21 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

22 //设置框架是否可见

23 frame.setVisible(true);

24 });

25 }

26 }

ComboBoxTest

运行截图:

实验2:结对编程练习

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

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

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

 

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

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

 Part03 结对编程实验:

  • 3.01 结对编程问题及思路描述:

    由用户输入一系列信息,再点击提交之后会在文本框中显示出来,在点击重制时会清空一些文本;

    设计思路:运用Swing组件中的textFilde ,JLable,Jbutton,TextArea等组件以及网格布局等布局方法使得能够实现这些个操作;

  • 3.02  结对编程整体代码:

 1 package TeamWork03;

2

3 import java.awt.*;

4 import javax.swing.*;

5

6

7 public class TeamWork03Test

8 {

9 public static void main(String[] args)

10 {

11 EventQueue.invokeLater(() -> {

12 var frame = new Frame();

13 frame.setSize(500, 500);

14 frame.setTitle("UserGUITest");

15 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

16 frame.setVisible(true);

17 });

18 }

19 }

TeamWork03Test

1 package TeamWork03;

2

3 public class TeamWork03 {

4 public static void main(String args[]) {

5 new Frame();

6 }

7 }

TeamWork03

  1 package TeamWork03;

2

3 import java.awt.BorderLayout;

4 import java.awt.GridLayout;

5 import java.awt.Panel;

6 import java.awt.TextArea;

7 import javax.swing.BorderFactory;

8 import javax.swing.ButtonGroup;

9 import javax.swing.JButton;

10 import javax.swing.JCheckBox;

11 import javax.swing.JFrame;

12 import javax.swing.JLabel;

13 import javax.swing.JPanel;

14 import javax.swing.JRadioButton;

15 import javax.swing.JTextField;

16 import javax.swing.border.Border;

17

18

19

20 public class Frame extends JFrame{

21 private JPanel Pane1;

22 private JPanel Pane2;

23 private JPanel Pane3;

24 private JPanel PaneT;

25 private ButtonGroup group1;

26 private JTextField TextField1;

27 private JTextField TextField2;

28 private JButton button1;

29 private JButton button2;

30 private TextArea TextArea;

31 String sex;

32

33 public Frame() {

34 setLayout(new GridLayout(4,1,0,50));

35 Pane1=new JPanel();

36 group1 = new ButtonGroup();

37 TextField1=new JTextField(8);

38 TextField2=new JTextField(15);

39 JLabel J1=new JLabel("姓名:");

40 JLabel J2=new JLabel("地址:");

41 Pane1.add(J1);

42

43 //Pane1.add(new JLabel("姓名",SwingConstants.CENTER));

44 Pane1.add(TextField1);

45 //Pane1.add(new JLabel("地址",SwingConstants.CENTER));

46 Pane1.add(J2);

47 Pane1.add(TextField2);

48 this.add(Pane1,BorderLayout.NORTH);

49

50 Pane2=new JPanel();

51 //Pane2.setSize(50, 50);

52 group1 =new ButtonGroup();

53 JRadioButton meal=new JRadioButton("男",false);

54 JRadioButton femeal=new JRadioButton("女",false);

55

56 group1.add(meal);

57 group1.add(femeal);

58 Border etched = BorderFactory.createEtchedBorder();

59 Border titled = BorderFactory.createTitledBorder(etched, "性別");

60 Pane2.setBorder(titled);

61 Pane2.add(meal);

62 Pane2.add(femeal);

63

64 Pane3=new JPanel();

65

66 JCheckBox b1=new JCheckBox("阅读");

67 JCheckBox b2=new JCheckBox("唱歌");

68 JCheckBox b3=new JCheckBox("跳舞");

69 Border titled2 = BorderFactory.createTitledBorder(etched, "爱好");

70 Pane3.setBorder(titled2);

71 Pane3.add(b1);

72 Pane3.add(b2);

73 Pane3.add(b3);

74

75 JPanel Panemax = new JPanel();

76 Panemax.add(Pane2);

77 Panemax.add(Pane3);

78 this.add(Panemax);

79 button1=new JButton("提交");

80 button2=new JButton("重置");

81 Panel op=new Panel();

82 op.add(button1);

83 op.add(button2);

84 this.add(op);

85 PaneT=new JPanel();

86 TextArea=new TextArea("录入信息显示区!");

87 PaneT.add(TextArea);

88 this.add(PaneT);

89

90 button1.addActionListener(event->{

91 if(meal.isSelected()) {

92 this.sex="男";

93 }

94 if(femeal.isSelected()) {

95 this.sex="女";

96 }

97

98 String l = " ";

99 String m = " ";

100 String n = " ";

101 if(!(b1.isSelected()||b2.isSelected()||b3.isSelected())) {m=null;}

102 if(b1.isSelected()&&b2.isSelected()&&b3.isSelected()) {l=b1.getText();m=b2.getText();n=b3.getText();}

103 if(b1.isSelected()&&b2.isSelected()) {l=b1.getText();m=b2.getText();}

104 if(b1.isSelected()&&b3.isSelected()) {l=b1.getText();n=b3.getText();}

105 if(b2.isSelected()&&b3.isSelected()) {m=b2.getText();n=b3.getText();}

106 if(b1.isSelected()) {l=b1.getText();}

107 if(b2.isSelected()) {m=b2.getText();}

108 if(b3.isSelected()) {n=b3.getText();}

109

110 // System.out.println(m);

111 TextArea.setText(J1.getText()+TextField1.getText()+" "+J2.getText()+TextField2.getText()+" "

112 +"性别:"+" "+this.sex+" "+"爱好:"+l+" "+m+" "+n);

113 });

114 button2.addActionListener(event->{

115 TextField1.setText(null);

116 TextField2.setText(null);

117 //TextArea.setText(null);

118 b1.setSelected(false);

119 b2.setSelected(false);

120 b3.setSelected(false);

121

122 });

123 }

124

125 }

Frame

  • 3.03  结对编程代码运行截图:

    

  • 3.04  结对编程过程中过程中照片实例及编程反思:

     在实验过程中,我一开始只想到了网格布局,致使界面很是丑陋,之后又想到了流布局,在结合了这两种布局方式之后,使得页面布局不是那么难看;对于Checkbox这一块儿问题还是比较多,希望能通过一些方法获得并且掌握;还有在单击重置时,JRadioButton 的选中值无法清空,setSelected(false)也不起作用;

 三、实验心得体会

 通过本周的测试程序,结合书中的知识,学习程序GUI设计中应用的相关组件以及各类Java Swing组件用途及常用API,我发现对以前所学知识掌握还不够。在本章的学习中,还存在着一些问题,比如在Swing组件中的下拉选项框,复选框等,此外在以后的学习中,不仅要学习新知识,也有复习已学知识。

 

 

以上是 201871010111-刘佳华《面向对象程序设计(java)》第十四周学习总结 的全部内容, 来源链接: utcz.com/z/393544.html

回到顶部