• 弹出窗口与选择器(三)


    9.3 ProgressMonitorInputStream类

    ProgressMonitorInputStream类表示一个输入流过滤器,这个输入流过滤器使用ProgressMonitor来检测一个输入流的读取。如果读取需要较长的时间完成,则会显示ProgressMonitor,且用户可以选择弹出窗口中的Cancel按钮,从而使得读取被中断并且输入流会抛出一个InterruptedIOException。

    9.3.1 创建ProgressMonitorInputStream

    类似于其他的过滤器流,ProgressMonitorInputStream是使用一个到需要过滤的流的引用来创建的。除了到这个过滤器的引用,ProgressMonitorInputStream的构造函数还需要其ProgressMonitor的两个参数:父组件以及一个消息。正如在这里所看到的,构造函数首先需要ProgressMonitor参数:

    public ProgressMonitorInputStream(
      Component parentComponent, Object message, InputStream inputStream)

    与JOptionPane与ProgressMonitor类似,消息参数是一个Object,而不是一个String,所以我们可以在多行上显示一个组件数组或是字符串。下面的代码创建了一个ProgressMonitorInputStream。

    FileInputStream fis = new FileInputStream(filename);
    ProgressMonitorInputStream pmis = 
      new ProgressMonitorInputStream(parent, "Reading " + filename, fis);

    9.3.2 使用ProgressMonitorInputStream

    与所有的输入流一样,一旦我们创建了ProgressMonitorInputStream,我们需要由其中进行读取。如果输入流的读取不够快,底层的ProgressMonitor会使得进程弹出窗口显示。一旦这个窗口显示,用户可以监视进程或是通过选择Cancel按钮关闭读取。如果Cancel按钮被选中,则InterruptedIOException会被抛出,而异常的bytesTransferred或会被设置为已经成功读取的字节数。

    图9-7显示了一个ProgressMonitorInputStream弹出窗口的样子。略为不同的是,弹出窗口在消息区域使用两个JLabel组件,而不是一个。

    Swing_9_17

    列表9-6显示了完整的源代码示例。其中粗体显示的代码行是使用ProgressMonitorInputStream的关键。他们设置对话框的消息并且创建输入流。程序使用一个由命令行指定的文件名,读取文件,并且将文件拷贝到标准输出。如果文件足够大,进程监视器将会显示。如果我们按下Cancel按钮,读取停止,并且Canceled会被输出到标准错误。

    package swingstudy.ch09;
     
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.InterruptedIOException;
     
    import javax.swing.JLabel;
    import javax.swing.ProgressMonitorInputStream;
     
    public class ProgressInputSample {
     
    	public static final int NORMAL = 0;
    	public static final int BAD_FILE = 1;
    	public static final int CANCELED = NORMAL;
    	public static final int PROBLEM = 2;
     
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
    		int returnValue = NORMAL;
    		if(args.length != 1) {
    			System.err.println("Usage:");
    			System.err.println("java ProgressInputSample filename");
    		}
    		else {
    			try {
    				FileInputStream fis = new FileInputStream(args[0]);
    				JLabel filenameLabel = new JLabel(args[0], JLabel.RIGHT);
    				Object message[] = {"Reading:", filenameLabel};
    				ProgressMonitorInputStream pmis = new ProgressMonitorInputStream(null, message, fis);
    				InputStreamReader isr = new InputStreamReader(pmis);
    				BufferedReader br = new BufferedReader(isr);
    				String line;
    				while((line = br.readLine()) != null) {
    					System.out.println(line);
    				}
    				br.close();
    			}
    			catch(FileNotFoundException exception) {
    				System.err.println("Bad File "+exception);
    				returnValue = BAD_FILE;
    			}
    			catch(InterruptedIOException exception) {
    				System.err.println("Canceled");
    				returnValue = CANCELED;
    			}
    			catch(IOException exception) {
    				System.err.println("I/O Exception "+exception);
    				returnValue = PROBLEM;
    			}
    		}
    		System.exit(returnValue);
    	}
     
    }

    9.3.3 ProgressMonitorInputStream属性

    表9-7显示了ProgressMonitorInputStream的属性。ProgressMonitor在输入流创建时创建。我们不需要修改ProgressMonitor。然而我们也许需要在弹出窗口显示之前提供一个或长或短的时延(ProgressMonitor的millisToDecideToPopup属性)。

    Swing_table_9_9

  • 相关阅读:
    洛谷 P1219 八皇后【经典DFS,温习搜索】
    洛谷 P1972 [SDOI2009]HH的项链【莫队算法学习】
    hihoCoder #1015 : KMP算法【KMP裸题,板子】
    UVa 10341
    UVa 11461
    Uva
    BZOJ 3097: Hash Killer I【构造题,思维题】
    BZOJ 1207: [HNOI2004]打鼹鼠【妥妥的n^2爆搜,dp】
    BZOJ 1800: [Ahoi2009]fly 飞行棋【思维题,n^4大暴力】
    新版百度指数2013-12-23正式上线
  • 原文地址:https://www.cnblogs.com/dyllove98/p/2461898.html
Copyright © 2020-2023  润新知