zoukankan      html  css  js  c++  java
  • 杨玲 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编程这条路上还有很长的路要走。

  • 相关阅读:
    将Nginx添加到windows服务中
    springboot使用redis管理session
    GIT常用命令
    阻止360、谷歌浏览器表单自动填充
    谈谈对Spring IOC的理解
    同一个Nginx服务器同一端口配置多个代理服务
    LeetCode 653. Two Sum IV
    109. Convert Sorted List to Binary Search Tree(根据有序链表构造平衡的二叉查找树)
    108. Convert Sorted Array to Binary Search Tree(从有序数组中构造平衡的BST)
    LeetCode 236. Lowest Common Ancestor of a Binary Tree(二叉树求两点LCA)
  • 原文地址:https://www.cnblogs.com/yanglinga/p/10077824.html
Copyright © 2011-2022 走看看