private void initializeComponents() {
    int leftPanelWidth = 250;
    JPanel parentPanel = new JPanel();
    parent = new JScrollPane(parentPanel);
    chartSize = new Dimension(500, 300);
    parentPanel.setLayout(new BoxLayout(parentPanel, BoxLayout.X_AXIS));
    JPanel leftPanel = new JPanel();
    leftPanel.setMaximumSize(new Dimension(leftPanelWidth, Integer.MAX_VALUE));
    parent.setBorder(BorderFactory.createEmptyBorder());
    parent.setViewportBorder(BorderFactory.createEmptyBorder());

    jSeparator1 = new javax.swing.JSeparator();
    chartTypeLabel = new javax.swing.JLabel();
    windowSizeSpinner = new javax.swing.JSpinner();
    windowStepSpinner = new javax.swing.JSpinner();
    jLabel1 = new javax.swing.JLabel();
    jLabel2 = new javax.swing.JLabel();

    leftPanel.setPreferredSize(new java.awt.Dimension(leftPanelWidth, 300));
    leftPanel.setBackground(Color.WHITE);

    leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.PAGE_AXIS));

    topLabel = new JLabel();
    topLabel.setText(currentName);
    topLabel.setHorizontalTextPosition(SwingConstants.CENTER);
    leftPanel.add(topLabel);

    JPanel topPanel = new JPanel();
    topPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 1, 0));
    topPanel.setBackground(Color.white);
    topPanel.setMaximumSize(new Dimension(leftPanelWidth, 16));

    topPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
    leftPanel.add(topPanel);

    JPanel buttonPanel = new JPanel();
    buttonPanel.setOpaque(false);
    buttonPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
    buttonPanel.setAlignmentX(LEFT_ALIGNMENT);
    buttonPanel.setMaximumSize(new Dimension(leftPanelWidth, 40));
    buttonPanel.setPreferredSize(new Dimension(leftPanelWidth, 36));

    saveButton = new JButton(getIcon("icons/save.png"));
    saveButton.setFont(defaultFont);
    saveButton.setToolTipText("Save chart image");
    saveButton.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent arg0) {
            saveChartImage();
          }
        });
    saveButton.setAlignmentX(LEFT_ALIGNMENT);

    JButton restoreButton = new JButton(getIcon("icons/expand.png"));
    restoreButton.setToolTipText("Restore default axes boundaries");
    restoreButton.setFont(defaultFont);
    restoreButton.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent arg0) {
            restoreDefaultBounds();
          }
        });
    restoreButton.setAlignmentX(LEFT_ALIGNMENT);

    JButton zoomButton = new JButton(getIcon("icons/zoom.png"));
    zoomButton.setToolTipText("Zoom to selection region");
    zoomButton.setFont(defaultFont);
    zoomButton.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent arg0) {
            zoomToSelection();
          }
        });
    zoomButton.setAlignmentX(LEFT_ALIGNMENT);

    JButton selectRangeButton = new JButton(getIcon("icons/selectColumns.png"));
    selectRangeButton.setFont(defaultFont);
    selectRangeButton.setToolTipText("Select range in sequence group");
    selectRangeButton.setAlignmentX(LEFT_ALIGNMENT);
    selectRangeButton.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent arg0) {
            selectSitesFromAxesRange();
          }
        });

    JButton clearButton = new JButton("Clear");
    clearButton.setFont(defaultFont);
    // selectRangeButton.setPreferredSize(new Dimension(80, 24));
    clearButton.setAlignmentX(LEFT_ALIGNMENT);
    clearButton.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent arg0) {
            chart.clearRangeSelection();
            chart.repaint();
          }
        });

    buttonPanel.add(saveButton);
    buttonPanel.add(restoreButton);
    buttonPanel.add(zoomButton);
    buttonPanel.add(selectRangeButton);
    leftPanel.add(buttonPanel);

    usePartitionsBox = new JCheckBox("Use partition data");
    usePartitionsBox.setFont(defaultFont);
    usePartitionsBox.setSelected(true);
    usePartitionsBox.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            repaintAllSeries();
          }
        });

    leftPanel.add(usePartitionsBox);

    SpinnerModel sizeModel = new SpinnerNumberModel(100, 1, 1000, 10);
    SpinnerModel stepModel = new SpinnerNumberModel(100, 1, 1000, 5);
    windowSizeSpinner = new JSpinner(sizeModel);
    windowStepSpinner = new JSpinner(stepModel);
    windowStepSpinner.setMaximumSize(new Dimension(80, 25));
    windowSizeSpinner.setMaximumSize(new Dimension(80, 25));
    windowSizeLabel = new JLabel();
    windowSizeLabel.setFont(defaultFont);
    windowSizeLabel.setText("Window size");
    windowStepLabel = new JLabel();
    windowStepLabel.setFont(defaultFont);
    windowStepLabel.setText("Window step");

    JPanel spinnerLabels = new JPanel();
    spinnerLabels.setAlignmentX(LEFT_ALIGNMENT);
    spinnerLabels.setOpaque(false);
    spinnerLabels.setLayout(new BoxLayout(spinnerLabels, BoxLayout.X_AXIS));
    spinnerLabels.add(windowSizeLabel);
    spinnerLabels.add(Box.createHorizontalStrut(16));
    spinnerLabels.add(windowStepLabel);
    spinnerLabels.add(Box.createHorizontalGlue());

    JPanel spinnerPanel = new JPanel();
    spinnerPanel.setAlignmentX(LEFT_ALIGNMENT);
    spinnerPanel.setOpaque(false);
    spinnerPanel.setLayout(new BoxLayout(spinnerPanel, BoxLayout.X_AXIS));
    spinnerPanel.add(windowSizeSpinner);
    spinnerPanel.add(Box.createHorizontalStrut(25));
    spinnerPanel.add(windowStepSpinner);
    spinnerPanel.add(Box.createHorizontalGlue());
    leftPanel.add(spinnerLabels);
    leftPanel.add(spinnerPanel);

    windowSizeSpinner.setFont(defaultFont);
    windowSizeSpinner.addChangeListener(
        new javax.swing.event.ChangeListener() {
          public void stateChanged(javax.swing.event.ChangeEvent evt) {
            newWindowSizeAction();
          }
        });
    windowStepSpinner.setFont(defaultFont);
    windowStepSpinner.addChangeListener(
        new javax.swing.event.ChangeListener() {
          public void stateChanged(javax.swing.event.ChangeEvent evt) {
            newWindowSizeAction();
          }
        });

    leftPanel.add(Box.createRigidArea(new Dimension(0, 10)));
    JScrollPane pane = createStatisticListPanel();
    pane.setPreferredSize(new Dimension(leftPanelWidth, 200));
    pane.setMaximumSize(new Dimension(leftPanelWidth, 400));
    pane.setBackground(Color.white);
    pane.setAlignmentX(Component.LEFT_ALIGNMENT);
    leftPanel.add(pane);

    leftPanel.add(Box.createVerticalGlue());

    JPanel bottomPanel = new JPanel();
    bottomPanel.setBackground(Color.white);

    chart = new XYSeriesFigure();
    chart.setMinimumSize(chartSize);
    chart.setPreferredSize(chartSize);
    chart.addMouseListener(new PopupListener());

    parentPanel.add(leftPanel);
    parentPanel.add(chart);

    chartPopup = new JPopupMenu();

    JMenuItem popupExport = new JMenuItem("Save as image");
    popupExport.addActionListener(
        new java.awt.event.ActionListener() {
          public void actionPerformed(java.awt.event.ActionEvent evt) {
            saveChartImage();
          }
        });
    chartPopup.add(popupExport);

    JMenuItem popupSaveData = new JMenuItem("Save data as .csv");
    popupSaveData.addActionListener(
        new java.awt.event.ActionListener() {
          public void actionPerformed(java.awt.event.ActionEvent evt) {
            popupSaveDataAction();
          }
        });
    chartPopup.add(popupSaveData);
    chartPopup.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));

    setLayout(new BorderLayout());
    add(parent, BorderLayout.CENTER);

    chart.addSeriesListener(this);
  }