1. 程式人生 > >201771010113 李婷華 《面向物件程式設計(java)》第十五週總結

201771010113 李婷華 《面向物件程式設計(java)》第十五週總結

一.理論知識部分

JAR檔案

Java程式的打包:程式編譯完成後,程式設計師將.class檔案壓縮打包為.jar檔案後,GUI介面程式就可以直接雙擊圖示執行。

.jar檔案(Java歸檔)既可以包含類檔案,也可以包含諸如影象和聲音這些其它型別的檔案。

JAR檔案是壓縮的,它使用ZIP壓縮格式。

jar命令

jar命令格式:

jar{ctxui}[vfm0Me][jar-file][manifest-file][entry-point][-Cdir]files...

Jar命令選項:

–-c建立一個新的或者空的存檔檔案並加入檔案。

–-C暫時改變到指定的目錄

–-e在清單檔案中建立一個條目

–-f將JAR檔名指定為第二個命令列引數

–-i為指定的JAR檔案產生索引資訊

–-m將一個清單檔案(manifest)新增到JAR檔案中

–-M不產生所有項的清單檔案(manifest)

–-t列出存檔內容的列表

–-u更新已存在的JAR檔案

–-v生成詳細的輸出結果

–-x解壓存檔中的命名的(或所有的〕檔案

–-0只儲存方式,不用ZIP壓縮格式

(1)建立JAR檔案

jarcfjar-fileinput-file(s)

c-wanttoCreateaJARfile.

eg:1)jarcfMenuTest.jar*.class*.gif

f-wanttheoutputtogotoafileratherthantostdout.

2)jarcvfMenuTest.jar*.class*.gif

v-Producesverboseoutputtostdout.

3)jarcvfMenuTest.jar*

*-createallcontentsincurrentdirectory.

4)jarcv0fMenuTest.jar*

0-don'twanttheJARfiletobecompressed.

(2)檢視JAR檔案

jartfjar-file

t-wanttoviewtheTableofcontentsoftheJARfile.

eg:1)jartvfMenuTest.jar

v-Producesverboseoutputtostdout.

(3)提取JAR檔案

jarxfjar-file[archived-file(s)]

x-wanttoextractfilesfromtheJARarchive.

eg:1)jarxfMenuTest.jarcopy.gif(僅提取檔案copy.gif)

2)jarxfMenuTest.jaralex/copy.gif(僅提取目錄alex下的檔案copy.gif)

3)jarxfMenuTest.jar(提取該JAR中的所有檔案或目錄)

(4)更新JAR檔案

jarufjar-fileinput-file(s)

u-wanttoupdateanexistingJARfile.

eg:1)jarufMenuTest.jarcopy.gif

(5)索引JAR檔案

jarijar-file

i-indexanexistingJARfile.

eg:1)jariMenuTest.jar

清單檔案

每個JAR檔案中包含一個用於描述歸檔特徵的清單檔案(manifest)。清單檔案被命名MANIFEST.MF,它位於JAR檔案的一個特殊的META-INF子目錄中。

最小的符合標準的清單檔案是很簡單的:

Manifest-Version:1.0

複雜的清單檔案包含多個條目,這些條目被分成多個節。第一節被稱為主節,作用於整個JAR檔案。隨後的條目用來指定已命名條目的屬性,可以是檔案、包或者URL。

清單檔案的節與節之間用空行分開,最後一行必須以換行符結束。否則,清單檔案將無法被正確地讀取。

建立一個包含清單的JAR檔案,應該執行:

jarcfmMyArchive.jarmanifest.mfcom/*.class

–要更新一個已有JAR檔案的清單,則需要將增加的部分放置到一個文字檔案中,執行如下命令:

jarufmMyArchive.jarmanifest-additions.mf

執行JAR檔案

使用者可以通過下面的命令來啟動應用程式:

java–jarMyProgram.jar

視窗作業系統,可通過雙擊JAR檔案圖示來啟動應用程式。

資源

Java中,應用程式使用的類通常需要一些相關的資料檔案,這些檔案稱為資源(Resource)。

–影象和聲音檔案。

–帶有訊息字串和按鈕標籤的文字檔案。

–二進位制資料檔案,如:描述地圖佈局的檔案。

類載入器知道如何搜尋類檔案,直到在類路徑、存檔檔案或Web伺服器上找到為止。

利用資源機制對於非類檔案也可以進行同樣操作,具體步驟如下:

–獲得資源的Class物件。

–如果資源是一個影象或聲音檔案,那麼就需要呼叫getresource(filename)獲得資源的URL位置,然後利用getImage或getAudioClip方法進行讀取。

–如果資源是文字或二進位制檔案,那麼就可以使用getResouceAsStream方法讀取檔案中的資料。

資原始檔可以與類檔案放在同一個目錄中,也可以將資原始檔放在其它子目錄中。具體有以下兩種方式:

–相對資源名:如data/text/about.txt

它會被解釋為相對於載入這個資源的類所在的包。

–絕對資源名:如/corejava/title.txt

ResourceTest.java程式演示了資源載入的過程。

編譯、建立JAR檔案和執行這個程式的命令如下:

–javacResourceTest.java

–jarcvfmResourceTest.jarResourceTest.mf

*.class*.gif*.txt

–java–jarResourceTest.jar

Eclipse匯出JAR檔案

工程沒有引用外部jar包時,直接匯出。

當工程引用了其他的外部jar時,由於Eclipse不支援同時匯出外部jar包的功能,匯出過程比較複雜。(*)

包密封

將Java包密封(Seal)可保證不會有其它的類加入到其中。如果在程式碼中使用了包可見的類、方法和欄位,就可能希望密封包。如果不密封,其它類就有可能放在這個包中,進而訪問包可見的特性。

–例如,如果密封了com.mycompany.util包,就不能用下面的語句將密封包之外的類加入包內:

–Packagecom.mycompany.util;

要想密封一個包,需要將包中的所有類放到一個JAR檔案。在預設情況下,JAR檔案中的包是沒有密封的。

JavaWebStart

JavaWebStart是一個用Java編寫的應用程式,它是Sun公司推出的一項在Internet釋出應用程式的技術;

通過JavaWebStart可以使一個應用程式很容易地通過web部署在各個平臺上,包Windows,Linux,Solaris等。

JavaWebStart部署應用程式

JavaWebStart的工作過程是基於JavaNetwork LaunchProtocol(JNLP)協議的。一個字尾為JNLP的檔案包含了應用程式的說明以及如何啟動這個應用程式的所有資訊,JavaWebStart技術部署應用程式的關鍵就在於JNLP檔案的編寫以及釋出。

二.實驗部分

1、實驗目的與要求

(1) 掌握Java應用程式的打包操作;

(2) 瞭解應用程式儲存配置資訊的兩種方法;

(3) 掌握基於JNLP協議的java Web Start應用程式的釋出方法;

(5) 掌握Java GUI 程式設計技術。

2、實驗內容和步驟

實驗1: 匯入第13章示例程式,測試程式並進行程式碼註釋。

測試程式1

elipse IDE中除錯執行教材585頁程式13-1,結合程式執行結果理解程式;

將所生成的JAR檔案移到另外一個不同的目錄中,再執行該歸檔檔案,以便確認程式是從JAR檔案中,而不是從當前目錄中讀取的資源。

掌握建立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);
         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");//返回此 Object 的執行時類。查詢帶有給定名稱的資源
      Image img = new ImageIcon(aboutURL).getImage();//根據指定的 URL 建立一個 ImageIcon
      setIconImage(img);//設定要作為此視窗圖示顯示的影象

      JTextArea textArea = new JTextArea();//JTextArea 是一個顯示純文字的多行區域
      InputStream stream = getClass().getResourceAsStream("about.txt");
      try (Scanner in = new Scanner(stream, "UTF-8"))
      {
         while (in.hasNext())
            textArea.append(in.nextLine() + "\n");//將給定文字追加到文件結尾
      }
      add(textArea);
   }
}
ResourceTest

結果:

命令列方式:

測試程式2

elipse IDE中除錯執行教材583-584程式13-2,結合程式執行結果理解程式;

瞭解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");//呼叫 Hashtable 的方法 put。返回值是 Hashtable 呼叫 put 的結果。
      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());
            settings.setProperty("top", "" + getY());
            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);
         }
      });
   }
}
PropertiesTest

結果:

測試程式3

elipse IDE中除錯執行教材593-594程式13-3,結合程式執行結果理解程式;

瞭解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);
         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 值
      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();
      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");
      menuBar.add(menu);

      JMenuItem exportItem = new JMenuItem("Export preferences");
      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());
      node.putInt("top", getY());
      node.putInt("width", getWidth());
      node.putInt("height", getHeight());
      node.put("title", getTitle());      
   }
}
PreferencesTest

結果:

測試程式4

elipse IDE中除錯執行教材619-622程式13-6,結合程式執行結果理解程式;

掌握基於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);
         });
   }
}
Calculator
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.MalformedURLException;
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;

import com.sun.jnlp.FileSaveServiceImpl;
import com.sun.jnlp.FileSaveServiceNSBImpl;

//import com.sun.jnlp.BasicServiceImpl;

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

         BasicServiceImpl basic = (BasicServiceImpl) 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());
         FileSaveServiceNSBImpl service = (FileSaveServiceImpl) 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);
      }
   }
}
CalculatorFrame
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);

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

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

 

實驗2:GUI綜合程式設計練習

按實驗十四分組名單,組內討論完成以下程式設計任務:

練習1:採用GUI介面設計以下程式,並進行部署與釋出:

編制一個程式,將身份證號.txt 中的資訊讀入到記憶體中;

按姓名字典序輸出人員資訊;

查詢最大年齡的人員資訊;

查詢最小年齡人員資訊;

輸入你的年齡,查詢身份證號.txt中年齡與你最近人的姓名、身份證號、年齡、性別和出生地;

查詢人員中是否有你的同鄉。

輸入身份證資訊,查詢所提供身份證號的人員資訊,要求輸入一個身份證數字時,查詢介面就顯示滿足查詢條件的查詢結果,且隨著輸入的數字的增多,查詢匹配的範圍逐漸縮小。

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

public class ButtonTest {
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            JFrame frame = new Test();
            frame.setTitle("身份證");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        });
    }
}
ButtonTest
package ID;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
import java.util.Collections;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Test extends JFrame {
    private static ArrayList<Citizen> citizenlist;
    private static ArrayList<Citizen> list;
    private JPanel panel;
    private JPanel buttonPanel;
    private static final int DEFAULT_WITH = 600;
    private static final int DEFAULT_HEIGHT = 300;

    public Test(){
        citizenlist = new ArrayList<>();
        Scanner scanner = new Scanner(System.in);
        File file = new File("E:/java/身份證號.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 birthplace = linescanner.nextLine();
                Citizen citizen = new Citizen();
                citizen.setName(name);
                citizen.setId(id);
                citizen.setSex(sex);
                int ag = Integer.parseInt(age);
                citizen.setage(ag);
                citizen.setBirthplace(birthplace);
                citizenlist.add(citizen);

            }
        } catch (FileNotFoundException e) {
            System.out.println("資訊檔案找不到");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("資訊檔案讀取錯誤");
            e.printStackTrace();
        }
        panel = new JPanel();
        panel.setLayout(new BorderLayout());
        JTextArea jt = new JTextArea();
        panel.add(jt);
        add(panel, BorderLayout.NORTH);
        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, 60, 30);
        jButton1.setBounds(110, 90, 60, 30);
        jt1.setBounds(110, 90, 60, 30);
        jt2.setBounds(110, 90, 60, 30);
        jt3.setBounds(110, 90, 60, 30);
        jButton2.setBounds(110, 90, 60, 30);
        jButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Collections.sort(citizenlist);
                jt.setText(citizenlist.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 < citizenlist.size(); i++) {
                    j = citizenlist.get(i).getage();
                    if (j > max) {
                        max = j;
                        k1 = i;
                    }
                    if (j < min) {
                        min = j;
                        k2 = i;
                    }

                }
                jt.setText("年齡最大:" + citizenlist.get(k1) + "年齡最小:" + citizenlist.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 < citizenlist.size(); i++) {
                    if (citizenlist.get(i).getBirthplace().substring(1, 4).equals(place)) {
                        text+="\n"+citizenlist.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 - citizenlist.get(near).getage();
                jt.setText("年齡相近:" + citizenlist.get(near));
            }
        });
        jt3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                list = new ArrayList<>();
                Collections.sort(citizenlist);
                String key = jt3.getText();
                for (int i = 1; i < citizenlist.size(); i++) {
                    if (citizenlist.get(i).getId().contains(key)) {                        
                        list.add(citizenlist.get(i));                        
                        jt.setText("emmm!你可能是:\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_WITH, DEFAULT_HEIGHT);
    }

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

}
Test
package ID;
public class Citizen implements Comparable<Citizen> {

    private String name;
    private String id;
    private String sex;
    private int age;
    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 String getSex() {
        return sex;
    }

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

    public int getage() {
        return age;
    }

    public void setage(int age) {
        this.age = age;
    }

    public String getBirthplace() {
        return birthplace;
    }

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

    public int compareTo(Citizen other) {
        return this.name.compareTo(other.getName());
    }

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

輸入甘肅省:

 

輸入28:

輸入4

輸入440

輸入4409

練習2:採用GUI介面設計以下程式,並進行部署與釋出

編寫一個計算器類,可以完成加、減、乘、除的操作

利用計算機類,設計一個小學生100以內數的四則運算練習程式,由計算機隨機產生10道加減乘除練習題,學生輸入答案,由程式檢查答案是否正確,每道題正確計10分,錯誤不計分,10道題測試結束後給出測試總分;

將程式中測試練習題及學生答題結果輸出到檔案,檔名為test.txt。

 

package counter;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Toolkit;
import javax.swing.JFrame;

public class Count {

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

}
Count

 

package calculator;

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

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

 

 

3.實驗總結:

 在本週的學習中,我學到了Java應用程式的打包操作,在老師還有助教學長的幫助下,學會了命令列方法。但是在後面的實驗程式設計中,依然存在這很多的問題。