项目

内容

这个作业属于哪个课程

<任课教师博客主页链接>

https://www.cnblogs.com/nwnu-daizh/

这个作业的要求在哪里

<作业链接地址>

https://www.cnblogs.com/nwnu-daizh/p/11953993.html

作业学习目标

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

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

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

 

第一部分:总结第十二章本周理论知识(25分)

1.布局管理

     布局管理器(FlowLayout) 
       JPanel对象的默认布局管理器为FlowLayout,组件加入JPanel中总是处于中央,一行可以排列多个组件,如果一行的空间容纳不下所有的组件则换行。当顶层窗口缩放时,JPanel中组件的大小不会随之缩放。 
    边框布局管理器(BorderLayout) 
    是JFrame的内容窗格的默认布局管理器,可以选择将空间放在内容窗格的东、南、西、北、中。 且将组件加入其中时,组件会充满其对应的整个区域,如果在这个方位再加入一个组件,会覆盖原本存在的组件。当顶层窗口缩放时,东南西北的组件不会     随之变化,中部的组件会等比例变化。 
    如果要在某方法并排加入几个组件,则可以先将组件加入JPanel中,再放入边框布局管理器。 
    BorderLayout的常量定义为字符串 

     frame.add(new JButton("Yes"),BorderLayout.SOUTH);

    网格布局(Grid Layout) 
    布局类似于表格,每个单元大小一致,当顶层窗口缩放时组件大小也随之变化,但是尺寸比例保持一致。

    frame.SetLayout(new GridLayout(4,4));//形成4x4的网格
    frame.add(new JButton("1"));
    GridLayout(int r,int c) 参数之一可以为0,但是不能同时为0 
    GridLayout(int r,int c,int hgap,int vgap) hgap表示单元之间的水平间距,vgap表示单元之间的垂直间距

2.文本输入
    扩展于JTextComponent的JTextField和JTextArea 
      JTextField和JTextArea都用于文本输入,其中JTextField接收单行文本的输入,而JTextArea可接收多行文本的输入。

      列数为文本域的宽度,如果希望文本域最多能输入N个字符,则将宽度设置为N

      JTextField text = new JTextField("Input Here",20);

      第二个构造函数可以指定文本区显示的行数和列数。如果需要设置滚动条,则需要将文本区加入JScrollPane中,再讲JScrollPane插入容器。

      JTextArea area = new TextArea(4,10);
      JScrollPane pane = new JScrollPane(area);
      panel.add(pane);
      扩展于JTextField的JPasswordField 
      接受单行输入,输入字符被特殊字符掩盖

   JLabel 
      没有任何修饰,不能响应用户输入,只是容纳文本的组件。可以设置标签的显示文字、图标以及对其方式

      其中对其方式是SwingConstants里的常量,如LEFT/RIGHT/CENTER等

      JLabel label = new JLabel("User Name:",SwingConstants.RIGHT);
3.选择组件
  JCheckBox 
      复选框自动带有标签和图标,在构造时可以提供,当用户选中复选框时会触发动作事件。

      JCheckBox box = new JCheckBox("Bold");    

      box.setSelected(true);  

  单选钮(JRadioButton)      

       自带标签和图标。单选钮只能多选其一,要打到这种效果需要把所有的单选钮加入ButtonGroup的对象里,从而使得新按钮被按下时,取消前一个选中的按钮的状态。ButtonGroup直接扩展于Object类,所以单选钮需加入容器中进行布局,   ButtonGrou和容器(如JPanel)是相互独立的。 选中时触发动作事件。 

  边框(Border) 
        任何继承自JComponent的组件都可以使用边框(void setBorder(Border b))。常用的方法是将组件放入容器中,然后容器使用边框。是通过调用BorderFactory的静态方法构建边框。 
        同时可以为边框设置标题:

        Border etch = BorderFactory.createEtchedBorder();
        Border title = BorderFactory.createTitleBorder(etch,"Title");
        panel.setBorder(title);
  组合框 
        JComboBox< T>是泛型类,构建时需注意。 
        组合框不仅有下拉选择的功能,还具有文本框编辑的功能。 
        获得当前选中内容:

        combo.getItemAt(combo.getSelectedIndex());
        //Object getItemAt(int index)
        当用户从组合框中选中一个选项时,组合框就会产生一个动作事件。

  .条(JSlider) 
        滑动条在构造时默认是横向,如果需要纵向滑动条:

        JSlider s = new JSlider(SwingConstants.VERTICAL,min,max,initialValue);
        当滑动条滑动时,会触发ChangeEvent,需要调用addChangeListener()并且安装一个实现了ChangeListener接口的对象。这个接口只有一个StateChanged方法

        //得到滑动条的当前值
        ChangeListener listen = event ->{
        JSlider s = (JSlider)event.getSource();
        int val = s.getValue(); 
        ...
        };
        如果需要显示滑动条的刻度,则setPaintTicks(true); 
        如果要将滑动条强制对准刻度,则setSnapToTicks(true); 
        如果要为滑动条设置标签,则需要先构建一个Hashtable< Integer,Component>,将数字与标签对应起来,再调用setLabelTable(Dictionary label);

4.复杂的布局管理
    GridBagLayout(网格组布局) 
        即没有限制的网格布局,行和列的尺寸可以改变,且单元格可以合并 
        过程: 
          1)建议一个GridBagLayout对象,不需要指定行列数 
          2)将容器setLayout为GBL对象 
          3)为每个组件建立GridBagConstraints对象,即约束组件的大小以及排放方式 
          4)通过add(component,constraints)增加组件 
          使用帮助类来管理约束会方便很多。 
    不使用布局管理器

    frame.setLayout(null);
    JButton btn = new JButton("Yes");
    frame.add(btn);
    btn.setBounds(10,10,100,30);
    //void setBounds(int x,int y,int width,int height)//x,y表示左上角的坐标,width/height表示组件宽和高,Component类的方法
    组件的遍历顺序(焦点的顺序):从左至右从上到下

    component.setFocusable(false);//组件不设置焦点
5.菜单
    分为JMenuBar/JMenu/JMenuItem,当选择菜单项时会触发一个动作事件,需要注册监听器监听

6.对话框
    对话框分为模式对话框和无模对话框,模式对话框就是未处理此对话框之前不允许与其他窗口交互。 
  JOptionPane 
    提供了四个用静态方法(showxxxx)显示的对话框: 
    构造对话框的步骤: 
      1)选择对话框类型(消息、确认、选择、输入) 
      2)选择消息类型(String/Icon/Component/Object[]/任何其他对象) 
      3)选择图标(ERROR_MESSAGE/INFORMATION_MESSAGE/WARNING_MESSAGE/QUESTION_MESSAGE/PLAIN_MESSAGE) 
      4)对于确认对话框,选择按钮类型(DEFAULT_OPTION/YES_NO_OPTION/YES_NO_CANCEL_OPTION/OK_CANCEL_OPTION) 
      5)对于选项对话框,选择选项(String/Icon/Component) 
      6)对于输入对话框,选择文本框或组合框 
      确认对话框和选择对话框调用后会返回按钮值或被选的选项的索引值 
   JDialog类 
      可以自己创建对话框,需调用超类JDialog类的构造器

      public aboutD extends JDialog
      {
        public aboutD(JFrame owner)
        {
          super(owner,"About Text",true);
           ....
        }
      }
    构造JDialog类后需要setVisible才能时窗口可见

    if(dialog == null)
    dialog = new JDialog();
    dialog.setVisible(true);
  文件对话框(JFileChooser类) 
  颜色对话框(JColorChooser类)

 

第二部分:实验部分

实验1:测试程序1(5分)

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

掌握布局管理器的用法;

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

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

Calculator.java

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);
      });
   }
}

  CalculatorFrame.java

package calculator;

import javax.swing.*;

/**
 * A frame with a calculator panel.
 */
public class CalculatorFrame extends JFrame
{
   public CalculatorFrame()
   {
      add(new CalculatorPanel());
      pack();
   }
}

  CalculatorPanel.java

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
{
   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);//设置动作enable属性,只有显示功能
      add(display, BorderLayout.NORTH);//定位

      var insert = new InsertAction();
      var 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)
   {
      var button = new JButton(label);
      button.addActionListener(listener);
      panel.add(button);
   }

   /**
    * This action inserts the button action string to the end of the display text.
    */
   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);
      }
   }

   /**
    * This action executes the command that the button action string denotes.
    */
   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()));//将文本域里获取的字符串转换为Double类型
            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);//显示计算结果
   }
}

  

 

 

实验1:测试程序2(5分)

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

掌握文本组件的用法;

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

TextComponentTest.java

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);
      });
   }
}

  TextComponentFrame.java

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()
   {
      var textField = new JTextField();//构造文本域对象
      var passwordField = new JPasswordField();//构造密码域对象

      var 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);//通过边框布局定位

      var textArea = new JTextArea(TEXTAREA_ROWS, TEXTAREA_COLUMNS);//定义有列、行的文本区
      var scrollPane = new JScrollPane(textArea);//文本区上添加滚动条

      add(scrollPane, BorderLayout.CENTER);

      // add button to append text into the text area

      var southPanel = new JPanel();

      var insertButton = new JButton("Insert");
      southPanel.add(insertButton);
      //lamda表达式
      insertButton.addActionListener(event ->
         textArea.append("User name: " + textField.getText() + " Password: "
            + new String(passwordField.getPassword()) + "\n"));//将给定的文本添加到文本区中已有文本尾部

      add(southPanel, BorderLayout.SOUTH);
      pack();
   }
}

  

 

 

实验1:测试程序3(5分)

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

掌握复选框组件的用法;

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

CheckBoxTest.java

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);
      });
   }
}

  CheckBoxFrame.java

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()
   {
      //添加只含文本的标签

      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
      
      
      //lamda表达式
      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));
      };

      // 添加复选框

      var buttonPanel = new JPanel();

      bold = new JCheckBox("Bold");//构造复选框
      bold.addActionListener(listener);
      bold.setSelected(true);//设置复选框的选择状态
      buttonPanel.add(bold);//面板上添加复选框

      italic = new JCheckBox("Italic");
      italic.addActionListener(listener);
      italic.setSelected(true);
      buttonPanel.add(italic);

      add(buttonPanel, BorderLayout.SOUTH);//定位
      pack();
   }
}

 

 

实验1:测试程序4(5分)

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

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

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

RadioButtonTest.java

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);
      });
   }
}

  RadioButtonFrame.java

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()
   {      
      //添加只含文本的标签

      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();
   }

   /**
    * 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)
   {
      boolean selected = size == DEFAULT_SIZE;
      var 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);
   }
}

 

 

实验1:测试程序5(5分)

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

掌握边框的用法;

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

BorderTest.java

 

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);
      });
   }
}

  BorderFrame.java

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()
   {
      demoPanel = new JPanel();
      buttonPanel = new JPanel();
      group = new ButtonGroup();

      addRadioButton("Lowered bevel", BorderFactory.createLoweredBevelBorder());//凹面效果边框
      addRadioButton("Raised bevel", BorderFactory.createRaisedBevelBorder());//凸面效果边框
      addRadioButton("Etched", BorderFactory.createEtchedBorder());//3D效果的边框
      addRadioButton("Line", BorderFactory.createLineBorder(Color.BLUE));//带有3D效果颜色的边框
      addRadioButton("Matte", BorderFactory.createMatteBorder(10, 10, 10, 10, Color.BLUE));//用color颜色填充的粗的边框
      addRadioButton("Empty", BorderFactory.createEmptyBorder());//空边框

      Border etched = BorderFactory.createEtchedBorder();//创建具有3D效果的直线边框
      Border titled = BorderFactory.createTitledBorder(etched, "Border types");//创建具有给定特性的带标题的边框
      buttonPanel.setBorder(titled);//设置这个组件的边框

      setLayout(new GridLayout(2, 1));//2*1网格
      add(buttonPanel);
      add(demoPanel);
      pack();
   }

   public void addRadioButton(String buttonName, Border b)
   {
      var button = new JRadioButton(buttonName);
      button.addActionListener(event -> demoPanel.setBorder(b));
      group.add(button);
      buttonPanel.add(button);
   }
}

初始界面

 

 

 

   

 

 

 

实验1:测试程序6(5分)

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

 掌握组合框组件的用法;

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

ComboBoxTest.java

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);
      });
   }
}

  ComboBoxFrame.java

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泛型类,JComboBox<String>包含String类型的对象
   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");

      // 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)));

      // 在框架南部边框的面板上添加组合框

      var comboPanel = new JPanel();
      comboPanel.add(faceCombo);
      add(comboPanel, BorderLayout.SOUTH);
      pack();
   }
}

  初始界面

 

 

 

 

 

 

实验2:结对编程练习包含以下4部分:(30分)

1)   程序设计思路简述;

首先定义4*1网格,第一面板设置为1*4网格,分别添加姓名标签,文本域,地址标签,文本域。第二个面板设置为1*2网络,分别添加了两个面板,第一个面板设置单选框,第二个面板设置复选框。第三个面板定义了两个按钮,第四个面板添加一个文本区。通过点击提交按钮,对按钮事件设置了动作监听器,点击提交显示相关信息,点击重置按钮,全部信息清零。

2)   符合编程规范的程序代码;

UserGUITest .java

package UserGUITest;

import java.awt.*;
import javax.swing.*;

public class UserGUITest {
	public static void main(String[] args)
	   {
	      EventQueue.invokeLater(() -> {
	         var frame = new UserGUITFrame();
	         frame.setTitle("UserGUITest ");
	         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	         frame.setVisible(true);
	      });
	   }

}

  UserGUITFrame.java

package UserGUITest;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
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;
import javax.swing.SwingConstants;
import javax.swing.border.Border;

public class UserGUITFrame extends JFrame{

	public static final int TEXTAREA_ROWS = 3;
	public static final int TEXTAREA_COLUMNS =7;
	
	public UserGUITFrame() {
	setSize(520,470);
	setLayout(new GridLayout(4,1));
	
	JPanel firstpanel=new JPanel();
	firstpanel.setLayout(new GridLayout(1,4));
	firstpanel.setLayout(null);
	JLabel label1 = new JLabel("姓名:");
	JTextField textField1 = new JTextField();
	JLabel label2 = new JLabel("地址:");
	JTextField textField2 = new JTextField();
	label1.setBounds(60,17,70,20);
	textField1.setBounds(110, 10, 130, 35);
	label2.setBounds(250,17,70,20);
	textField2.setBounds(300, 10, 130, 35);
	firstpanel.add(label1);
	firstpanel.add(textField1);
	firstpanel.add(label2);
	firstpanel.add(textField2);
	
	JPanel secondpanel=new JPanel();
	secondpanel.setLayout(new GridLayout(1,2));
	secondpanel.setLayout(null);
	JPanel secondpanel1=new JPanel(); 
	secondpanel1.setPreferredSize(new Dimension(160,70));
	ButtonGroup  group=new ButtonGroup();
	JRadioButton nan = new JRadioButton("男");
	JRadioButton nv = new JRadioButton("女");
	group.add(nan);
	group.add(nv);
	secondpanel1.add(nan);
	secondpanel1.add(nv);
	Border etched1 = BorderFactory.createEtchedBorder();
	Border title1 = BorderFactory.createTitledBorder(etched1,"性别");
	secondpanel1.setBorder(title1);
	
	JPanel secondpanel2=new JPanel();
	JCheckBox read = new JCheckBox("阅读");
	JCheckBox sing=new JCheckBox("唱歌");
	JCheckBox jump=new JCheckBox("跳舞");
	secondpanel2.add(read);
	secondpanel2.add(sing);
	secondpanel2.add(jump);
	Border etched2 = BorderFactory.createEtchedBorder();
	Border title2 = BorderFactory.createTitledBorder(etched2,"爱好");
	secondpanel2.setBorder(title2);
	secondpanel1.setBounds(60, 15, 160, 75);
	secondpanel2.setBounds(245, 15, 200, 75);
	secondpanel.add(secondpanel1);
	secondpanel.add(secondpanel2);
	
	JPanel thirdpanel=new JPanel();
	JButton qd= new	JButton("提交");
	JButton cz= new	JButton("重置");
	thirdpanel.add(qd);
	thirdpanel.add(cz);
	
	JTextArea textArea = new JTextArea("录入信息显示区!",TEXTAREA_ROWS, TEXTAREA_COLUMNS);
	JScrollPane fifthpanel = new JScrollPane(textArea);

	add(firstpanel);
	add(secondpanel);
	add(thirdpanel);
	add(fifthpanel);
	
    qd.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
        	String xingbie = "性别:";
            if (nan.isSelected()) {
            	xingbie += "男";
            }
            if (nv.isSelected()) {
            	xingbie += "女";
            }

            String aihao = "爱好:";
            if (read.isSelected()) {
            	aihao += "阅读";
            }
            if (sing.isSelected()) {
            	aihao += "唱歌";
            }
            if (jump.isSelected()) {
            	aihao += "跳舞";
            }
            textArea.setText(null);
            textArea.append("姓名:"+textField1.getText()+"   "+"地址:"+textField2.getText()+"   "+xingbie+"   "+aihao+'\n');

        }
    });
    cz.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            textField1.setText(null);
            textField2.setText(null);
            read.setSelected(false);
            sing.setSelected(false);
            jump.setSelected(false);
            group.clearSelection();
            textArea.setText("录入信息显示区!");
        }
    });
}
	
 }

  

3)   程序运行功能界面截图;

程序运行前:

 

 

 

 点击重置按钮后:

 

 

4)   结对过程描述,提供两人在讨论、细化和编程时的结对照片(非摆拍)。

 

 

 

实验总结:(10分)

  本周学习了Swing图形界面组件相关知识。关于组件的排版等问题,还有组件的定义。通过书本代码理解相关知识,理解边框布局、网格布局等布局管理器的使用。文本输入、对话框、选择组件、gui程序排错等等。本周的结对编程,在刚开始的时候各组件的显示位置一直出错,页面有些丑,后面和我的小伙伴一起讨论,一起看书,查阅相关方法的应用,最后还是把它写出来了。虽然过程曲折,但是结果还是很好,收获很大。

posted on 2019-12-01 23:16  201871010108-高文利  阅读(290)  评论(1编辑  收藏  举报