public void createComponents() {
        nextOutput = new JButton("Next");
        previousOutput = new JButton("Previous");
        deleteButton = new JButton("Delete");

        leftPanel = new JPanel();
        rightPanel = new JPanel();
        mainSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);

        mainSplitPane.setContinuousLayout(true);
        mainSplitPane.setOneTouchExpandable(true);
        mainSplitPane.setResizeWeight(.5);

        stdoutPanel = new JPanel(outputPanels);
        stdoutPanel.setBorder(new TitledBorder(
                                     new EtchedBorder(EtchedBorder.LOWERED), "Standard Output"));
        stderrPanel = new JPanel(errorPanels);
        stderrPanel.setBorder(new TitledBorder(
                                      new EtchedBorder(EtchedBorder.LOWERED), "Standard Error"));

        chainPanel = new FilterChainPanel(this);
        clipboardPanel = new ClipboardPanel();
        clipboardPanel.setBorder(new TitledBorder(
                                       new EtchedBorder(EtchedBorder.LOWERED), "Clipboard"));
        
        if (dataInput == null) {
            //setSize(500, 500);
            setSize(800, 800);
            // Position
            Dimension size = getSize();
            Dimension screenSize = getToolkit().getScreenSize();
            if (size.width > screenSize.width || size.height > screenSize.height) {
                setLocation(0, 0);
            } else {
                setLocation((screenSize.width - size.width)/2, 
                            (screenSize.height - size.height)/2);
            }
        } else {
            try {
                int version = dataInput.readInt();
                switch(version) {
                case 3:
                    setLocation(dataInput.readInt(), dataInput.readInt());
                case 2:
                    Dimension size = new Dimension();
                    size.width = dataInput.readInt();
                    size.height = dataInput.readInt();
                    setSize(size);
                    break;
                case 1:
                    setSize(300, 200);
                }
                clipboardPanel.readHistory(dataInput);
            } catch (IOException e) {
                // NYI
            }
        }
        FilterEditPanel filterEditPanel = new FilterEditPanel(chainPanel);
        commandPanel = new CommandPanel(this, directory, filterEditPanel);
        setDefaultCommandHistory();
        if (dataInput != null) {
            commandPanel.readHistory(dataInput);
        }

        commandPanel.setBorder(new TitledBorder(
                                       new EtchedBorder(EtchedBorder.LOWERED), "Command Entry"));
        chainPanel.setSourceProvider(commandPanel.getSourceProvider());
        chainPanel.setDestinationProvider(
                commandPanel.getDestinationProvider());
        chainPanel.addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent e) {
                String command = chainPanel.getSelectedValue();
                commandPanel.setCommandLine(command);
            }
        });
    }