1. 程式人生 > >201771010108 -韓臘梅-第十五週學習總結

201771010108 -韓臘梅-第十五週學習總結

十五週學習總結

一、知識點總結

1 JAR檔案   

    1.1  在應用程式打包的時候能夠有一個單獨的檔案包含多個檔案;JAR檔案就是為此設計的。

       一個JAR檔案既可以包含類檔案,也可以包含諸如影象和聲音這些其他型別的檔案。JAR檔案是壓縮檔案,採用ZIP壓縮格式。
    1.2    建立JAR檔案:jar cvf JARFileName File1,File2...
選項    說明
c       建立一個新的或者空的存檔檔案並加入檔案。如果指定的檔名是目錄,jar程式將會對它們進行遞迴處理。
C       暫時改變目錄,例如jar cvf JARFileName.jar -C classes *.class
         改變classes子目錄,以便增加這些類檔案
e       在清單檔案中建立一個條目
f        將JAR檔名指定為第二個命令列引數。如果沒有這個引數,jar命令會將結果寫在標準輸出上(在建立JAR檔案時)
         或者從標準輸入中讀取它(在解壓或者列出JAR檔案內容時)
    
i        簡歷索引檔案(用於加快對大型歸檔的查詢)
m      將一個清單檔案(manifest)新增到JAR檔案中。清單是對歸檔內容和來源的說明。每個歸檔有一個預設的清單檔案。
         但是,如果想驗證歸檔檔案的內容,可以提供自己的清單檔案
    
M       不為條目建立清單檔案
t         顯示內容表
u        更新一個已有的JAR檔案
v        生成詳細的輸出結果
x        解壓檔案。如果提供一個或多個檔名,只解壓這些檔案;否則,解壓所有檔案
O       儲存,不進行ZIP壓縮
    
    1.3 清單檔案:
        除了類檔案、影象和其他資源外,每個JAR檔案還包含衣蛾用於描述歸檔特徵的清單檔案(manifest)
        清單檔案被命名為MANIFEST.MF,它位於JAR檔案的一個特殊META-INF子目錄中
        
        複雜的清單條目被分成多個節。第一節被稱為主節(main section)。它作用域整個JAR檔案。
        隨後的條目用來指定已命名條目的屬性,這些已命名的條目可以是某個檔案、包或者URL,
        他們都必須起始於名為Name的條目。節與節之間用空行分開
    
    1.4 可執行JAR檔案
        可以使用jar命令中的e選項指定程式的入口點,即通常需要在呼叫Java程式載入器時指定的類:
        jar cvfe MyProgram.jar com.mycompany.mypkg.MainAppClass files to add
        根據作業系統的配置,使用者甚至可以通過雙擊JAR檔案圖示來啟動應用程式
    
    1.5 資源
        在applet和引用程式中使用的類通常需要使用一些相關的資料檔案,例如:
            影象和聲音檔案。
            帶有訊息字串和按鈕標籤的文字檔案。
            二進位制資料檔案,例如,描述地圖佈局的檔案。
        在Java中,這些關聯的檔案被稱為資源(resource)
        
        類載入器知道如何搜尋類檔案,直到在類路徑、存檔檔案或Web伺服器上找到為止。
        利用資源機制,對於非類檔案也可以同樣方便地進行操作,下面是必要的步驟:
        1)獲取具有資源的Class物件,如 AboutPancl.class。
        2)對於影象或聲音檔案,需要呼叫getresource(filename)獲得作為URL的資源位置,
            然後利用getImage或getAudioClip方法進行讀取。
        3)與影象或聲音檔案不同,其他資源可以使用getResourceAsStream方法讀取檔案中的資料。
        重點在於類載入器可以記住如何定位類,然後在同一位置查詢關聯的資源。
        
    1.6 密封:
        可以將Java包密封(scal)以保證不會有其他的類加入到其中。
        如果在程式碼中使用了包可見的類、方法和域,就可能希望密封包。
        如果不密封,其他類就有可能放在這個包中,進而訪問包可見的特性
        
        密封一個包,需要將包中的所有類放到一個JAR檔案中。在預設情況下,JAR檔案中的包時沒有密封的。
        可以在清單檔案的主節中加入下面一行:Sealed:true來改變全域性的預設設定。
        對於每個單獨的包,可以通過在JAR檔案的清單中增加一節,來指定是否想要密封這個包
        
2 應用首選項儲存與服務載入器
    2.1 應用首選項儲存
        應用使用者通常希望儲存他們的首選項和定製資訊,避免再次啟動應用時去恢復這些配置。
        傳統的做法時將配置資訊儲存在屬性檔案中,首選項API則提供了更為健壯的解決方案
        
        屬性對映:一中儲存鍵/值對的資料結構,屬性對映通常用來儲存配置資訊,有3個特性:
                鍵和值是字串
                對映可以很容易地存入檔案以及從檔案載入
                有一個二級表儲存預設值
            屬性對映的Java類名為properties
        首選項API:一些作業系統中有一個儲存配置資訊的中心儲存庫,儲存庫的各個節點分別有一個單獨的鍵/值對錶,
                    可以用來儲存數值,字串或位元組陣列,單不能可序列化物件。
                    通常節點的路徑採用逆置的域名作為路徑開頭,避免命名衝突,如com/mycompany/myapp
    
    2.2 服務載入器:
        有時會開發外掛體系結構的應用,用於開發環境,應用伺服器和其他複雜應用。
        通常提供一個外掛時,程式希望外掛設計者能有一些自由來確定如何實現外掛的特性

3 applet
    applet是包含在HTML頁面中的Java程式。HTML頁面必須告訴瀏覽器要載入哪些applet,每個applet要放在web頁面的位置
    
    3.1 簡單的applet
        執行applet三步驟:
        將Java原始檔編譯為類檔案
        將類打包到一個JAR檔案中
        建立一個HTML檔案,告訴瀏覽器首先載入哪個類檔案,以及如何設定applet的大小
        
    3.2 applet HTML標記和屬性
        width,height,align, vspace, hspace, code, archive, codebase, object, alt, name, 
    
    3.3 使用引數像applet傳遞資訊
        applet可以使用內嵌在HTML檔案中的引數,這是利用HTML param標記以及所定義的屬性完成的,如使用字型:
        <applet code="FontParamApplet.class" ...>
            <param name="font" value="Helvetica">
        </applet>
        
    3.4    訪問影象和音訊檔案
        applet可以處理影象和音訊。影象必須是GIF、PNG或JPEG格式。音訊檔案必須是AU、AIFF、WAV或MIDI格式。動畫支援GIF,可顯示動畫。
        需要利用相對的URL指定影象和音訊檔案的位置。通常通過呼叫getDocumentBase或getCodease方法獲得基URL。
        前一個方法可以包含applet的HTML網頁的URL;後者可以獲得applet的codebase的URL。
        可以通過getImage和getAudioClip方法獲得基URL和檔案的儲存位置。
        
    3.5    applet上下文
        applet在瀏覽器或者applet檢視器中執行。applet可以要求瀏覽器為它做事情。
        比如,若想在瀏覽器之間進行通訊,applet可呼叫getAppletContext方法。這個方法將返回一個實現了AppletContext介面的物件。
        可以認為AppletContext介面的具體實現認為是applet與外圍瀏覽器之間的通訊渠道
        
    3.6 applet通訊
        一個網頁可以包含多個applet。如果一個web頁面包含多個來自同一個codebase的applet,則它們之間就可以互相通訊。
        getApplets方法返回一個列舉物件(enumeration object)。
        pplet不能與其他網頁上的applet進行通訊。
        
4 Java web start
    4.1 Java Web Start是一項在Internet上釋出應用程式的技術。Java Web Start應用程式包含下列主要特性:
            Java Web Start應用程式一般通過瀏覽器釋出。只要Java Web Start應用程式下載到本地就可以啟動它,而不需要瀏覽器。
            Java Web Start應用程式並不在瀏覽器視窗內。它將顯示在瀏覽器外的一個屬於自己的框架中。
            Java Web Start應用程式不使用瀏覽器的Java實現。瀏覽器只是在載入Java Web Start應用程式描述符時啟動一個外部應用程式。
            這與啟動諸如Adobe Acrobat或RealAudio這樣的輔助應用程式的所使用的機制一樣。
    4.2 數字簽名應用程式可以被賦予訪問本地機器的任意許可權。未簽名的應用程式只能執行在“沙箱”中,它可以阻止具有潛在危險的操作。
    
    4.3    要想準備一個通過Java Web Start釋出的應用程式,
        1. 將其打包到一個或多個JAR檔案中。
        2. 建立一個Java Network Launch Protocol(JNLP)格式的描述符檔案。
        3。 將這些檔案放置在Web伺服器上。
        還需要確保Web伺服器對副檔名為.jnlp的檔案報告一個application/x-java-jnlp-file的MIME型別
        (瀏覽器利用MIME型別確定啟動哪一種輔助應用程式)。

二、實驗部分——實驗十五  GUI程式設計練習與應用程式部署

1、實驗目的與要求

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

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

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

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

2、實驗內容和步驟

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

測試程式1

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");//URL來指向about.gif資源地址 Image img = new ImageIcon(aboutURL).getImage();//利用about.gif影象檔案製作圖示,在找到ResourceTest類的地方查詢about.gif檔案 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); } }
resource

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

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

l  掌握建立JAR檔案的方法;

測試程式2

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()//構造器
   {
      // 從屬性獲取位置、大小、標題 

      String userDir = System.getProperty("user.home");//(讀取單個鍵)找出使用者的主目錄,主目錄包含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);

      //如果沒有標題,詢問使用者

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

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

瞭解Properties類中常用的方法;

測試程式3

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()//構造器
   {
      //從偏好獲得位置、大小、標題

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

      // 設定顯示XML檔案的檔案選擇器

      final JFileChooser chooser = new JFileChooser();
      chooser.setCurrentDirectory(new File("."));
      chooser.setFileFilter(new FileNameExtensionFilter("XML files", "xml"));

      //設定選單

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

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

瞭解Preferences類中常用的方法;

 

再執行也可以重新輸入

測試程式4

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;

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

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

掌握基於JNLP協議的java Web Start應用程式的釋出方法。

tomcat沒有10.版本

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

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

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

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

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

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

l  查詢最小年齡人員資訊;

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

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

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

程式碼:

package 實驗一;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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.*;
import java.util.Timer;
import javax.swing.*;

public class find extends JFrame
{
    private static ArrayList<Person> Personlist;
    
    
    Scanner scanner = new Scanner(System.in);
    File file = new File("E:\\身份證號.txt");
    
    private JPanel Panel;
    private JLabel JLabel1;
    private JButton Button,Button2,Button3,Button4;
    private JTextArea text,text1,text2,text3;
    boolean tru=true;
    
    
    
    public  find() {

        
        Panel = new JPanel();Panel.setLayout(null);
        Button = new JButton("1:按姓名字典序輸出人員資訊");
        Button2 = new JButton("2:查詢最大年齡資訊");
        Button4 = new JButton("3:最小年齡人員資訊");
        Button3 = new JButton("查詢相近年齡");
        JLabel1 = new JLabel("輸入身份證號或者地址查詢");
        JLabel1.setBounds(900, 50, 400, 30);
        
        text=new JTextArea(30,80);text.setBounds(50, 180, 700, 700);
        text1=new JTextArea(1,30);text1.setBounds(900, 80, 400, 30);
        text2=new JTextArea(30,80);text2.setBounds(900,180,700, 700);
        text3=new JTextArea(30,80);text3.setBounds(420,100,200,40);
       
        Button.addActionListener(new Action());Button.setBounds(50,30,300,40);
        Button2.addActionListener(new Action1());Button2.setBounds(50,80,300,40);
        Button3.addActionListener(new Action2());Button3.setBounds(650,100,120,40);
        Button4.addActionListener(new Action3());Button4.setBounds(50,130,300,40);
        Panel.add(JLabel1);
        Panel.add(Button);
        Panel.add(Button2);
        Panel.add(Button3);
        Panel.add(Button4);
        Panel.add(text);
        Panel.add(text2);
        Panel.add(text1);
        Panel.add(text3);
        add(Panel);
        
        
        Timer timer = new Timer();      
        TimerTask timeTask=new TimerTask() {
            
             @Override
            public void run()
             {             
                     // TODO Auto-generated method stub
                     text2.setText(null);
                     String place=text1.getText().toString().trim();
                     for (int i = 0; i <Personlist.size(); i++) 
                     {
                         
                         String Str=(String)Personlist.get(i).getbirthplace();
                         if(Str.contains(place)&&!place.equals("")) 
                             {
                             text2.append(Personlist.get(i).toString());
                             }  
                    }      
                     for (int i = 0; i <Personlist.size(); i++) 
                     {
                         
                         String Str=(String)Personlist.get(i).getID();
                         if(Str.contains(place)&&!place.equals("")) 
                             {
                             text2.append(Personlist.get(i).toString());
                             }  
                    }    
                     
            }
            
        };timer.schedule(timeTask, 0,100);
     
        Personlist = new ArrayList<>();       
        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();
        }
 
        
    }
    
    


    private class Action implements ActionListener
    {
    public void actionPerformed(ActionEvent event)
        {        
         text.setText(null);
         Collections.sort(Personlist);
         text.append(Personlist.toString());
        }

    }         

    private class Action1 implements ActionListener
        {
        public void actionPerformed(ActionEvent event)
            {        
            text.setText(null);
            int max=0;int j,k1 = 0;
            for(int i=1;i<Personlist.size();i++)
            {
                j=Personlist.get(i).getage();
               if(j>max)
               {
                   max=j; 
                   k1=i;
               }
               
            }  
            text.append("年齡最大:   "+Personlist.get(k1));     
            }
   
        }          
    private class Action3 implements ActionListener
    {
    public void actionPerformed(ActionEvent event)
        {        
        text.setText(null);
        int min=100;int j,k2=0;
        for(int i=1;i<Personlist.size();i++)
        {
            j=Personlist.get(i).getage();
           
           if(j<min)
           {
               min=j; 
               k2=i;
           }
        }  
        text.append("年齡最小:  "+Personlist.get(k2));     
        }

    }          

    private class Action2 implements ActionListener
    {
    public void actionPerformed(ActionEvent event)
        {        
         text.setText(null);
         int a = Integer.parseInt(text3.getText().toString().trim());         
         int d_value=a-Personlist.get(agenear(a)).getage();
         
         for (int i = 0; i < Personlist.size(); i++)
         {
             int p=Personlist.get(i).getage()-a;
            
             if(p==d_value||-p==d_value) text.append(Personlist.get(i).toString());
         } 
        }

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

          }    return k;
         
      }

}
find
package 實驗一;


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

import javax.swing.JFrame;

public class Out {

     public static void main (String args[])
        {
             Toolkit t=Toolkit.getDefaultToolkit();
            Dimension s=t.getScreenSize(); 
            EventQueue.invokeLater(() -> {
                JFrame frame = new find();
                frame.setBounds(0, 0,(int)s.getWidth(),(int)s.getHeight());
                frame.setTitle("第七組");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
             });        
        }
 
}
Out
package 實驗一;

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

}



}
Person

結果:

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

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

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

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

程式碼:

package 實驗二;

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 Demo 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 Demo() {
        JPanel Panel = new JPanel();
        Panel.setLayout(null);
        JLabel JLabel1 = new JLabel("");
        JLabel1.setBounds(500, 800, 400, 30);
        JLabel1.setFont(new Font("Courier", Font.PLAIN, 35));
        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, 35));
        text1 = new JTextArea(30, 80);
        text1.setBounds(270, 50, 200, 50);
        text1.setFont(new Font("Courier", Font.PLAIN, 35));

        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("0");
            if (i < 10) {

                int a = 1 + (int) (Math.random() * 99);
                int b = 1 + (int) (Math.random() * 99);
                int m = (int) Math.round(Math.random() * 3);
                switch (m) {
                case 0:
                    while (a < b) {
                        b = (int) Math.round(Math.random() * 100);
                        a = (int) Math.round(Math.random() * 100);
                    }
                    c[i] = ( a + "/" + b + "=");
                    list[i] = Math.floorDiv(a, b);
                    text.setText(a + "/" + b + "=");
                    i++;
                    break;
                case 1:
                    c[i] = (a + "*" + b + "=");
                    list[i] = Math.multiplyExact(a, b);
                    text.setText(a + "*" + b + "=");
                    i++;
                    break;
                case 2:
                    c[i] = (a + "+" + b + "=");
                    list[i] = Math.addExact(a, b);
                    text.setText(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] = (a + "-" + b + "=");
                    text.setText(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 daan = text1.getText().toString().trim();
                int a = Integer.parseInt(daan);
                if (text1.getText() != "") {
                    if (list[i1] == a)
                        sum += 10;
                }
                c1[i1] = daan;
                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();

        }

    }
}
Demo
package 實驗二;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Toolkit;

import javax.swing.JFrame;

public class New {

     public static void main (String args[])
        {
             Toolkit t=Toolkit.getDefaultToolkit();
            Dimension s=t.getScreenSize(); 
            EventQueue.invokeLater(() -> {
                JFrame frame = new Demo();
                frame.setBounds(0, 0,(int)s.getWidth()/2,(int)s.getHeight()/2);
                frame.setTitle("