徐思201771010132《面向对象程序设计(java)》第十五周学习总结

一、理论知识部分

 Java程序的打包:程序编译完成后,程序员将.class文件压缩打包为.jar文件后,GUI界面程序就可以直接双击图标运行。.jar文件(Java归档)既可以包含类文件,也可以包含诸如图像和声音这些其它类型的文件。JAR文件是压缩的,它使用ZIP压缩格式。

jar命令格式: jar {ctxui} [vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ... 

 Jar命令选项:-c 创建一个新的或者空的存档文件并加入文件。   -C 暂时改变到指定的目录。  -e 在清单文件中创建一个条目。  -f 将JAR文件名指定为第二个命令行参数。  -i 为指定的JAR文件产生索引信息。  -m 将一个清单文件(manifest)添加到JAR文件中。  -M 不产生所有项的清单文件(manifest)。  -t 列出存档内容的列表。  -u 更新已存在的JAR文件。  -v 生成详细的输出结果。  -x 解压存档中的命名的(或所有的〕文件。 -0 只存储方式,不用ZIP压缩格式。

创建JAR文件:jar cf jar-file input-file(s)     c---want to Create a JAR file.

查看JAR文件:jar tf jar-file      t---want to view the Table of contents of the JAR file.

提取JAR文件:jar xf jar-file [archived-file(s)]     x---want to extract files from the JAR archive.

更新JAR文件:jar uf jar-file input-file(s)      u---want to update an existing JAR file.

索引JAR文件:jar i jar-file       i---index an existing JAR file.

每个JAR文件中包含一个用于描述归档特征的清单文件(manifest)。清单文件被命名为MANIFEST.MF,它 位于JAR文件的一个特殊的META-INF子目录中。

清单文件的节与节之间用空行分开,最后一行必须以 换行符结束。否则,清单文件将无法被正确地读取。

Java中,应用程序使用的类通常需要一些相关的数据文件,这些文件称为资源(Resource)。图像和声音文件。 带有消息字符串和按钮标签的文本文件。 二进制数据文件。

类加载器知道如何搜索类文件,直到在类路径、 存档文件或Web服务器上找到为止。利用资源机制对于非类文件也可以进行同样操作,具体步骤如下:获得资源的Class对象。如果资源是一个图像或声音文件,那么就需要调用getresource(filename)获得资源的URL位置,然后利用getImage或getAudioClip方法进行读取。如果资源是文本或二进制文件,那么就可以使用 getResouceAsStream方法读取文件中的数据。

资源文件可以与类文件放在同一个目录中,也可以将资源文件放在其它子目录中。具体有以下两种方式:相对资源名:如data/text/about.txt ,它会被解释为相对于加载这个资源的类所在的包。绝对资源名:如/corejava/title.txt。

将Java包密封(Seal)可保证不会有其它的类加入到其中。如果在代码中使用了包可见的类、方法和字段,就可能希望密封包。如果不密封,其它类就有可能放在这个包中,进而访问包可见的特性。

要想密封一个包,需要将包中的所有类放到一个JAR文件。在默认情况下,JAR文件中的包是没有密封的。

要想密封JAR文件中的所有包,可以在清单文件的主节中加入下面一行:Sealed: true。要想密封单独的包,可以通过在JAR文件的清单文件的清单中增加一节,如:Name: com/mycompany/util/ Sealed: true Name: com/mycompany/misc/ Sealed: false

应用首选项的存储:一般有两种方法:将配置信息存储在属性文件中;将配置信息存储在中心知识库。

属性映射常被用来存放配置信息,属性映射是一种存储键/值对的数据结构。属性映射有三个特性:键和值都是字符串;键/值对易于写入文件或从文件读出; 用二级表存放默认值。

Properties类能够简化读取和保存配置信息的过程,但使用属性文件存在下列不足:配置文件无统一存放位置;无标准配置文件命名规则,当用户安装多个 Java应用程序时,会增加配置文件名冲突可能性。

二、实验部分

1、实验目的与要求

(1) 掌握Java应用程序的打包操作;

(2) 了解应用程序存储配置信息的两种方法;

(3) 掌握基于JNLP协议的java Web Start应用程序的发布方法;

(5) 掌握Java GUI 编程技术。

2、实验内容和步骤

实验1: 导入第13章示例程序,测试程序并进行代码注释。

测试程序1

l 在elipse IDE中调试运行教材585页程序13-1,结合程序运行结果理解程序;

l 将所生成的JAR文件移到另外一个不同的目录中,再运行该归档文件,以便确认程序是从JAR文件中,而不是从当前目录中读取的资源。

l 掌握创建JAR文件的方法;

package resource;

import java.awt.*;
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;

/**
 * @version 1.41 2015-06-12
 * @author Cay Horstmann
 */
public class ResourceTest {
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            JFrame frame = new ResourceTestFrame();
            frame.setTitle("ResourceTest");// 设置标题
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置用户在窗体上发起 "close" 时默认执行的操作。
            frame.setVisible(true);// 设置窗口可见
        });
    }
}

/**
 * A frame that loads image and text resources.
 */
class ResourceTestFrame extends JFrame {
    private static final int DEFAULT_WIDTH = 300;
    private static final int DEFAULT_HEIGHT = 300;

    public ResourceTestFrame() {
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);// 调整组件大小
        URL aboutURL = getClass().getResource("about.gif");// 利用about.gif图像文件制作图标
        Image img = new ImageIcon(aboutURL).getImage();
        setIconImage(img);// 设置要作为窗口图标显示的图像

        JTextArea textArea = new JTextArea();
        InputStream stream = getClass().getResourceAsStream("about.txt");// 读取about.txt文件
        try (Scanner in = new Scanner(stream, "UTF-8")) {
            while (in.hasNext())
                textArea.append(in.nextLine() + "\n");
        }
        add(textArea);
    }
}

测试程序2

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

l 了解Properties类中常用的方法;

package properties;

import java.awt.EventQueue;
import java.awt.event.*;
import java.io.*;
import java.util.Properties;

import javax.swing.*;

/**
 * A program to test properties. The program remembers the frame position, size,
 * and title.
 * 
 * @version 1.01 2015-06-16
 * @author Cay Horstmann
 */
public class PropertiesTest {
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            PropertiesFrame frame = new PropertiesFrame();
            frame.setVisible(true);
        });
    }
}

/**
 * A frame that restores position and size from a properties file and updates
 * the properties upon exit.
 */
class PropertiesFrame extends JFrame {
    private static final int DEFAULT_WIDTH = 300;
    private static final int DEFAULT_HEIGHT = 200;

    private File propertiesFile;
    private Properties settings;

    public PropertiesFrame() {
        // get position, size, title from properties

        String userDir = System.getProperty("user.home");// 获取指定键指示的系统属性
        File propertiesDir = new File(userDir, ".corejava");
        if (!propertiesDir.exists())
            propertiesDir.mkdir();
        propertiesFile = new File(propertiesDir, "program.properties");

        Properties defaultSettings = new Properties();// 创建一个无默认值的空属性列表。
        defaultSettings.setProperty("left", "0");
        defaultSettings.setProperty("top", "0");
        defaultSettings.setProperty("width", "" + DEFAULT_WIDTH);
        defaultSettings.setProperty("height", "" + DEFAULT_HEIGHT);
        defaultSettings.setProperty("title", "");

        settings = new Properties(defaultSettings);

        if (propertiesFile.exists())
            try (InputStream in = new FileInputStream(propertiesFile)) {
                settings.load(in);// 从输入流中读取属性列表(键和元素对)
            } catch (IOException ex) {
                ex.printStackTrace();
            }

        int left = Integer.parseInt(settings.getProperty("left"));
        int top = Integer.parseInt(settings.getProperty("top"));
        int width = Integer.parseInt(settings.getProperty("width"));
        int height = Integer.parseInt(settings.getProperty("height"));
        setBounds(left, top, width, height);// 移动组件并调整其大小

        // if no title given, ask user

        String title = settings.getProperty("title");
        if (title.equals(""))
            title = JOptionPane.showInputDialog("Please supply a frame title:");
        if (title == null)
            title = "";
        setTitle(title);// 将此窗体的标题设置为指定的字符串

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent event) {
                settings.setProperty("left", "" + getX());// 返回组件原点的当前 x 坐标
                settings.setProperty("top", "" + getY());// 返回组件原点的当前 y 坐标
                settings.setProperty("width", "" + getWidth());// 返回组件的当前宽度
                settings.setProperty("height", "" + getHeight());// 返回组件的当前高度
                settings.setProperty("title", getTitle());// 获得窗体的标题
                try (OutputStream out = new FileOutputStream(propertiesFile)) {
                    settings.store(out, "Program Properties");
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
                System.exit(0);
            }
        });
    }
}

测试程序3

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

l 了解Preferences类中常用的方法;

package preferences;

import java.awt.*;
import java.io.*;
import java.util.prefs.*;

import javax.swing.*;
import javax.swing.filechooser.*;

/**
 * A program to test preference settings. The program remembers the frame
 * position, size, and title.
 * 
 * @version 1.03 2015-06-12
 * @author Cay Horstmann
 */
public class PreferencesTest {
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            PreferencesFrame frame = new PreferencesFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置用户在窗体上发起 "close" 时默认执行的操作
            frame.setVisible(true);//显示窗口
        });
    }
}

/**
 * A frame that restores position and size from user preferences and updates the
 * preferences upon exit.
 */
class PreferencesFrame extends JFrame {
    private static final int DEFAULT_WIDTH = 300;
    private static final int DEFAULT_HEIGHT = 200;
    private Preferences root = Preferences.userRoot();// 返回调用用户的根首选项节点
    private Preferences node = root.node("/com/horstmann/corejava");

    public PreferencesFrame() {
        // get position, size, title from preferences

        int left = node.getInt("left", 0);
        int top = node.getInt("top", 0);
        int width = node.getInt("width", DEFAULT_WIDTH);
        int height = node.getInt("height", DEFAULT_HEIGHT);
        setBounds(left, top, width, height);// 移动组件并调整其大小

        // if no title given, ask user

        String title = node.get("title", "");// 返回与此首选项节点中指定键相关联的值
        if (title.equals(""))
            title = JOptionPane.showInputDialog("Please supply a frame title:");// 显示请求用户输入的问题消息对话框
        if (title == null)
            title = "";
        setTitle(title);// 将此窗体的标题设置为指定的字符串

        // set up file chooser that shows XML files

        final JFileChooser chooser = new JFileChooser();// 构造一个指向用户默认目录的 JFileChooser
        chooser.setCurrentDirectory(new File("."));// 设置当前目录
        chooser.setFileFilter(new FileNameExtensionFilter("XML files", "xml"));// 设置当前文件过滤器

        // set up menus

        JMenuBar menuBar = new JMenuBar();// 创建新的菜单栏
        setJMenuBar(menuBar);// 设置此窗体的菜单栏
        JMenu menu = new JMenu("File");// 构造一个新 JMenu,用提供的字符串作为其文本
        menuBar.add(menu);

        JMenuItem exportItem = new JMenuItem("Export preferences");// 创建带有指定文本的 JMenuItem
        menu.add(exportItem);
        exportItem.addActionListener(event -> {
            if (chooser.showSaveDialog(PreferencesFrame.this) == JFileChooser.APPROVE_OPTION) {
                try {
                    savePreferences();
                    OutputStream out = new FileOutputStream(chooser.getSelectedFile());
                    node.exportSubtree(out);
                    out.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        JMenuItem importItem = new JMenuItem("Import preferences");
        menu.add(importItem);
        importItem.addActionListener(event -> {
            if (chooser.showOpenDialog(PreferencesFrame.this) == JFileChooser.APPROVE_OPTION) {
                try {
                    InputStream in = new FileInputStream(chooser.getSelectedFile());
                    Preferences.importPreferences(in);
                    in.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        JMenuItem exitItem = new JMenuItem("Exit");
        menu.add(exitItem);
        exitItem.addActionListener(event -> {
            savePreferences();
            System.exit(0);
        });
    }

    public void savePreferences() {
        node.putInt("left", getX());// 返回组件原点的当前 x 坐标
        node.putInt("top", getY());// 返回组件原点的当前 y 坐标
        node.putInt("width", getWidth());// 返回组件的当前宽度
        node.putInt("height", getHeight());// 返回组件的当前高度
        node.put("title", getTitle());// 返回组件的当前高度
    }
}

 

测试程序4

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

l 掌握基于JNLP协议的java Web Start应用程序的发布方法。

package webstart;

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

/**
 * A calculator with a calculation history that can be deployed as a Java Web
 * Start application.
 * 
 * @version 1.04 2015-06-12
 * @author Cay Horstmann
 */
public class Calculator {
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            CalculatorFrame frame = new CalculatorFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        });
    }
}
package webstart;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.URL;

import javax.jnlp.BasicService;
import javax.jnlp.FileContents;
import javax.jnlp.FileOpenService;
import javax.jnlp.FileSaveService;
import javax.jnlp.PersistenceService;
import javax.jnlp.ServiceManager;
import javax.jnlp.UnavailableServiceException;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;

/**
 * A frame with a calculator panel and a menu to load and save the calculator
 * history.
 */
public class CalculatorFrame extends JFrame {
   private CalculatorPanel panel;

   public CalculatorFrame()
   {
      setTitle();
      panel = new CalculatorPanel();
      add(panel);

      JMenu fileMenu = new JMenu("File");
      JMenuBar menuBar = new JMenuBar();
      menuBar.add(fileMenu);
      setJMenuBar(menuBar);//设置此窗体的菜单栏

      JMenuItem openItem = fileMenu.add("Open");
      openItem.addActionListener(event -> open());
      JMenuItem saveItem = fileMenu.add("Save");
      saveItem.addActionListener(event -> save());
      
      pack();//调整此窗口的大小
   }

   /**
    * Gets the title from the persistent store or asks the user for the title if there is no prior
    * entry.
    */
   public void setTitle()
   {
      try
      {
         String title = null;

         BasicService basic = (BasicService) ServiceManager.lookup("javax.jnlp.BasicService");
         URL codeBase = basic.getCodeBase();

         PersistenceService service = (PersistenceService) ServiceManager
               .lookup("javax.jnlp.PersistenceService");
         URL key = new URL(codeBase, "title");

         try
         {
            FileContents contents = service.get(key);
            InputStream in = contents.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            title = reader.readLine();
         }
         catch (FileNotFoundException e)
         {
            title = JOptionPane.showInputDialog("Please supply a frame title:");
            if (title == null) return;

            service.create(key, 100);
            FileContents contents = service.get(key);
            OutputStream out = contents.getOutputStream(true);
            PrintStream printOut = new PrintStream(out);
            printOut.print(title);
         }
         setTitle(title);
      }
      catch (UnavailableServiceException | IOException e)
      {
         JOptionPane.showMessageDialog(this, e);
      }
   }

   /**
    * Opens a history file and updates the display.
    */
   public void open()
   {
      try
      {
         FileOpenService service = (FileOpenService) ServiceManager
               .lookup("javax.jnlp.FileOpenService");
         FileContents contents = service.openFileDialog(".", new String[] { "txt" });

         JOptionPane.showMessageDialog(this, contents.getName());
         if (contents != null)
         {
            InputStream in = contents.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            String line;
            while ((line = reader.readLine()) != null)
            {
               panel.append(line);
               panel.append("\n");
            }
         }
      }
      catch (UnavailableServiceException e)
      {
         JOptionPane.showMessageDialog(this, e);
      }
      catch (IOException e)
      {
         JOptionPane.showMessageDialog(this, e);
      }
   }

   /**
    * Saves the calculator history to a file.
    */
   public void save()
   {
      try
      {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         PrintStream printOut = new PrintStream(out);
         printOut.print(panel.getText());
         InputStream data = new ByteArrayInputStream(out.toByteArray());
         FileSaveService service = (FileSaveService) ServiceManager
               .lookup("javax.jnlp.FileSaveService");
         service.saveFileDialog(".", new String[] { "txt" }, data, "calc.txt");
      }
      catch (UnavailableServiceException e)
      {
         JOptionPane.showMessageDialog(this, e);
      }
      catch (IOException e)
      {
         JOptionPane.showMessageDialog(this, e);
      }
   }
}
package webstart;

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

/**
 * A panel with calculator buttons and a result display.
 */
public class CalculatorPanel extends JPanel {
    private JTextArea display;
    private JPanel panel;
    private double result;
    private String lastCommand;
    private boolean start;

    /**
     * Lays out the panel.
     */
    public CalculatorPanel() {
        setLayout(new BorderLayout());// 构造一个组件之间没有间距的新边框布局

        result = 0;
        lastCommand = "=";
        start = true;

        // add the display

        display = new JTextArea(10, 20);// 构造具有10行10列的新的空 TextArea

        add(new JScrollPane(display), BorderLayout.NORTH);

        ActionListener insert = new InsertAction();
        ActionListener command = new CommandAction();

        // add the buttons in a 4 x 4 grid

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

    /**
     * Gets the history text.
     * 
     * @return the calculator history
     */
    public String getText() {
        return display.getText();
    }

    /**
     * Appends a string to the history text.
     * 
     * @param s the string to append
     */
    public void append(String s) {
        display.append(s);
    }

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

    /**
     * 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();
            start = false;
            display.append(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.append(command);
                    start = false;
                } else
                    lastCommand = command;
            } else {
                try {
                    int lines = display.getLineCount();
                    int lineStart = display.getLineStartOffset(lines - 1);
                    int lineEnd = display.getLineEndOffset(lines - 1);
                    String value = display.getText(lineStart, lineEnd - lineStart);
                    display.append(" ");
                    display.append(command);
                    calculate(Double.parseDouble(value));
                    if (command.equals("="))
                        display.append("\n" + result);
                    lastCommand = command;
                    display.append("\n");
                    start = true;
                } catch (BadLocationException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 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;
    }
}

实验2GUI综合编程练习

按实验十四分组名单,组内讨论完成以下编程任务:

练习1:采用GUI界面设计以下程序,并进行部署与发布:

l 编制一个程序,将身份证号.txt 中的信息读入到内存中;

l 按姓名字典序输出人员信息;

l 查询最大年龄的人员信息;

l 查询最小年龄人员信息;

l 输入你的年龄,查询身份证号.txt中年龄与你最近人的姓名、身份证号、年龄、性别和出生地;

l 查询人员中是否有你的同乡。

l 输入身份证信息,查询所提供身份证号的人员信息,要求输入一个身份证数字时,查询界面就显示满足查询条件的查询结果,且随着输入的数字的增多,查询匹配的范围逐渐缩小。

package ID;

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

/**
 * @version 1.34 2015-06-12
 * @author Cay Horstmann
 */
public class button {
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            JFrame frame = new Main();
            frame.setTitle("身份证");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        });
    }
}
package ID;

public class Person implements Comparable<Person> {
    private String name;
    private String ID;
    private int age;
    private String sex;
    private String birthplace;

    public String getname() {
        return name;
    }

    public void setname(String name) {
        this.name = name;
    }

    public String getID() {
        return ID;
    }

    public void setID(String ID) {
        this.ID = ID;
    }

    public int getage() {

        return age;
    }

    public void setage(int age) {

        this.age = age;
    }

    public String getsex() {
        return sex;
    }

    public void setsex(String sex) {
        this.sex = sex;
    }

    public String getbirthplace() {
        return birthplace;
    }

    public void setbirthplace(String birthplace) {
        this.birthplace = birthplace;
    }

    public int compareTo(Person o) {
        return this.name.compareTo(o.getname());
    }

    public String toString() {
        return name + "\t" + sex + "\t" + age + "\t" + ID + "\t" + birthplace + "\n";
    }
}
package ID;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Main extends JFrame {
    private static ArrayList<Person> personlist;
    private static ArrayList<Person> list;
    private JPanel panel;
    private JPanel buttonPanel;
    private static final int DEFAULT_WIDTH = 600;
    private static final int DEFAULT_HEIGHT = 300;

    public Main() {

        personlist = new ArrayList<>();
        Scanner scanner = new Scanner(System.in);
        File file = new File("身份证号.txt");
        try {
            FileInputStream fis = new FileInputStream(file);
            BufferedReader in = new BufferedReader(new InputStreamReader(fis));
            String temp = null;
            while ((temp = in.readLine()) != null) {

                Scanner linescanner = new Scanner(temp);

                linescanner.useDelimiter(" ");
                String name = linescanner.next();
                String ID = linescanner.next();
                String sex = linescanner.next();
                String age = linescanner.next();
                String place = linescanner.nextLine();
                Person Person = new Person();
                Person.setname(name);
                Person.setID(ID);
                Person.setsex(sex);
                int a = Integer.parseInt(age);
                Person.setage(a);
                Person.setbirthplace(place);
                personlist.add(Person);

            }
        } catch (FileNotFoundException e) {
            System.out.println("查找不到信息");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("信息读取有误");
            e.printStackTrace();
        }
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        JTextArea jt = new JTextArea();
        panel.add(jt);
        add(panel, BorderLayout.CENTER);
        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new GridLayout(1, 7));
        JButton jButton = new JButton("字典排序");
        JButton jButton1 = new JButton("年龄最大和年龄最小");
        JLabel lab = new JLabel("你的老乡");
        JTextField jt1 = new JTextField();
        JLabel lab1 = new JLabel("查找年龄相近的:");
        JTextField jt2 = new JTextField();
        JLabel lab2 = new JLabel("输入你的身份证号码:");

        JTextField jt3 = new JTextField();
        JButton jButton2 = new JButton("退出");
        jButton.setBounds(110, 90, 40, 50);
        jButton1.setBounds(110, 90, 40, 50);
        jt1.setBounds(110, 90, 40, 50);
        jt2.setBounds(110, 90, 40, 50);
        jt3.setBounds(110, 90, 40, 50);
        jButton2.setBounds(110, 90, 40, 50);
        jButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Collections.sort(personlist);
                jt.setText(personlist.toString());
            }
        });
        jButton1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                int max = 0, min = 100;
                int j, k1 = 0, k2 = 0;
                for (int i = 1; i < personlist.size(); i++) {
                    j = personlist.get(i).getage();
                    if (j > max) {
                        max = j;
                        k1 = i;
                    }
                    if (j < min) {
                        min = j;
                        k2 = i;
                    }

                }
                jt.setText("年龄最大:" + personlist.get(k1) + "年龄最小:" + personlist.get(k2));
            }
        });
        jButton2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
                System.exit(0);
            }
        });
        jt1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String find = jt1.getText();
                String text = "";
                String place = find.substring(0, 3);
                for (int i = 0; i < personlist.size(); i++) {
                    if (personlist.get(i).getbirthplace().substring(1, 4).equals(place)) {
                        text += "\n" + personlist.get(i);
                        jt.setText("老乡:" + text);
                    }
                }
            }
        });
        jt2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String yourage = jt2.getText();
                int a = Integer.parseInt(yourage);
                int near = agenear(a);
                int value = a - personlist.get(near).getage();
                jt.setText("年龄相近:" + personlist.get(near));
            }
        });
        jt3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                list = new ArrayList<>();
                Collections.sort(personlist);
                String key = jt3.getText();
                for (int i = 1; i < personlist.size(); i++) {
                    if (personlist.get(i).getID().contains(key)) {
                        list.add(personlist.get(i));
                        jt.setText("你可能是:\n" + list);
                    }
                }
            }
        });
        buttonPanel.add(jButton);
        buttonPanel.add(jButton1);
        buttonPanel.add(lab);
        buttonPanel.add(jt1);
        buttonPanel.add(lab1);
        buttonPanel.add(jt2);
        buttonPanel.add(lab2);
        buttonPanel.add(jt3);
        buttonPanel.add(jButton2);
        add(buttonPanel, BorderLayout.SOUTH);
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }

    public static int agenear(int age) {
        int min = 53, value = 0, k = 0;
        for (int i = 0; i < personlist.size(); i++) {
            value = personlist.get(i).getage() - age;
            if (value < 0)
                value = -value;
            if (value < min) {
                min = value;
                k = i;
            }
        }
        return k;
    }

}

练习2:采用GUI界面设计以下程序,并进行部署与发布

l 编写一个计算器类,可以完成加、减、乘、除的操作

l 利用计算机类,设计一个小学生100以内数的四则运算练习程序,由计算机随机产生10道加减乘除练习题,学生输入答案,由程序检查答案是否正确,每道题正确计10分,错误不计分,10道题测试结束后给出测试总分;

l 将程序中测试练习题及学生答题结果输出到文件,文件名为test.txt。

package math;

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Toolkit;

import javax.swing.JFrame;

public class math {

    public static void main(String args[]) {
        Toolkit t = Toolkit.getDefaultToolkit();
        Dimension s = t.getScreenSize();
        EventQueue.invokeLater(() -> {
            JFrame frame = new main();
            frame.setBounds(0, 0, (int) s.getWidth() / 2, (int) s.getHeight() / 2);
            frame.setTitle("算术测试");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        });
    }

}
package math;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Collections;
import java.util.Scanner;

import javax.swing.*;

import java.math.*;

public class main extends JFrame {

    private String[] c = new String[10];
    private String[] c1 = new String[10];
    private int[] list = new int[10];
    int i = 0, i1 = 0, sum = 0;

    private PrintWriter out = null;
    private JTextArea text, text1;
    private int counter;

    public main() {
        JPanel Panel = new JPanel();
        Panel.setLayout(null);
        JLabel JLabel1 = new JLabel("");
        JLabel1.setBounds(500, 800, 400, 30);
        JLabel1.setFont(new Font("Courier", Font.PLAIN, 20));
        JButton Button = new JButton("生成题目");
        Button.setBounds(50, 150, 150, 50);
        Button.setFont(new Font("Courier", Font.PLAIN, 20));
        Button.addActionListener(new Action());
        JButton Button2 = new JButton("确定答案");
        Button2.setBounds(300, 150, 150, 50);
        Button2.setFont(new Font("Courier", Font.PLAIN, 20));
        Button2.addActionListener(new Action1());
        JButton Button3 = new JButton("读出文件");
        Button3.setBounds(500, 150, 150, 50);
        Button3.setFont(new Font("Courier", Font.PLAIN, 20));
        Button3.addActionListener(new Action2());
        text = new JTextArea(30, 80);
        text.setBounds(30, 50, 200, 50);
        text.setFont(new Font("Courier", Font.PLAIN, 30));
        text1 = new JTextArea(30, 80);
        text1.setBounds(270, 50, 200, 50);
        text1.setFont(new Font("Courier", Font.PLAIN, 30));

        Panel.add(text);
        Panel.add(text1);

        Panel.add(Button);
        Panel.add(Button2);
        Panel.add(Button3);
        Panel.add(JLabel1);
        add(Panel);

    }

    private class Action implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            text1.setText("");
            if (i <= 10) {

                int a = (int) Math.round(Math.random() * 100);
                int b = (int) Math.round(Math.random() * 100);
                int m = (int) Math.round(Math.random() * 3);
                switch (m) {
                case 0:
                    while (a % b != 0) {
                        a = (int) Math.round(Math.random() * 100);
                    }
                    while (b == 0) {
                        b = (int) Math.round(Math.random() * 100);
                    }
                    c[i] = (i + ":" + a + "/" + b + "=");
                    list[i] = Math.floorDiv(a, b);
                    text.setText(i + ":" + a + "/" + b + "=");
                    i++;

                    break;
                case 1:
                    c[i] = (i + ":" + a + "*" + b + "=");
                    list[i] = Math.multiplyExact(a, b);
                    text.setText(i + ":" + a + "*" + b + "=");
                    i++;
                    break;
                case 2:
                    c[i] = (i + ":" + a + "+" + b + "=");
                    list[i] = Math.addExact(a, b);
                    text.setText(i + ":" + a + "+" + b + "=");
                    i++;
                    break;
                case 3:
                    while (a < b) {
                        b = (int) Math.round(Math.random() * 100);
                        a = (int) Math.round(Math.random() * 100);
                    }
                    c[i] = (i + ":" + a + "-" + b + "=");
                    text.setText(i + ":" + a + "-" + b + "=");
                    list[i] = Math.subtractExact(a, b);
                    i++;

                    break;
                }
            }
        }
    }

    private class Action1 implements ActionListener {
        public void actionPerformed(ActionEvent event) {

            if (i < 10) {
                text.setText(null);
                String z = text1.getText().toString().trim();
                int a = Integer.parseInt(z);
                if (text1.getText() != "") {
                    if (list[i1] == a)
                        sum += 10;
                }

                c1[i1] = z;

                i1++;

            }
        }

    }

    private class Action2 implements ActionListener {
        public void actionPerformed(ActionEvent event) {

            try {
                out = new PrintWriter("text.txt");
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            for (int counter = 0; counter < 10; counter++) {
                out.println(c[counter] + c1[counter]);
            }
            out.println("成绩" + sum);
            out.close();

        }

    }
}

三、实验总结

 通过这次实验,我了解了JAR文件的创建方法,Properties类中常用的方法。这次编程难度较大,很多是借鉴的其他同学的。

posted @ 2018-12-09 16:01  徐思  阅读(137)  评论(0编辑  收藏  举报