• 杨玲 201771010133《面向对象程序设计(java)》第十五周学习总结


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

    第一部分:理论知识学习部分

    JAR文件:

    1.Java程序的打包:程序编译完成后,程序员将.class文件压缩打包为.jar文件后,GUI界面程序就可以直接双击图标运行。

    2.jar文件(Java归档)既可以包含类文件,也可包含诸如图像和声音这些其它类型的文件。

    3.JAR文件是压缩的,它使用ZIP压缩格式。

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

    (1) 创建JAR文件 jar cf jar-file input-file(s) c---want to Create a JAR file. eg: 1) jar cf MenuTest.jar *.class *.gif f---want the output to go to a file rather than to stdout. 2) jar cvf MenuTest.jar *.class *.gif v---Produces verbose output to stdout. 3) jar cvf MenuTest.jar * *---create all contents in current directory. 4) jar cv0f MenuTest.jar * 0---don't want the JAR file to be compressed.

    (2) 查看JAR文件 jar tf jar-file t---want to view the Table of contents of the JAR file. eg: 1) jar tvf MenuTest.jar v---Produces verbose output to stdout.

    (3) 提取JAR文件 jar xf jar-file [archived-file(s)] x---want to extract files from the JAR archive. eg: 1) jar xf MenuTest.jar copy.gif(仅提取文件copy.gif) 2) jar xf MenuTest.jar alex/copy.gif(仅提取目录alex下的 文件copy.gif) 3) jar xf MenuTest.jar(提取该JAR中的所有文件或目录)

    (4) 更新JAR文件 jar uf jar-file input-file(s) u---want to update an existing JAR file. eg: 1) jar uf MenuTest.jar copy.gif (5) 索引JAR文件 jar i jar-file i---index an existing JAR file. eg: 1) jar i MenuTest.jar

    清单文件

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

     最小的符合标准的清单文件是很简单的:Manifest-Version:1.0复杂的清单文件包含多个条目,这些条目被分成多个节。第一节被称为主节,作用于整个JAR文件。随后的条目用来指定已命名条目的属性,可以是文件、包或者URL。

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

    – 创建一个包含清单的JAR文件,应该运行:

    jar cfm MyArchive.jar manifest.mf com/*.class

    – 要更新一个已有JAR文件的清单,则需要将增加的部分

    放置到一个文本文件中,运行如下命令:

    jar ufm MyArchive.jar manifest-additions.mf

    运行JAR文件

      用户可以通过下面的命令来启动应用程序:

    java –jar MyProgram.jar

      窗口操作系统,可通过双击JAR文件图标来启动应用程序。

    资源

      Java中,应用程序使用的类通常需要一些相关的数据文件,这些文件称为资源(Resource)。

    –图像和声音文件。

    –带有消息字符串和按钮标签的文本文件。

    –二进制数据文件,如:描述地图布局的文件。

      类加载器知道如何搜索类文件,直到在类路径、存档文件或Web服务器上找到为止。

      利用资源机制对于非类文件也可以进行同样操作,具体步骤如下:

    – 获得资源的Class对象。

    – 如果资源是一个图像或声音文件,那么就需要调用getresource(filename)获得资源的URL位置,然后利用getImage或getAudioClip方法进行读取。

    – 如果资源是文本或二进制文件,那么就可以使用getResouceAsStream方法读取文件中的数据。

      资源文件可以与类文件放在同一个目录中,也可以将资源文件放在其它子目录中。具体有以下两种方式:

    –相对资源名:如data/text/about.txt它会被解释为相对于加载这个资源的类所在的包。

    –绝对资源名:如/corejava/title.txt 

      ResourceTest.java程序演示了资源加载的过程。

       编译、创建JAR文件和执行这个程序的命令如下: – javac ResourceTest.java – jar cvfm ResourceTest.jar ResourceTest.mf *.class *.gif *.txt – java –jar ResourceTest.jar

    第二部分:实验部分

      实验名称:GUI编程练习与应用程序部署

    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文件的方法;

     1 import java.awt.*;
     2 import java.io.*;
     3 import java.net.*;
     4 import java.util.*;
     5 import javax.swing.*;
     6 
     7 /**
     8  * @version 1.41 2015-06-12
     9  * @author Cay Horstmann
    10  */
    11 public class ResourceTest
    12 {
    13    public static void main(String[] args)
    14    {
    15       EventQueue.invokeLater(() -> {
    16          JFrame frame = new ResourceTestFrame();
    17          frame.setTitle("ResourceTest");
    18          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    19          frame.setVisible(true);
    20       });
    21    }
    22 }
    23 
    24 /**
    25  * A frame that loads image and text resources.
    26  */
    27 class ResourceTestFrame extends JFrame
    28 {
    29    private static final int DEFAULT_WIDTH = 300;
    30    private static final int DEFAULT_HEIGHT = 300;
    31 
    32    public ResourceTestFrame()
    33    {
    34       setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    35       URL aboutURL = getClass().getResource("about.gif");
    36       Image img = new ImageIcon(aboutURL).getImage();
    37       setIconImage(img);
    38 
    39       JTextArea textArea = new JTextArea();
    40       InputStream stream = getClass().getResourceAsStream("about.txt");
    41 //    找到与类位于同一位置的资源,返回一个可以加载资源的URL或者输入流。
    42 //    如果没有找到资源,则返回null,而且不会抛出异常或者发生I/O错误。
    43       try (Scanner in = new Scanner(stream, "UTF-8"))
    44       {
    45          while (in.hasNext())
    46             textArea.append(in.nextLine() + "
    ");
    47       }
    48       add(textArea);
    49    }
    50 }

    运行结果如下:

    测试程序2

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

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

      1 package properties;
      2 
      3 import java.awt.EventQueue;
      4 import java.awt.event.*;
      5 import java.io.*;
      6 import java.util.Properties;
      7 
      8 import javax.swing.*;
      9 
     10 /**
     11  * A program to test properties. The program remembers the frame position, size,
     12  * and title.
     13  * @version 1.01 2015-06-16
     14  * @author Cay Horstmann
     15  */
     16 public class PropertiesTest
     17 {
     18    public static void main(String[] args)
     19    {
     20       EventQueue.invokeLater(() -> {
     21          PropertiesFrame frame = new PropertiesFrame();
     22          frame.setVisible(true);
     23       });
     24    }
     25 }
     26 
     27 /**
     28  * A frame that restores position and size from a properties file and updates
     29  * the properties upon exit.
     30  */
     31 class PropertiesFrame extends JFrame
     32 {
     33    private static final int DEFAULT_WIDTH = 300;
     34    private static final int DEFAULT_HEIGHT = 200;
     35 
     36    private File propertiesFile;
     37    private Properties settings;
     38 
     39    public PropertiesFrame()
     40    {
     41       // get position, size, title from properties
     42 
     43       String userDir = System.getProperty("user.home");
     44       //获取给定键名对应的系统属性。
     45       //应用必须有权限获取这个属性,否则会抛出一个安全异常。
     46       File propertiesDir = new File(userDir, ".corejava");
     47       if (!propertiesDir.exists()) propertiesDir.mkdir();
     48       propertiesFile = new File(propertiesDir, "program.properties");
     49 
     50       Properties defaultSettings = new Properties();
     51       defaultSettings.setProperty("left", "0");
     52       defaultSettings.setProperty("top", "0");
     53       defaultSettings.setProperty("width", "" + DEFAULT_WIDTH);
     54       defaultSettings.setProperty("height", "" + DEFAULT_HEIGHT);
     55       defaultSettings.setProperty("title", "");
     56 
     57       settings = new Properties(defaultSettings);
     58 
     59       if (propertiesFile.exists()) 
     60          try (InputStream in = new FileInputStream(propertiesFile))
     61          {         
     62             settings.load(in);
     63          }
     64          catch (IOException ex)
     65          {
     66             ex.printStackTrace();
     67          }
     68 
     69       int left = Integer.parseInt(settings.getProperty("left"));
     70       int top = Integer.parseInt(settings.getProperty("top"));
     71       int width = Integer.parseInt(settings.getProperty("width"));
     72       int height = Integer.parseInt(settings.getProperty("height"));
     73       setBounds(left, top, width, height);
     74 
     75       // if no title given, ask user
     76 
     77       String title = settings.getProperty("title");
     78       if (title.equals(""))
     79          title = JOptionPane.showInputDialog("Please supply a frame title:");
     80       if (title == null) title = "";
     81       setTitle(title);
     82 
     83       addWindowListener(new WindowAdapter()
     84       {
     85          public void windowClosing(WindowEvent event)
     86          {
     87             settings.setProperty("left", "" + getX());
     88             settings.setProperty("top", "" + getY());
     89             settings.setProperty("width", "" + getWidth());
     90             settings.setProperty("height", "" + getHeight());
     91             settings.setProperty("title", getTitle());
     92             try (OutputStream out = new FileOutputStream(propertiesFile))
     93             {
     94                settings.store(out, "Program Properties");
     95             }
     96             catch (IOException ex)
     97             {
     98                ex.printStackTrace();
     99             }
    100             System.exit(0);
    101          }
    102       });
    103    }
    104 }

    运行结果如下:

    测试程序3

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

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

      1 import java.awt.*;
      2 import java.io.*;
      3 import java.util.prefs.*;
      4 
      5 import javax.swing.*;
      6 import javax.swing.filechooser.*;
      7 
      8 /**
      9  * A program to test preference settings. The program remembers the frame
     10  * position, size, and title.
     11  * @version 1.03 2015-06-12
     12  * @author Cay Horstmann
     13  */
     14 public class PreferencesTest
     15 {
     16    public static void main(String[] args)
     17    {
     18       EventQueue.invokeLater(() -> {
     19          PreferencesFrame frame = new PreferencesFrame();
     20          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     21          frame.setVisible(true);
     22       });
     23    }
     24 }
     25 
     26 /**
     27  * A frame that restores position and size from user preferences and updates the
     28  * preferences upon exit.
     29  */
     30 class PreferencesFrame extends JFrame
     31 {
     32    private static final int DEFAULT_WIDTH = 300;
     33    private static final int DEFAULT_HEIGHT = 200;
     34    private Preferences root = Preferences.userRoot();
     35    //返回调用程序的用户的首选项根节点。
     36    private Preferences node = root.node("/com/horstmann/corejava");
     37 
     38    public PreferencesFrame()
     39    {
     40       // get position, size, title from preferences
     41 
     42       int left = node.getInt("left", 0);
     43       //返回从当前节点由给定路径可以到达的节点。
     44       //如果path是绝对路径(也就是说,以一个/开头),则从包含这个首选项节点的树的根节点开始查找。
     45       //如果给定路径不存在相应的节点,则创建这样一个节点。
     46       int top = node.getInt("top", 0);
     47       int width = node.getInt("width", DEFAULT_WIDTH);
     48       int height = node.getInt("height", DEFAULT_HEIGHT);
     49       setBounds(left, top, width, height);
     50 
     51       // if no title given, ask user
     52 
     53       String title = node.get("title", "");
     54       if (title.equals(""))
     55          title = JOptionPane.showInputDialog("Please supply a frame title:");
     56       if (title == null) title = "";
     57       setTitle(title);
     58 
     59       // set up file chooser that shows XML files
     60 
     61       final JFileChooser chooser = new JFileChooser();
     62       chooser.setCurrentDirectory(new File("."));
     63       chooser.setFileFilter(new FileNameExtensionFilter("XML files", "xml"));
     64 
     65       // set up menus  建立一个菜单
     66 
     67       JMenuBar menuBar = new JMenuBar();
     68       setJMenuBar(menuBar);
     69       JMenu menu = new JMenu("File");
     70       menuBar.add(menu);
     71 
     72       JMenuItem exportItem = new JMenuItem("Export preferences");
     73       menu.add(exportItem);
     74       exportItem
     75             .addActionListener(event -> {
     76                if (chooser.showSaveDialog(PreferencesFrame.this) == JFileChooser.APPROVE_OPTION)
     77                {
     78                   try
     79                   {
     80                      savePreferences();
     81                      OutputStream out = new FileOutputStream(chooser
     82                            .getSelectedFile());
     83                      node.exportSubtree(out);
     84                      //将这个节点及其子节点的首选项写至指定的流
     85                      out.close();
     86                   }
     87                   catch (Exception e)
     88                   {
     89                      e.printStackTrace();
     90                   }
     91                }
     92             });
     93 
     94       JMenuItem importItem = new JMenuItem("Import preferences");
     95       menu.add(importItem);
     96       importItem
     97             .addActionListener(event -> {
     98                if (chooser.showOpenDialog(PreferencesFrame.this) == JFileChooser.APPROVE_OPTION)
     99                {
    100                   try
    101                   {
    102                      InputStream in = new FileInputStream(chooser
    103                            .getSelectedFile());
    104                      Preferences.importPreferences(in);
    105                      in.close();
    106                   }
    107                   catch (Exception e)
    108                   {
    109                      e.printStackTrace();
    110                   }
    111                }
    112             });
    113 
    114       JMenuItem exitItem = new JMenuItem("Exit");
    115       menu.add(exitItem);
    116       exitItem.addActionListener(event -> {
    117          savePreferences();
    118          System.exit(0);
    119       });
    120    }
    121    
    122    public void savePreferences() 
    123    {
    124       node.putInt("left", getX());
    125       node.putInt("top", getY());
    126       node.putInt("width", getWidth());
    127       node.putInt("height", getHeight());
    128       node.put("title", getTitle());      
    129    }
    130 }

    运行结果如下:

    测试程序4

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

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

     1 package webstart;
     2 
     3 import java.awt.*;
     4 import javax.swing.*;
     5 
     6 /**
     7  * 具有可作为Java Web启动应用程序部署的计算历史的计算器。
     8  * @version 1.04 2015-06-12
     9  * @author Cay Horstmann
    10  */
    11 public class Calculator
    12 {
    13    public static void main(String[] args)
    14    {
    15       EventQueue.invokeLater(() ->             {
    16                CalculatorFrame frame = new CalculatorFrame();
    17                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    18                frame.setVisible(true);
    19          });
    20    }
    21 }
      1 package webstart;
      2 
      3 import java.io.BufferedReader;
      4 import java.io.ByteArrayInputStream;
      5 import java.io.ByteArrayOutputStream;
      6 import java.io.FileNotFoundException;
      7 import java.io.IOException;
      8 import java.io.InputStream;
      9 import java.io.InputStreamReader;
     10 import java.io.OutputStream;
     11 import java.io.PrintStream;
     12 import java.net.MalformedURLException;
     13 import java.net.URL;
     14 
     15 import javax.jnlp.BasicService;
     16 import javax.jnlp.FileContents;
     17 import javax.jnlp.FileOpenService;
     18 import javax.jnlp.FileSaveService;
     19 import javax.jnlp.PersistenceService;
     20 import javax.jnlp.ServiceManager;
     21 import javax.jnlp.UnavailableServiceException;
     22 import javax.swing.JFrame;
     23 import javax.swing.JMenu;
     24 import javax.swing.JMenuBar;
     25 import javax.swing.JMenuItem;
     26 import javax.swing.JOptionPane;
     27 
     28 /**
     29  * 一个带有计算器面板和菜单的框架,用来载入和保存计算器历史。
     30  */
     31 public class CalculatorFrame extends JFrame
     32 {
     33    private CalculatorPanel panel;
     34 
     35    public CalculatorFrame()
     36    {
     37       setTitle();
     38       panel = new CalculatorPanel();
     39       add(panel);
     40 
     41       JMenu fileMenu = new JMenu("File");
     42       JMenuBar menuBar = new JMenuBar();
     43       menuBar.add(fileMenu);
     44       setJMenuBar(menuBar);
     45 
     46       JMenuItem openItem = fileMenu.add("Open");
     47       openItem.addActionListener(event -> open());
     48       JMenuItem saveItem = fileMenu.add("Save");
     49       saveItem.addActionListener(event -> save());
     50       
     51       pack();
     52    }
     53 
     54    /**
     55     * 从持久存储中获取标题,或者在没有以前的条目的情况下向用户请求标题。
     56     */
     57    public void setTitle()
     58    {
     59       try
     60       {
     61          String title = null;
     62 
     63          BasicService basic = (BasicService) ServiceManager.lookup("javax.jnlp.BasicService");
     64          URL codeBase = basic.getCodeBase();
     65 
     66          PersistenceService service = (PersistenceService) ServiceManager
     67                .lookup("javax.jnlp.PersistenceService");
     68          URL key = new URL(codeBase, "title");
     69 
     70          try
     71          {
     72             FileContents contents = service.get(key);
     73             InputStream in = contents.getInputStream();
     74             BufferedReader reader = new BufferedReader(new InputStreamReader(in));
     75             title = reader.readLine();
     76          }
     77          catch (FileNotFoundException e)
     78          {
     79             title = JOptionPane.showInputDialog("Please supply a frame title:");
     80             if (title == null) return;
     81 
     82             service.create(key, 100);
     83             FileContents contents = service.get(key);
     84             OutputStream out = contents.getOutputStream(true);
     85             PrintStream printOut = new PrintStream(out);
     86             printOut.print(title);
     87          }
     88          setTitle(title);
     89       }
     90       catch (UnavailableServiceException | IOException e)
     91       {
     92          JOptionPane.showMessageDialog(this, e);
     93       }
     94    }
     95 
     96    /**
     97     * 打开历史文件并更新显示。
     98     */
     99    public void open()
    100    {
    101       try
    102       {
    103          FileOpenService service = (FileOpenService) ServiceManager
    104                .lookup("javax.jnlp.FileOpenService");
    105          FileContents contents = service.openFileDialog(".", new String[] { "txt" });
    106 
    107          JOptionPane.showMessageDialog(this, contents.getName());
    108          if (contents != null)
    109          {
    110             InputStream in = contents.getInputStream();
    111             BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    112             String line;
    113             while ((line = reader.readLine()) != null)
    114             {
    115                panel.append(line);
    116                panel.append("
    ");
    117             }
    118          }
    119       }
    120       catch (UnavailableServiceException e)
    121       {
    122          JOptionPane.showMessageDialog(this, e);
    123       }
    124       catch (IOException e)
    125       {
    126          JOptionPane.showMessageDialog(this, e);
    127       }
    128    }
    129 
    130    /**
    131     * 将计算器历史保存到文件中。
    132     */
    133    public void save()
    134    {
    135       try
    136       {
    137          ByteArrayOutputStream out = new ByteArrayOutputStream();
    138          PrintStream printOut = new PrintStream(out);
    139          printOut.print(panel.getText());
    140          InputStream data = new ByteArrayInputStream(out.toByteArray());
    141          FileSaveService service = (FileSaveService) ServiceManager
    142                .lookup("javax.jnlp.FileSaveService");
    143          service.saveFileDialog(".", new String[] { "txt" }, data, "calc.txt");
    144       }
    145       catch (UnavailableServiceException e)
    146       {
    147          JOptionPane.showMessageDialog(this, e);
    148       }
    149       catch (IOException e)
    150       {
    151          JOptionPane.showMessageDialog(this, e);
    152       }
    153    }
    154 }
      1 package webstart;
      2 
      3 import java.awt.*;
      4 import java.awt.event.*;
      5 import javax.swing.*;
      6 import javax.swing.text.*;
      7 
      8 /**
      9    具有计算器按钮和结果显示的面板。
     10 */
     11 public class CalculatorPanel extends JPanel
     12 {  
     13    private JTextArea display;
     14    private JPanel panel;
     15    private double result;
     16    private String lastCommand;
     17    private boolean start;
     18 
     19    /**
     20       列出面板。
     21    */
     22    public CalculatorPanel()
     23    {  
     24       setLayout(new BorderLayout());
     25 
     26       result = 0;
     27       lastCommand = "=";
     28       start = true;
     29       
     30       // 添加显示
     31       display = new JTextArea(10, 20);
     32 
     33       add(new JScrollPane(display), BorderLayout.NORTH);
     34       
     35       ActionListener insert = new InsertAction();
     36       ActionListener command = new CommandAction();
     37 
     38       // 在4×4网格中添加按钮
     39 
     40       panel = new JPanel();
     41       panel.setLayout(new GridLayout(4, 4));
     42 
     43       addButton("7", insert);
     44       addButton("8", insert);
     45       addButton("9", insert);
     46       addButton("/", command);
     47 
     48       addButton("4", insert);
     49       addButton("5", insert);
     50       addButton("6", insert);
     51       addButton("*", command);
     52 
     53       addButton("1", insert);
     54       addButton("2", insert);
     55       addButton("3", insert);
     56       addButton("-", command);
     57 
     58       addButton("0", insert);
     59       addButton(".", insert);
     60       addButton("=", command);
     61       addButton("+", command);
     62 
     63       add(panel, BorderLayout.CENTER);
     64    }
     65 
     66    /**
     67       获取历史文本。
     68       @return the calculator history
     69    */
     70    public String getText()
     71    {
     72       return display.getText();
     73    }
     74    
     75    /**
     76       将字符串追加到历史文本中。
     77       @param s the string to append
     78    */
     79    public void append(String s)
     80    {
     81       display.append(s);
     82    }
     83 
     84    /**
     85       向中心面板添加一个按钮。
     86       @param label the button label
     87       @param listener the button listener
     88    */
     89    private void addButton(String label, ActionListener listener)
     90    {  
     91       JButton button = new JButton(label);
     92       button.addActionListener(listener);
     93       panel.add(button);
     94    }
     95 
     96    /**
     97       此操作将按钮操作字符串插入到显示文本结束。
     98    */
     99    private class InsertAction implements ActionListener
    100    {
    101       public void actionPerformed(ActionEvent event)
    102       {
    103          String input = event.getActionCommand();
    104          start = false;
    105          display.append(input);
    106       }
    107    }
    108 
    109    /**
    110       此操作执行按钮的命令。动作字符串表示。
    111    */
    112    private class CommandAction implements ActionListener
    113    {
    114       public void actionPerformed(ActionEvent event)
    115       {  
    116          String command = event.getActionCommand();
    117 
    118          if (start)
    119          {  
    120             if (command.equals("-")) 
    121             { 
    122                display.append(command); 
    123                start = false; 
    124             }
    125             else 
    126                lastCommand = command;
    127          }
    128          else
    129          {  
    130             try
    131             {
    132                int lines = display.getLineCount();
    133                int lineStart = display.getLineStartOffset(lines - 1);
    134                int lineEnd = display.getLineEndOffset(lines - 1);
    135                String value = display.getText(lineStart, lineEnd - lineStart);
    136                display.append(" ");
    137                display.append(command); 
    138                calculate(Double.parseDouble(value));
    139                if (command.equals("="))
    140                   display.append("
    " + result);
    141                lastCommand = command;
    142                display.append("
    ");
    143                start = true;
    144             }
    145             catch (BadLocationException e)
    146             {
    147                e.printStackTrace();
    148             }
    149          }
    150       }
    151    }
    152 
    153    /**
    154      执行悬而未决的计算。
    155       @param x the value to be accumulated with the prior result.
    156    */
    157    public void calculate(double x)
    158    {
    159       if (lastCommand.equals("+")) result += x;
    160       else if (lastCommand.equals("-")) result -= x;
    161       else if (lastCommand.equals("*")) result *= x;
    162       else if (lastCommand.equals("/")) result /= x;
    163       else if (lastCommand.equals("=")) result = x;
    164    }  
    165 }

    运行结果如下:

    实验2GUI综合编程练习

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

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

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

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

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

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

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

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

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

      1 import java.io.BufferedReader;
      2 import java.io.File;
      3 import java.io.FileInputStream;
      4 import java.io.InputStreamReader;
      5 import java.io.FileNotFoundException;
      6 import java.io.IOException;
      7 import java.util.ArrayList;
      8 import java.util.Arrays;
      9 import java.util.Collections;
     10 import java.util.Scanner;
     11 import java.awt.*;
     12 import javax.swing.*;
     13 import java.awt.event.*;
     14 
     15 public class Main extends JFrame {
     16     private static ArrayList<Student> studentlist;
     17     private static ArrayList<Student> list;
     18     private JPanel panel;
     19     private JPanel buttonPanel;
     20     private static final int DEFAULT_WITH = 800;
     21     private static final int DEFAULT_HEIGHT = 600;
     22 
     23     public Main() {
     24         studentlist = new ArrayList<>();
     25         Scanner scanner = new Scanner(System.in);
     26         File file = new File("E:\java\身份证号.txt");
     27         try {
     28             FileInputStream fis = new FileInputStream(file);
     29             BufferedReader in = new BufferedReader(new InputStreamReader(fis));
     30             String temp = null;
     31             while ((temp = in.readLine()) != null) {
     32 
     33                 Scanner linescanner = new Scanner(temp);
     34 
     35                 linescanner.useDelimiter(" ");
     36                 String name = linescanner.next();
     37                 String number = linescanner.next();
     38                 String sex = linescanner.next();
     39                 String age = linescanner.next();
     40                 String province = linescanner.nextLine();
     41                 Student student = new Student();
     42                 student.setName(name);
     43                 student.setnumber(number);
     44                 student.setsex(sex);
     45                 int a = Integer.parseInt(age);
     46                 student.setage(a);
     47                 student.setprovince(province);
     48                 studentlist.add(student);
     49 
     50             }
     51         } catch (FileNotFoundException e) {
     52             System.out.println("学生信息文件找不到");
     53             e.printStackTrace();
     54         } catch (IOException e) {
     55             System.out.println("学生信息文件读取错误");
     56             e.printStackTrace();
     57         }
     58         panel = new JPanel();
     59         panel.setLayout(new BorderLayout());
     60         JTextArea jt = new JTextArea();
     61         panel.add(jt);
     62         add(panel, BorderLayout.NORTH);
     63         buttonPanel = new JPanel();
     64         buttonPanel.setLayout(new GridLayout(1, 7));
     65         JButton jButton = new JButton("字典排序");
     66         JButton jButton1 = new JButton("年龄最大和年龄最小");
     67         JLabel lab = new JLabel("猜猜你的老乡");
     68         JTextField jt1 = new JTextField();
     69         JLabel lab1 = new JLabel("找找同龄人(年龄相近):");
     70         JTextField jt2 = new JTextField();
     71         JLabel lab2 = new JLabel("输入你的身份证号码:");
     72         JTextField jt3 = new JTextField();
     73         JButton jButton2 = new JButton("退出");
     74         jButton.setBounds(110, 90, 60, 30);
     75         jButton1.setBounds(110, 90, 60, 30);
     76         jt1.setBounds(110, 90, 60, 30);
     77         jt2.setBounds(110, 90, 60, 30);
     78         jt3.setBounds(110, 90, 60, 30);
     79         jButton2.setBounds(110, 90, 60, 30);
     80         jButton.addActionListener(new ActionListener() {
     81             public void actionPerformed(ActionEvent e) {
     82                 Collections.sort(studentlist);
     83                 jt.setText(studentlist.toString());
     84             }
     85         });
     86         jButton1.addActionListener(new ActionListener() {
     87             public void actionPerformed(ActionEvent e) {
     88                 int max = 0, min = 100;
     89                 int j, k1 = 0, k2 = 0;
     90                 for (int i = 1; i < studentlist.size(); i++) {
     91                     j = studentlist.get(i).getage();
     92                     if (j > max) {
     93                         max = j;
     94                         k1 = i;
     95                     }
     96                     if (j < min) {
     97                         min = j;
     98                         k2 = i;
     99                     }
    100 
    101                 }
    102                 jt.setText("年龄最大:" + studentlist.get(k1) + "年龄最小:" + studentlist.get(k2));
    103             }
    104         });
    105         jButton2.addActionListener(new ActionListener() {
    106             public void actionPerformed(ActionEvent e) {
    107                 dispose();
    108                 System.exit(0);
    109             }
    110         });
    111         jt1.addActionListener(new ActionListener() {
    112             public void actionPerformed(ActionEvent e) {
    113                 String find = jt1.getText();
    114                 String text="";
    115                 String place = find.substring(0, 3);
    116                 for (int i = 0; i < studentlist.size(); i++) {
    117                     if (studentlist.get(i).getprovince().substring(1, 4).equals(place)) {
    118                         text+="
    "+studentlist.get(i);
    119                         jt.setText("老乡:" + text);
    120                     }
    121                 }
    122             }
    123         });
    124         jt2.addActionListener(new ActionListener() {
    125             public void actionPerformed(ActionEvent e) {
    126                 String yourage = jt2.getText();
    127                 int a = Integer.parseInt(yourage);
    128                 int near = agenear(a);
    129                 int value = a - studentlist.get(near).getage();
    130                 jt.setText("年龄相近:" + studentlist.get(near));
    131             }
    132         });
    133         jt3.addActionListener(new ActionListener() {
    134             public void actionPerformed(ActionEvent e) {
    135                 list = new ArrayList<>();
    136                 Collections.sort(studentlist);
    137                 String key = jt3.getText();
    138                 for (int i = 1; i < studentlist.size(); i++) {
    139                     if (studentlist.get(i).getnumber().contains(key)) {                        
    140                         list.add(studentlist.get(i));                        
    141                         jt.setText("emmm!你可能是:
    " + list);
    142                     
    144                     }                    
    145                 }
    146             }
    147         });
    148         buttonPanel.add(jButton);
    149         buttonPanel.add(jButton1);
    150         buttonPanel.add(lab);
    151         buttonPanel.add(jt1);
    152         buttonPanel.add(lab1);
    153         buttonPanel.add(jt2);
    154         buttonPanel.add(lab2);
    155         buttonPanel.add(jt3);
    156         buttonPanel.add(jButton2);
    157         add(buttonPanel, BorderLayout.SOUTH);
    158         setSize(DEFAULT_WITH, DEFAULT_HEIGHT);
    159     }
    160 
    161     public static int agenear(int age) {
    162         int min = 53, value = 0, k = 0;
    163         for (int i = 0; i < studentlist.size(); i++) {
    164             value = studentlist.get(i).getage() - age;
    165             if (value < 0)
    166                 value = -value;
    167             if (value < min) {
    168                 min = value;
    169                 k = i;
    170             }
    171         }
    172         return k;
    173     }
    174 
    175 }
     1 public class Student implements Comparable<Student> {
     2 
     3     private String name;
     4     private String number ;
     5     private String sex ;
     6     private int age;
     7     private String province;
     8    
     9     public String getName() {
    10         return name;
    11     }
    12     public void setName(String name) {
    13         this.name = name;
    14     }
    15     public String getnumber() {
    16         return number;
    17     }
    18     public void setnumber(String number) {
    19         this.number = number;
    20     }
    21     public String getsex() {
    22         return sex ;
    23     }
    24     public void setsex(String sex ) {
    25         this.sex =sex ;
    26     }
    27     public int getage() {
    28 
    29         return age;
    30         }
    31         public void setage(int age) {
    32             // int a = Integer.parseInt(age);
    33         this.age= age;
    34         }
    35 
    36     public String getprovince() {
    37         return province;
    38     }
    39     public void setprovince(String province) {
    40         this.province=province ;
    41     }
    42 
    43     public int compareTo(Student o) {
    44        return this.name.compareTo(o.getName());
    45     }
    46 
    47     public String toString() {
    48         return  name+"	"+sex+"	"+age+"	"+number+"	"+province+"
    ";
    49     }    
    50 }
     1 import java.awt.*;
     2 import javax.swing.*;
     3 
     4 public class ButtonTest {
     5     public static void main(String[] args) {
     6         EventQueue.invokeLater(() -> {
     7             JFrame frame = new Main();
     8             frame.setTitle("身份证信息");
     9             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    10             frame.setVisible(true);
    11         });
    12     }
    13 }

    运行结果如下:

                                                               

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

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

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

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

      1 import java.awt.BorderLayout;
      2 import java.awt.GridLayout;
      3 import java.awt.event.ActionEvent;
      4 import java.awt.event.ActionListener;
      5 import javax.swing.JButton;
      6 import javax.swing.JFrame;
      7 import javax.swing.JPanel;
      8 import javax.swing.JTextField;
      9 public class Calculator extends JFrame {
     10 JButton b0 = new JButton("0");
     11 JButton b1 = new JButton("1");
     12 JButton b2 = new JButton("2");
     13 JButton b3 = new JButton("3");
     14 JButton b4 = new JButton("4");
     15 JButton b5 = new JButton("5");
     16 JButton b6 = new JButton("6");
     17 JButton b7 = new JButton("7");
     18 JButton b8 = new JButton("8");
     19 JButton b9 = new JButton("9");
     20 JButton jiaButton = new JButton("+");
     21 JButton jianButton = new JButton("-");
     22 JButton chengButton = new JButton("*");
     23 JButton chuButton = new JButton("/");
     24 JButton yuButton = new JButton("%");
     25 JButton jjButton = new JButton("+/-");
     26 JButton sqrtButton = new JButton("sqrt");
     27 JButton dianButton = new JButton(".");
     28 JButton dengButton = new JButton("=");
     29 JButton daoButton = new JButton("1/x");
     30 JButton backButton = new JButton("Backpace");
     31 JButton cButton = new JButton("C");
     32 public double op1;
     33 public double op2;
     34 public static final int JIA = 0;
     35 public static final int JIAN = 1;
     36 public static final int CHENG = 2;
     37 public static final int CHU = 3;
     38 public static final int JJ = 4;
     39 public static final int DIAN = 5;
     40 public int current0p = 0;
     41 private boolean opEnd = false;
     42 JPanel panel1 = new JPanel();
     43 JPanel panel2 = new JPanel();
     44 JPanel panel3 = new JPanel();
     45 JPanel panel4 = new JPanel();
     46 JTextField result = new JTextField(20);
     47 public Calculator() {
     48 initPanel2();
     49 initPanel3();
     50 panel2.setLayout(new GridLayout(5, 4));
     51 panel1.setLayout(new BorderLayout());
     52 panel1.add(panel3, BorderLayout.NORTH);// 设置位置
     53 panel1.add(panel2, BorderLayout.CENTER);// 设置位置
     54 getContentPane().add(panel1);
     55 addActionListeners();
     56 setSize(260, 260);
     57 setLocation(500, 300);
     58 setVisible(true);
     59 setDefaultCloseOperation(Calculator.EXIT_ON_CLOSE);
     60 this.setResizable(false);
     61 this.setTitle("计算器");
     62 }
     63 private void initPanel2() {
     64 // 把组件添加相应panel上
     65 panel2.add(b7);
     66 panel2.add(b8);
     67 panel2.add(b9);
     68 panel2.add(chuButton);
     69 panel2.add(b4);
     70 panel2.add(b5);
     71 panel2.add(b6);
     72 panel2.add(chengButton);
     73 panel2.add(b1);
     74 panel2.add(b2);
     75 panel2.add(b3);
     76 panel2.add(jianButton);
     77 panel2.add(b0);
     78 panel2.add(jjButton);
     79 panel2.add(dianButton);
     80 panel2.add(jiaButton);
     81 panel2.add(daoButton);
     82 panel2.add(yuButton);
     83 panel2.add(sqrtButton);
     84 panel2.add(dengButton);
     85 }
     86 private void addActionListeners() {
     87 ActionHandler c = new ActionHandler();
     88 b0.addActionListener(c);
     89 b1.addActionListener(c);
     90 b2.addActionListener(c);
     91 b3.addActionListener(c);
     92 b4.addActionListener(c);
     93 b5.addActionListener(c);
     94 b6.addActionListener(c);
     95 b7.addActionListener(c);
     96 b8.addActionListener(c);
     97 b9.addActionListener(c);
     98 jiaButton.addActionListener(c);
     99 dengButton.addActionListener(c);
    100 chengButton.addActionListener(c);
    101 chuButton.addActionListener(c);
    102 jianButton.addActionListener(c);
    103 jjButton.addActionListener(c);
    104 dianButton.addActionListener(c);
    105 sqrtButton.addActionListener(c);
    106 yuButton.addActionListener(c);
    107 daoButton.addActionListener(c);
    108 backButton.addActionListener(c);
    109 cButton.addActionListener(c);
    110 }
    111 class ActionHandler implements ActionListener {
    112 public void actionPerformed(ActionEvent e) {
    113 if (e.getSource() == b0) {
    114 if (opEnd == false) {
    115 result.setText("");
    116 }
    117 result.setText(result.getText() + "0");
    118 }
    119 if (e.getSource() == b1) {
    120 if (opEnd == false) {
    121 result.setText("");
    122 }
    123 result.setText(result.getText() + "1");
    124 opEnd = true;
    125 }
    126 if (e.getSource() == b2) {
    127 if (opEnd == false) {
    128 result.setText("");
    129 }
    130 result.setText(result.getText() + "2");
    131 opEnd = true;
    132 }
    133 if (e.getSource() == b3) {
    134 if (opEnd == false) {
    135 result.setText("");
    136 }
    137 result.setText(result.getText() + "3");
    138 opEnd = true;
    139 }
    140 if (e.getSource() == b4) {
    141 if (opEnd == false) {
    142 result.setText("");
    143 }
    144 result.setText(result.getText() + "4");
    145 opEnd = true;
    146 }
    147 if (e.getSource() == b5) {
    148 if (opEnd == false) {
    149 result.setText("");
    150 }
    151 result.setText(result.getText() + "5");
    152 opEnd = true;
    153 }
    154 if (e.getSource() == b6) {
    155 if (opEnd == false) {
    156 result.setText("");
    157 }
    158 result.setText(result.getText() + "6");
    159 opEnd = true;
    160 }
    161 if (e.getSource() == b7) {
    162 if (opEnd == false) {
    163 result.setText("");
    164 }
    165 result.setText(result.getText() + "7");
    166 opEnd = true;
    167 }
    168 if (e.getSource() == b8) {
    169 if (opEnd == false) {
    170 result.setText("");
    171 }
    172 result.setText(result.getText() + "8");
    173 opEnd = true;
    174 }
    175 if (e.getSource() == b9) {
    176 if (opEnd == false) {
    177 result.setText("");
    178 }
    179 result.setText(result.getText() + "9");
    180 opEnd = true;
    181 }
    182 try {
    183 if (e.getSource() == jiaButton) {
    184 op1 = Double.parseDouble(result.getText());
    185 // 2、说明操作数已经输入完毕
    186 opEnd = false;
    187 current0p = JIA;
    188 }
    189 if (e.getSource() == chengButton) {
    190 op1 = Double.parseDouble(result.getText());
    191 // 2、说明操作数已经输入完毕
    192 opEnd = false;
    193 current0p = CHENG;
    194 }
    195 if (e.getSource() == chuButton) {
    196 op1 = Double.parseDouble(result.getText());
    197 // 2、说明操作数已经输入完毕
    198 opEnd = false;
    199 current0p = CHU;
    200 }
    201 if (e.getSource() == jianButton) {
    202 op1 = Double.parseDouble(result.getText());
    203 // 2、说明操作数已经输入完毕
    204 opEnd = false;
    205 current0p = JIAN;
    206 }
    207 if (e.getSource() == jjButton) {
    208 String tmp = result.getText();
    209 if (tmp.equals("") || tmp.equals("0")) {
    210 return;
    211 }
    212 if (tmp.charAt(0) == '-') {
    213 tmp = tmp.substring(1);
    214 } else {
    215 tmp = '-' + tmp;
    216 }
    217 result.setText(tmp);
    218 }
    219 if (e.getSource() == dianButton) {
    220 String tmp = result.getText();
    221 if (tmp.equals("")) {
    222 return;
    223 }
    224 if (tmp.indexOf(".") != -1) {
    225 return;
    226 }
    227 tmp = tmp + ".";
    228 result.setText(tmp);
    229 }
    230 if (e.getSource() == sqrtButton) {
    231 String tmp = result.getText();
    232 if (tmp.equals(" ")) {
    233 return;
    234 }
    235 double d;
    236 d = Double.parseDouble(tmp);// 先定义double类型d
    237 if (d < 0) {
    238 result.setText("不能对负数求平方根");
    239 return;
    240 }
    241 op2 = Math.sqrt(d);
    242 result.setText(op2 + "");
    243 }
    244 if (e.getSource() == backButton) {
    245 String s = result.getText();
    246 result.setText("");
    247 for (int i = 0; i < s.length() - 1; i++) {
    248 char a = s.charAt(i);
    249 result.setText(result.getText() + a);
    250 }
    251 }
    252 if (e.getSource() == cButton) {
    253 result.setText("0");
    254 opEnd = false;
    255 }
    256 if (e.getSource() == dengButton) {
    257 op2 = Double.parseDouble(result.getText());
    258 switch (current0p) {
    259 case JIA:
    260 result.setText(op1 + op2 + "");
    261 break;
    262 case JIAN:
    263 result.setText(op1 - op2 + "");
    264 break;
    265 case CHENG:
    266 result.setText(op1 * op2 + "");
    267 break;
    268 case CHU:
    269 if (op2 == 0) {
    270 result.setText("被除数不能为零");
    271 break;
    272 }
    273 result.setText(op1 / op2 + "");
    274 break;
    275 }
    276 opEnd = false;
    277 }
    278 } catch (Exception e1) {
    279 result.setText("Wrong");
    280 opEnd = false;
    281 }
    282 }
    283 }
    284 private void initPanel3() {
    285 panel3.setLayout(new GridLayout(2, 1));
    286 panel3.add(result);
    287 panel3.add(panel4);
    288 panel4.setLayout(new GridLayout(1, 2));
    289 panel4.add(backButton);
    290 panel4.add(cButton);
    291 }
    292 public static void main(String[] args) {
    293 Calculator c = new Calculator();// 生成类实例
    294 }
    295 }
     1 import java.io.FileNotFoundException;
     2 import java.io.PrintWriter;
     3 import java.util.Scanner;
     4 
     5 /*
     6  * 该程序用来随机生成0到100以内的加减乘除题
     7  */
     8 public class Demo {
     9     public static  void main(String[] args) {
    10         // 用户的答案要从键盘输入,因此需要一个键盘输入流
    11         Scanner in = new Scanner(System.in);
    12         Counter counter=new Counter();
    13         PrintWriter out = null;
    14         try {
    15             out = new PrintWriter("text.txt");
    16         } catch (FileNotFoundException e) {
    17             // TODO Auto-generated catch block
    18             e.printStackTrace();
    19         }
    20         // 定义一个变量用来统计得分
    21         int sum = 0;
    22         int k=0;
    23         // 通过循环生成10道题
    24         for (int i = 0; i < 10; i++) {
    25 
    26             // 随机生成两个100以内的随机数作加减乘除
    27             int a = (int) Math.round(Math.random() * 100);
    28             int b = (int) Math.round(Math.random() * 100);
    29             int d = (int) Math.round(Math.random() * 3);
    30             
    31             switch (d){
    32             
    33             case 0: 
    34               if(a%b == 0) {
    35               System.out.println(a + "/" + b + "=");
    36               break;
    37               }
    38               //int c = in.nextInt();
    39               //out.println(a + "/" + b + "="+c);
    40             case 1:
    41               System.out.println(a + "*" + b + "=");
    42               //int c1 = in.nextInt();
    43               //out.println(a + "*" + b + "="+c1);
    44               break;
    45             case 2:
    46               System.out.println(a + "+" + b + "=");
    47               //int c2 = in.nextInt();
    48               //out.println(a + "+" + b + "="+c2);
    49               break;
    50             case 3:
    51             if(a>b) {
    52             System.out.println(a + "-" + b + "=");
    53             break;
    54             }
    55             //int c3 = in.nextInt();
    56             //out.println(a + "-" + b + "="+c3);
    57             
    58             }        
    59 
    60             // 定义一个整数用来接收用户输入的答案
    61             double c = in.nextDouble();
    62             
    63             // 判断用户输入的答案是否正确,正确给10分,错误不给分
    64             if (c == a / b | c == a * b | c == a + b | c == a - b) {
    65                 sum += 10;
    66                 System.out.println("恭喜答案正确");
    67             }
    68             else {
    69                 System.out.println("抱歉,答案错误");
    70             
    71             }
    72             out.println(a + "/" + b + "="+c );
    73             out.println(a + "*" + b + "="+c);
    74             out.println(a + "+" + b + "="+c);
    75             out.println(a + "-" + b + "="+c);
    76         
    77         }
    78         //输出用户的成绩
    79         System.out.println("你的得分为"+sum);
    80         
    81         out.println("成绩:"+sum);
    82         out.close();
    83     }
    84     }

    4. 实验总结:

      通过本次实验,我发现了自己在学习中还存在很大的问题与不足,在学习Java编程这条路上还有很长的路要走。

  • 相关阅读:
    拨号进入防盗界面
    手机开机或启动广播接收者
    time、datetime
    py 包和模块,软件开发目录规范
    递归函数
    匿名函数,内置函数
    三元表达式,列表生成式,生成器生成式
    迭代器,生成器
    XPath
    闭包,装饰器
  • 原文地址:https://www.cnblogs.com/yanglinga/p/10077824.html
Copyright © 2020-2023  润新知