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分)
l 在elipse IDE中运行教材479页程序12-1,结合运行结果理解程序;
l 掌握布局管理器的用法;
l 理解GUI界面中事件处理技术的用途。
l 在布局管理应用代码处添加注释;
实验代码如下:
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分)
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(() -> { //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()) + "\n")); //调用addActionListener方法添加动作监听器类对象,append方法将给定的文本追加到文本区中已有文本的尾部 add(southPanel, BorderLayout.SOUTH);//添加southPanel面板到边框布局管理器的SOUTH位置 pack();//调整窗口的大小,考虑组建的首选大小 } }
运行结果如下:
实验1:测试程序3(5分)
l 在elipse IDE中调试运行教材489页程序12-3,结合运行结果理解程序;
l 掌握复选框组件的用法;
l 记录示例代码阅读理解中存在的问题与疑惑。
实验代码如下:
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分)
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(() -> { //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分)
l 在elipse IDE中调试运行教材494页程序12-5,结合运行结果理解程序;
l 掌握边框的用法;
l 记录示例代码阅读理解中存在的问题与疑惑。
实验代码如下:
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分)
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(() -> { //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() + "\n"+ "地址" + fieldadress.getText() + "\n")); 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用户界面组件,理论知识理解的还可以,在前面的几个验证性的实验中,对代码的理解觉得对这章知识掌握的还可以,但是在结对编程的环节当中,确实存在很大的问题,试了很多次,就是改不到老师要求的那种排版,外观丑陋,而且单选按钮以及复选框的信息我无法显示出来,还有就是那个录入信息输出框不在准确的位置。我会在改的。