zoukankan      html  css  js  c++  java
  • 徐思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() + "
    ");
            }
            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("
    ");
                }
             }
          }
          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("
    " + result);
                        lastCommand = command;
                        display.append("
    ");
                        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 + "	" + sex + "	" + age + "	" + ID + "	" + birthplace + "
    ";
        }
    }
    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 += "
    " + 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("你可能是:
    " + 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类中常用的方法。这次编程难度较大,很多是借鉴的其他同学的。

  • 相关阅读:
    mysql_wp_replication_tutorial
    Procedure execution failed 2013
    [Err] 1136
    innodb_flush_log_at_trx_commit和sync_binlog 参数说明
    mysql没有oracle 那样一次性把data buffer 数据写入磁盘
    Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field
    MyEclipse之Widget is disposed
    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Query was empty
    An internal error occurred during: "Building workspace". GC overhead limit exceeded
    Oracle 内部复制文档解读
  • 原文地址:https://www.cnblogs.com/sisi-713/p/10078412.html
Copyright © 2011-2022 走看看