keel.GraphInterKeel.datacf.visualizeData.VisualizePanelCharts2D.java Source code

Java tutorial

Introduction

Here is the source code for keel.GraphInterKeel.datacf.visualizeData.VisualizePanelCharts2D.java

Source

/***********************************************************************
    
   This file is part of KEEL-software, the Data Mining tool for regression, 
   classification, clustering, pattern mining and so on.
    
   Copyright (C) 2004-2010
       
   F. Herrera (herrera@decsai.ugr.es)
L. Snchez (luciano@uniovi.es)
J. Alcal-Fdez (jalcala@decsai.ugr.es)
S. Garca (sglopez@ujaen.es)
A. Fernndez (alberto.fernandez@ujaen.es)
J. Luengo (julianlm@decsai.ugr.es)
    
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.
    
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
    
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see http://www.gnu.org/licenses/
      
**********************************************************************/

package keel.GraphInterKeel.datacf.visualizeData;

import com.lowagie.text.Document;
import com.lowagie.text.pdf.DefaultFontMapper;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfTemplate;
import com.lowagie.text.pdf.PdfWriter;
import keel.GraphInterKeel.datacf.util.KeelFileFilter;
import keel.GraphInterKeel.util.Path;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Vector;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
 * <p>
 * @author Written by Juan Carlos Fernndez and Pedro Antonio Gutirrez(University of Crdoba) 23/10/2008
 * @version 1.0
 * @since JDK1.5
 * </p>
 */
public class VisualizePanelCharts2D extends javax.swing.JPanel {

    /**
     * <p>
     * Class for visualizing charts in two dimensions
     * </p>
     */

    /**
     * <p>
     * Constructor that initializes the panel
     * </p>
     */
    public VisualizePanelCharts2D() {
        initComponents();
    }

    /**
     * <p>
     * This method is called from within the constructor to
     * initialize the form.
     * </p>
     * <p>
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     * </p>
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        chartjScrollPane = new javax.swing.JScrollPane();
        imagejLabel = new javax.swing.JLabel();
        selectAttributesjPanel = new javax.swing.JPanel();
        attribute1jLabel = new javax.swing.JLabel();
        attribute2jLabel = new javax.swing.JLabel();
        attribute1jComboBox = new javax.swing.JComboBox();
        attribute2jComboBox = new javax.swing.JComboBox();
        pngjLabel = new javax.swing.JLabel();
        pdfjLabel = new javax.swing.JLabel();
        topngjButton = new javax.swing.JButton();
        topdfjButton = new javax.swing.JButton();
        ViewChartjPanel = new javax.swing.JPanel();
        ViewChartjButton = new javax.swing.JButton();

        setName("Form"); // NOI18N

        chartjScrollPane.setBorder(javax.swing.BorderFactory
                .createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Chart"));
        chartjScrollPane.setName("chartjScrollPane"); // NOI18N

        imagejLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        imagejLabel.setToolTipText("Click to Expand");
        imagejLabel.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        imagejLabel.setName("imagejLabel"); // NOI18N
        imagejLabel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                imagejLabelMouseClicked(evt);
            }
        });
        chartjScrollPane.setViewportView(imagejLabel);

        selectAttributesjPanel.setBorder(javax.swing.BorderFactory
                .createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Select Attributes"));
        selectAttributesjPanel.setName("selectAttributesjPanel"); // NOI18N

        attribute1jLabel.setText("Attribute 1");
        attribute1jLabel.setName("attribute1jLabel"); // NOI18N

        attribute2jLabel.setText("Attribute 2");
        attribute2jLabel.setName("attribute2jLabel"); // NOI18N

        attribute1jComboBox.setModel(
                new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        attribute1jComboBox.setToolTipText("Select attribute 1");
        attribute1jComboBox.setName("attribute1jComboBox"); // NOI18N

        attribute2jComboBox.setModel(
                new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        attribute2jComboBox.setToolTipText("Select attribute 2");
        attribute2jComboBox.setName("attribute2jComboBox"); // NOI18N

        pngjLabel.setText("Convert to PNG");
        pngjLabel.setName("pngjLabel"); // NOI18N

        pdfjLabel.setText("Convert to PDF");
        pdfjLabel.setName("pdfjLabel"); // NOI18N

        topngjButton.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/keel/GraphInterKeel/resources/ico/datacf/toPNG.png"))); // NOI18N
        topngjButton.setToolTipText("Export Chart to PNG image");
        topngjButton.setName("topngjButton"); // NOI18N
        topngjButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                topngjButtonActionPerformed(evt);
            }
        });

        topdfjButton.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/keel/GraphInterKeel/resources/ico/datacf/toPDF.png"))); // NOI18N
        topdfjButton.setToolTipText("Export Chart to PDF image");
        topdfjButton.setName("topdfjButton"); // NOI18N
        topdfjButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                topdfjButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout selectAttributesjPanelLayout = new javax.swing.GroupLayout(selectAttributesjPanel);
        selectAttributesjPanel.setLayout(selectAttributesjPanelLayout);
        selectAttributesjPanelLayout.setHorizontalGroup(
                selectAttributesjPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
                                selectAttributesjPanelLayout.createSequentialGroup().addContainerGap()
                                        .addGroup(selectAttributesjPanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(attribute1jLabel).addComponent(attribute2jLabel))
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addGroup(selectAttributesjPanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(attribute1jComboBox, 0, 399, Short.MAX_VALUE)
                                                .addComponent(attribute2jComboBox, 0, 399, Short.MAX_VALUE))
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addGroup(selectAttributesjPanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                                .addGroup(selectAttributesjPanelLayout.createSequentialGroup()
                                                        .addComponent(topngjButton).addGap(21, 21, 21))
                                                .addGroup(selectAttributesjPanelLayout.createSequentialGroup()
                                                        .addComponent(pngjLabel).addGap(18, 18, 18)))
                                        .addGroup(selectAttributesjPanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                                .addGroup(selectAttributesjPanelLayout.createSequentialGroup()
                                                        .addComponent(topdfjButton).addGap(19, 19, 19))
                                                .addGroup(selectAttributesjPanelLayout.createSequentialGroup()
                                                        .addComponent(pdfjLabel,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE, 84,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                                        .addContainerGap()))));
        selectAttributesjPanelLayout.setVerticalGroup(selectAttributesjPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(selectAttributesjPanelLayout.createSequentialGroup()
                        .addGroup(selectAttributesjPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(selectAttributesjPanelLayout.createSequentialGroup().addContainerGap()
                                        .addGroup(selectAttributesjPanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                                .addComponent(attribute1jLabel).addComponent(attribute1jComboBox,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                                        .addGap(14, 14, 14)
                                        .addGroup(selectAttributesjPanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                                .addComponent(attribute2jLabel).addComponent(attribute2jComboBox)))
                                .addGroup(selectAttributesjPanelLayout.createSequentialGroup()
                                        .addGroup(selectAttributesjPanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                                .addComponent(pdfjLabel).addComponent(pngjLabel))
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addGroup(selectAttributesjPanelLayout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(topngjButton).addComponent(topdfjButton))))
                        .addContainerGap()));

        ViewChartjPanel.setName("ViewChartjPanel"); // NOI18N
        ViewChartjPanel.setLayout(new java.awt.GridBagLayout());

        ViewChartjButton.setText("View Chart");
        ViewChartjButton.setToolTipText("Generate chart");
        ViewChartjButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        ViewChartjButton.setName("ViewChartjButton"); // NOI18N
        ViewChartjButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ViewChartjButtonActionPerformed(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        ViewChartjPanel.add(ViewChartjButton, gridBagConstraints);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(selectAttributesjPanel, javax.swing.GroupLayout.DEFAULT_SIZE,
                        javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(ViewChartjPanel, javax.swing.GroupLayout.Alignment.TRAILING,
                        javax.swing.GroupLayout.DEFAULT_SIZE, 668, Short.MAX_VALUE)
                .addComponent(chartjScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 668, Short.MAX_VALUE));
        layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                        .addComponent(selectAttributesjPanel, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(chartjScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 288, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(ViewChartjPanel, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)));
    }// </editor-fold>//GEN-END:initComponents

    private void ViewChartjButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ViewChartjButtonActionPerformed
        // Show comparing chart
        if ((this.attribute1jComboBox.getSelectedIndex() == -1)
                || (this.attribute2jComboBox.getSelectedIndex() == -1)) {
            JOptionPane.showMessageDialog(this, "There are no attributes selected", "Error", 2);
        } else if (((VisualizePanel) (this.getParent()).getParent()).getData()
                .getAttributeTypeIndex(this.attribute1jComboBox.getSelectedIndex()).equals("nominal")
                && ((VisualizePanel) (this.getParent()).getParent()).getData()
                        .getAttributeTypeIndex(this.attribute2jComboBox.getSelectedIndex()).equals("nominal")) {
            // Error message
            JOptionPane.showMessageDialog(this, "Only one attribute can be nominal", "Error", 2);
        } else if (((VisualizePanel) (this.getParent()).getParent()).getData()
                .getAttributeTypeIndex(this.attribute1jComboBox.getSelectedIndex()).equals("nominal")) {
            // Nominal in x axis --> vertical
            DefaultCategoryDataset dataset = new DefaultCategoryDataset();
            boolean legend = false;
            for (int i = 0; i < ((VisualizePanel) (this.getParent()).getParent()).getData().getNData(); i++) {
                String column = ((VisualizePanel) (this.getParent()).getParent()).getData().getDataIndex(i,
                        this.attribute1jComboBox.getSelectedIndex());
                String row = "";
                if (((VisualizePanel) (this.getParent()).getParent()).getOutAttribute() != -1
                        && this.attribute1jComboBox
                                .getSelectedIndex() != ((VisualizePanel) (this.getParent()).getParent())
                                        .getOutAttribute()) {
                    row = "Class " + ((VisualizePanel) (this.getParent()).getParent()).getData().getDataIndex(i,
                            ((VisualizePanel) (this.getParent()).getParent()).getOutAttribute());
                    legend = true;
                }
                String valor = ((VisualizePanel) (this.getParent()).getParent()).getData().getDataIndex(i,
                        this.attribute2jComboBox.getSelectedIndex());
                if (valor != null && column != null) {
                    if (dataset.getColumnIndex(column) == -1 || dataset.getRowIndex(row) == -1) {
                        dataset.addValue(Double.valueOf(valor).doubleValue(), row, column);
                    } else {
                        dataset.incrementValue(Double.valueOf(valor).doubleValue(), row, column);
                    }
                }
            }

            this.chart2 = ChartFactory.createBarChart3D("",
                    ((VisualizePanel) (this.getParent()).getParent()).getData()
                            .getAttributeIndex(this.attribute1jComboBox.getSelectedIndex()),
                    ((VisualizePanel) (this.getParent()).getParent()).getData()
                            .getAttributeIndex(this.attribute2jComboBox.getSelectedIndex()),
                    dataset, PlotOrientation.VERTICAL, legend, false, false);
            this.chart2.setTitle(this.attribute1jComboBox.getSelectedItem().toString() + " vs "
                    + this.attribute2jComboBox.getSelectedItem().toString());
            this.chart2.setBackgroundPaint(new Color(0xFFFFFF));
            BufferedImage image = this.chart2.createBufferedImage(600, 450);
            this.imagejLabel.setIcon(new ImageIcon(image));
            this.topdfjButton.setEnabled(true);
            this.topngjButton.setEnabled(true);
        } else if (((VisualizePanel) (this.getParent()).getParent()).getData()
                .getAttributeTypeIndex(this.attribute2jComboBox.getSelectedIndex()).equals("nominal")) {
            // Nominal in y axis --> horizontal
            DefaultCategoryDataset dataset = new DefaultCategoryDataset();
            boolean legend = false;
            try {
                for (int i = 0; i < ((VisualizePanel) (this.getParent()).getParent()).getData().getNData(); i++) {
                    String column = ((VisualizePanel) (this.getParent()).getParent()).getData().getDataIndex(i,
                            this.attribute2jComboBox.getSelectedIndex());
                    String row = "";
                    if (((VisualizePanel) (this.getParent()).getParent()).getOutAttribute() != -1
                            && this.attribute2jComboBox
                                    .getSelectedIndex() != ((VisualizePanel) (this.getParent()).getParent())
                                            .getOutAttribute()) {
                        row = "Class " + ((VisualizePanel) (this.getParent()).getParent()).getData().getDataIndex(i,
                                ((VisualizePanel) (this.getParent()).getParent()).getOutAttribute());
                        legend = true;
                    }
                    String valor = ((VisualizePanel) (this.getParent()).getParent()).getData().getDataIndex(i,
                            this.attribute1jComboBox.getSelectedIndex());
                    if (valor != null) {
                        if (dataset.getColumnIndex(column) == -1 || dataset.getRowIndex(row) == -1) {
                            dataset.addValue(Double.valueOf(valor).doubleValue(), row, column);
                        } else {
                            dataset.incrementValue(Double.valueOf(valor).doubleValue(), row, column);
                        }
                    }
                }
            } catch (ArrayIndexOutOfBoundsException exp) {
                JOptionPane.showMessageDialog(this,
                        "The data set contains some errors. This attribute can not be visualized", "Error", 2);
            }
            this.chart2 = ChartFactory.createBarChart3D("",
                    ((VisualizePanel) (this.getParent()).getParent()).getData()
                            .getAttributeIndex(this.attribute2jComboBox.getSelectedIndex()),
                    ((VisualizePanel) (this.getParent()).getParent()).getData()
                            .getAttributeIndex(this.attribute1jComboBox.getSelectedIndex()),
                    dataset, PlotOrientation.HORIZONTAL, legend, false, false);
            this.chart2.setTitle(this.attribute1jComboBox.getSelectedItem().toString() + " vs "
                    + this.attribute2jComboBox.getSelectedItem().toString());
            this.chart2.setBackgroundPaint(new Color(0xFFFFFF));
            BufferedImage image = this.chart2.createBufferedImage(579, 330);
            this.imagejLabel.setIcon(new ImageIcon(image));
            this.topdfjButton.setEnabled(true);
            this.topngjButton.setEnabled(true);
        } else {
            XYSeriesCollection juegoDatos = new XYSeriesCollection();
            boolean legend = false;
            if (((VisualizePanel) (this.getParent()).getParent()).getOutAttribute() != -1) {
                legend = true;
                Vector outputRang = ((VisualizePanel) (this.getParent()).getParent()).getData()
                        .getRange(((VisualizePanel) (this.getParent()).getParent()).getOutAttribute());
                XYSeries series[] = new XYSeries[outputRang.size()];
                for (int i = 0; i < outputRang.size(); i++) {
                    series[i] = new XYSeries("Class " + outputRang.elementAt(i));
                    juegoDatos.addSeries(series[i]);
                }
                for (int i = 0; i < ((VisualizePanel) (this.getParent()).getParent()).getData().getNData(); i++) {
                    int clase = outputRang.indexOf(((VisualizePanel) (this.getParent()).getParent()).getData()
                            .getDataIndex(i, ((VisualizePanel) (this.getParent()).getParent()).getOutAttribute()));
                    String valor1 = ((VisualizePanel) (this.getParent()).getParent()).getData().getDataIndex(i,
                            this.attribute1jComboBox.getSelectedIndex());
                    String valor2 = ((VisualizePanel) (this.getParent()).getParent()).getData().getDataIndex(i,
                            this.attribute2jComboBox.getSelectedIndex());
                    if (valor1 != null) {
                        series[clase].add(Double.valueOf(valor1).doubleValue(),
                                Double.valueOf(valor2).doubleValue());
                    }
                }
            } else {
                XYSeries series = new XYSeries("Regresin");
                juegoDatos.addSeries(series);
                for (int i = 0; i < ((VisualizePanel) (this.getParent()).getParent()).getData().getNData(); i++) {
                    String valor1 = ((VisualizePanel) (this.getParent()).getParent()).getData().getDataIndex(i,
                            this.attribute1jComboBox.getSelectedIndex());
                    String valor2 = ((VisualizePanel) (this.getParent()).getParent()).getData().getDataIndex(i,
                            this.attribute2jComboBox.getSelectedIndex());
                    if (valor1 != null) {
                        series.add(Double.valueOf(valor1).doubleValue(), Double.valueOf(valor2).doubleValue());
                    }
                }

            }
            // Numeric values
            this.chart2 = ChartFactory.createScatterPlot("",
                    ((VisualizePanel) (this.getParent()).getParent()).getData()
                            .getAttributeIndex(this.attribute1jComboBox.getSelectedIndex()),
                    ((VisualizePanel) (this.getParent()).getParent()).getData()
                            .getAttributeIndex(this.attribute2jComboBox.getSelectedIndex()),
                    juegoDatos, PlotOrientation.VERTICAL, legend, false, false);
            this.chart2.setTitle(this.attribute1jComboBox.getSelectedItem().toString() + " vs "
                    + this.attribute2jComboBox.getSelectedItem().toString());
            this.chart2.setBackgroundPaint(new Color(0xFFFFFF));
            BufferedImage image = this.chart2.createBufferedImage(579, 330);
            this.imagejLabel.setIcon(new ImageIcon(image));
            this.topdfjButton.setEnabled(true);
            this.topngjButton.setEnabled(true);
        }
    }//GEN-LAST:event_ViewChartjButtonActionPerformed

    private void imagejLabelMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_imagejLabelMouseClicked
        if (this.chart2 != null) {
            ChartFrame frame = new ChartFrame("Attribute comparison", chart2, true);
            frame.pack();
            frame.setBackground(new Color(225, 225, 225));
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            Dimension frameSize = frame.getSize();
            if (frameSize.height > screenSize.height) {
                frameSize.height = screenSize.height;
            }
            if (frameSize.width > screenSize.width) {
                frameSize.width = screenSize.width;
            }
            frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
            frame.setIconImage(Toolkit.getDefaultToolkit()
                    .getImage(this.getClass().getResource("/keel/GraphInterKeel/resources/ico/logo/logo.gif")));
            frame.setVisible(true);
        }
    }//GEN-LAST:event_imagejLabelMouseClicked

    private void topngjButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_topngjButtonActionPerformed
        // Save chart as a PNG image
        JFileChooser chooser = new JFileChooser();
        chooser.setDialogTitle("Save chart");
        KeelFileFilter fileFilter = new KeelFileFilter();
        fileFilter.addExtension("png");
        fileFilter.setFilterName("PNG images (.png)");
        chooser.setFileFilter(fileFilter);
        chooser.setCurrentDirectory(Path.getFilePath());
        int opcion = chooser.showSaveDialog(this);
        Path.setFilePath(chooser.getCurrentDirectory());

        if (opcion == JFileChooser.APPROVE_OPTION) {
            String nombre = chooser.getSelectedFile().getAbsolutePath();
            if (!nombre.toLowerCase().endsWith(".png")) {
                // Add correct extension
                nombre += ".png";
            }
            File tmp = new File(nombre);
            if (!tmp.exists() || JOptionPane.showConfirmDialog(this,
                    "File " + nombre + " already exists. Do you want to replace it?", "Confirm",
                    JOptionPane.YES_NO_OPTION, 3) == JOptionPane.YES_OPTION) {
                try {
                    chart2.setBackgroundPaint(Color.white);
                    ChartUtilities.saveChartAsPNG(new File(nombre), chart2, 1024, 768);
                } catch (Exception exc) {
                }
            }
        }
    }//GEN-LAST:event_topngjButtonActionPerformed

    private void topdfjButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_topdfjButtonActionPerformed
        // Save chart as a PDF file
        JFileChooser chooser = new JFileChooser();
        chooser.setDialogTitle("Save chart");
        KeelFileFilter fileFilter = new KeelFileFilter();
        fileFilter.addExtension("pdf");
        fileFilter.setFilterName("PDF images (.pdf)");
        chooser.setFileFilter(fileFilter);
        chooser.setCurrentDirectory(Path.getFilePath());
        int opcion = chooser.showSaveDialog(this);
        Path.setFilePath(chooser.getCurrentDirectory());
        if (opcion == JFileChooser.APPROVE_OPTION) {
            String nombre = chooser.getSelectedFile().getAbsolutePath();
            if (!nombre.toLowerCase().endsWith(".pdf")) {
                // Add correct extension
                nombre += ".pdf";
            }
            File tmp = new File(nombre);
            if (!tmp.exists() || JOptionPane.showConfirmDialog(this,
                    "File " + nombre + " already exists. Do you want to replace it?", "Confirm",
                    JOptionPane.YES_NO_OPTION, 3) == JOptionPane.YES_OPTION) {
                try {
                    Document document = new Document();
                    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(nombre));
                    document.addAuthor("KEEL");
                    document.addSubject("Attribute comparison");
                    document.open();
                    PdfContentByte cb = writer.getDirectContent();
                    PdfTemplate tp = cb.createTemplate(550, 412);
                    Graphics2D g2 = tp.createGraphics(550, 412, new DefaultFontMapper());
                    Rectangle2D r2D = new Rectangle2D.Double(0, 0, 550, 412);
                    chart2.setBackgroundPaint(Color.white);
                    chart2.draw(g2, r2D);
                    g2.dispose();
                    cb.addTemplate(tp, 20, 350);
                    document.close();
                } catch (Exception exc) {
                }
            }
        }
    }//GEN-LAST:event_topdfjButtonActionPerformed
     // Variables declaration - do not modify//GEN-BEGIN:variables

    private javax.swing.JButton ViewChartjButton;
    private javax.swing.JPanel ViewChartjPanel;
    private javax.swing.JComboBox attribute1jComboBox;
    private javax.swing.JLabel attribute1jLabel;
    private javax.swing.JComboBox attribute2jComboBox;
    private javax.swing.JLabel attribute2jLabel;
    private javax.swing.JScrollPane chartjScrollPane;
    private javax.swing.JLabel imagejLabel;
    private javax.swing.JLabel pdfjLabel;
    private javax.swing.JLabel pngjLabel;
    private javax.swing.JPanel selectAttributesjPanel;
    private javax.swing.JButton topdfjButton;
    private javax.swing.JButton topngjButton;
    // End of variables declaration//GEN-END:variables

    /** JFreeChart */
    protected JFreeChart chart2;

    /**
     * <p>
     * Sets a JFreeChart chart
     * </p>
     * @param chart JFreechart for image
     */
    public void setChart(JFreeChart chart) {
        this.chart2 = chart;
    }

    /**
     * <p>
     * Gets a JFreeChart from the image
     * </p>
     * @return JFreeChart from the image
     */
    public JFreeChart getChart() {
        return this.chart2;
    }

    /**
     * <p>
     * Detetes all attributes from the first combo box
     * </p>
     */
    public void deteleteAttributes1() {
        this.attribute1jComboBox.removeAllItems();
    }

    /**
     * <p>
     * Adds attributes to the first combo box
     * </p>
     * @param attribute1 Attribute to add
     */
    public void addAtribute1(String attribute1) {
        this.attribute1jComboBox.addItem(attribute1);
    }

    /**
     * <p>
     * Deletes all attributes from the second combo box
     * </p>
     */
    public void deteleteAttributes2() {
        this.attribute2jComboBox.removeAllItems();
    }

    /**
     * <p>
     * Adds attributes to the second combo box
     * </p>
     * @param attribute2 Attribute to add
     */
    public void addAtribute2(String attribute2) {
        this.attribute2jComboBox.addItem(attribute2);
    }

    /**
     * <p>
     * Sets the image for attributes
     * </p>
     * @param image Image for attributes
     */
    public void setImage(BufferedImage image) {
        if (image == null) {
            this.imagejLabel.setIcon(null);
        } else {
            this.imagejLabel.setIcon(new ImageIcon(image));
        }
    }

    /**
     * <p>
     * Enables png format
     * </p>
     * @param value State of enabling png format
     */
    public void enablePNG(boolean value) {
        this.topngjButton.setEnabled(value);
    }

    /**
     * <p>
     * Enables pdf format
     * </p>
     * @param value State of enabling pdf format
     */
    public void enablePDF(boolean value) {
        this.topdfjButton.setEnabled(value);
    }
}