徐思201771010132《面向對象程序設計(java)》第十五週學習總結

1、理論知識部分java

 Java程序的打包:程序編譯完成後,程序員將.class文件壓縮打包爲.jar文件後,GUI界面程序就能夠直接雙擊圖標運行。.jar文件(Java歸檔)既能夠包含類文件,也能夠包含諸如圖像和聲音這些其它類型的文件。JAR文件是壓縮的,它使用ZIP壓縮格式。node

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壓縮格式。web

建立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.app

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

每一個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應用程序時,會增長配置文件名衝突可能性。

2、實驗部分

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

        }

    }
}

3、實驗總結

 經過此次實驗,我瞭解了JAR文件的建立方法,Properties類中經常使用的方法。此次編程難度較大,不少是借鑑的其餘同窗的。

相關文章
相關標籤/搜索