public WebFrame(String title, File file) {
		super(title);
		
		// running threads
		runningThreads = 0;
		// initialize model and table.
		model = new DefaultTableModel(new String[] { "url", "status"}, 0);
		table = new JTable(model);
		table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
		JScrollPane scrollpane = new JScrollPane(table);
		scrollpane.setPreferredSize(new Dimension(600, 300));
		add(scrollpane);
		
		if (file!=null) loadFile(file); 
		
		// Create a bunch of controls in a box
		JPanel panel = new JPanel();
		panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
		add(panel, BorderLayout.SOUTH);

		JButton singleButton = new JButton("Single Thread Fetch");
		panel.add(singleButton);
		singleButton.addActionListener(
			new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					runningThreads = 0;
					completedThreads = 0;
					launcher = new Launcher(1);
					launcher.start();
				}
			}
		);
		panel.add(Box.createRigidArea(new Dimension(0,5)));
		JButton conButton = new JButton("Concurrent Fetch");
		panel.add(conButton);
		conButton.addActionListener(
			new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					runningThreads = 0;
					completedThreads = 0;
					int numThreads = Integer.parseInt(numThreadField.getText());
					launcher = new Launcher(numThreads);
					launcher.start();
				}
			}
		);
		
		numThreadField = new JTextField("2");
		numThreadField.setMaximumSize(new Dimension(40, 120));
		panel.add(numThreadField);
		
		runningLabel = new JLabel("Running:0");
		completeLabel = new JLabel("Completed:0");
		elapsedLabel = new JLabel("Elapsed:");
		panel.add(runningLabel);
		panel.add(completeLabel);
		panel.add(elapsedLabel);
		
		progressBar = new JProgressBar(0, model.getRowCount());
		panel.add(progressBar);
		
		JButton stopButton = new JButton("Stop");
		panel.add(stopButton);
		stopButton.addActionListener(
			new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					launcher.interrupt();
				}
			}
		);
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		setVisible(true);
	}