/** gets the data from GUI components. */
  private void getData() {
    if (m_IgnoreChanges) return;

    // format
    try {
      if (!m_ResultMatrix
          .getClass()
          .equals(m_OutputFormatClasses.get(m_OutputFormatComboBox.getSelectedIndex()))) {
        if (m_OutputFormatClasses
            .get(m_OutputFormatComboBox.getSelectedIndex())
            .equals(ExperimenterDefaults.getOutputFormat().getClass()))
          m_ResultMatrix = ExperimenterDefaults.getOutputFormat();
        else
          m_ResultMatrix =
              (ResultMatrix)
                  ((Class) m_OutputFormatClasses.get(m_OutputFormatComboBox.getSelectedIndex()))
                      .newInstance();
      }
    } catch (Exception e) {
      e.printStackTrace();
      m_ResultMatrix = new ResultMatrixPlainText();
    }

    // Precision
    m_ResultMatrix.setMeanPrec(Integer.parseInt(m_MeanPrecSpinner.getValue().toString()));
    m_ResultMatrix.setStdDevPrec(Integer.parseInt(m_StdDevPrecSpinner.getValue().toString()));

    // average
    m_ResultMatrix.setShowAverage(m_ShowAverageCheckBox.isSelected());

    // filter names
    m_ResultMatrix.setRemoveFilterName(m_RemoveFilterNameCheckBox.isSelected());

    // update GOE
    m_ResultMatrixEditor.setValue(m_ResultMatrix);
  }
Exemple #2
0
  /** Carries out a t-test using the current configuration. */
  protected void performTest() {

    String sigStr = m_SigTex.getText();
    if (sigStr.length() != 0) {
      m_TTester.setSignificanceLevel((new Double(sigStr)).doubleValue());
    } else {
      m_TTester.setSignificanceLevel(ExperimenterDefaults.getSignificance());
    }

    // Carry out the test chosen and biff the results to the output area
    m_TTester.setShowStdDevs(m_ShowStdDevs.isSelected());
    if (m_Instances.attribute(m_SortCombo.getSelectedItem().toString()) != null)
      m_TTester.setSortColumn(
          m_Instances.attribute(m_SortCombo.getSelectedItem().toString()).index());
    else m_TTester.setSortColumn(-1);
    int compareCol = m_CompareCombo.getSelectedIndex();
    int tType = m_TestsList.getSelectedIndex();

    String name =
        (new SimpleDateFormat("HH:mm:ss - ")).format(new Date())
            + (String) m_CompareCombo.getSelectedItem()
            + " - "
            + (String) m_TestsList.getSelectedValue();
    StringBuffer outBuff = new StringBuffer();
    outBuff.append(m_TTester.header(compareCol));
    outBuff.append("\n");
    m_History.addResult(name, outBuff);
    m_History.setSingle(name);
    m_TTester.setDisplayedResultsets(m_DisplayedList.getSelectedIndices());
    m_TTester.setResultMatrix(m_ResultMatrix);
    try {
      if (tType < m_TTester.getNumResultsets()) {
        outBuff.append(m_TTester.multiResultsetFull(tType, compareCol));
      } else if (tType == m_TTester.getNumResultsets()) {
        outBuff.append(m_TTester.multiResultsetSummary(compareCol));
      } else {
        outBuff.append(m_TTester.multiResultsetRanking(compareCol));
      }
      outBuff.append("\n");
    } catch (Exception ex) {
      outBuff.append(ex.getMessage() + "\n");
    }
    m_History.updateResult(name);
  }
Exemple #3
0
  /**
   * Sets up the panel with a new set of instances, attempting to guess the correct settings for
   * various columns.
   *
   * @param newInstances the new set of results.
   */
  public void setInstances(Instances newInstances) {

    m_Instances = newInstances;
    m_TTester.setInstances(m_Instances);
    m_FromLab.setText("Got " + m_Instances.numInstances() + " results");

    // setup row and column names
    Vector rows = determineColumnNames(ExperimenterDefaults.getRow(), "Key_Dataset", m_Instances);
    Vector cols =
        determineColumnNames(
            ExperimenterDefaults.getColumn(),
            "Key_Scheme,Key_Scheme_options,Key_Scheme_version_ID",
            m_Instances);

    // Do other stuff
    m_DatasetKeyModel.removeAllElements();
    m_ResultKeyModel.removeAllElements();
    m_CompareModel.removeAllElements();
    m_SortModel.removeAllElements();
    m_SortModel.addElement("<default>");
    m_TTester.setSortColumn(-1);
    String selectedList = "";
    String selectedListDataset = "";
    boolean comparisonFieldSet = false;
    for (int i = 0; i < m_Instances.numAttributes(); i++) {
      String name = m_Instances.attribute(i).name();
      if (name.toLowerCase().startsWith("key_", 0)) {
        m_DatasetKeyModel.addElement(name.substring(4));
        m_ResultKeyModel.addElement(name.substring(4));
        m_CompareModel.addElement(name.substring(4));
      } else {
        m_DatasetKeyModel.addElement(name);
        m_ResultKeyModel.addElement(name);
        m_CompareModel.addElement(name);
        if (m_Instances.attribute(i).isNumeric()) m_SortModel.addElement(name);
      }

      if (rows.contains(name.toLowerCase())) {
        m_DatasetKeyList.addSelectionInterval(i, i);
        selectedListDataset += "," + (i + 1);
      } else if (name.toLowerCase().equals("key_run")) {
        m_TTester.setRunColumn(i);
      } else if (name.toLowerCase().equals("key_fold")) {
        m_TTester.setFoldColumn(i);
      } else if (cols.contains(name.toLowerCase())) {
        m_ResultKeyList.addSelectionInterval(i, i);
        selectedList += "," + (i + 1);
      } else if (name.toLowerCase().indexOf(ExperimenterDefaults.getComparisonField()) != -1) {
        m_CompareCombo.setSelectedIndex(i);
        comparisonFieldSet = true;
        //	break;
      } else if ((name.toLowerCase().indexOf("root_relative_squared_error") != -1)
          && (!comparisonFieldSet)) {
        m_CompareCombo.setSelectedIndex(i);
        comparisonFieldSet = true;
      }
    }
    m_TesterClasses.setEnabled(true);
    m_DatasetKeyBut.setEnabled(true);
    m_ResultKeyBut.setEnabled(true);
    m_SwapDatasetKeyAndResultKeyBut.setEnabled(true);
    m_CompareCombo.setEnabled(true);
    m_SortCombo.setEnabled(true);
    if (ExperimenterDefaults.getSorting().length() != 0)
      setSelectedItem(m_SortCombo, ExperimenterDefaults.getSorting());

    Range generatorRange = new Range();
    if (selectedList.length() != 0) {
      try {
        generatorRange.setRanges(selectedList);
      } catch (Exception ex) {
        ex.printStackTrace();
        System.err.println(ex.getMessage());
      }
    }
    m_TTester.setResultsetKeyColumns(generatorRange);

    generatorRange = new Range();
    if (selectedListDataset.length() != 0) {
      try {
        generatorRange.setRanges(selectedListDataset);
      } catch (Exception ex) {
        ex.printStackTrace();
        System.err.println(ex.getMessage());
      }
    }
    m_TTester.setDatasetKeyColumns(generatorRange);

    m_SigTex.setEnabled(true);

    setTTester();
  }
Exemple #4
0
/**
 * This panel controls simple analysis of experimental results.
 *
 * @author Len Trigg ([email protected])
 * @version $Revision: 6087 $
 */
public class ResultsPanel extends JPanel {

  /** for serialization. */
  private static final long serialVersionUID = -4913007978534178569L;

  /** Message shown when no experimental results have been loaded. */
  protected static final String NO_SOURCE = "No source";

  /** Click to load results from a file. */
  protected JButton m_FromFileBut = new JButton("File...");

  /** Click to load results from a database. */
  protected JButton m_FromDBaseBut = new JButton("Database...");

  /** Click to get results from the destination given in the experiment. */
  protected JButton m_FromExpBut = new JButton("Experiment");

  /** Displays a message about the current result set. */
  protected JLabel m_FromLab = new JLabel(NO_SOURCE);

  /**
   * This is needed to get around a bug in Swing <= 1.1 -- Once everyone is using Swing 1.1.1 or
   * higher just remove this variable and use the no-arg constructor to DefaultComboBoxModel.
   */
  private static String[] FOR_JFC_1_1_DCBM_BUG = {""};

  /** The model embedded in m_DatasetCombo. */
  protected DefaultComboBoxModel m_DatasetModel = new DefaultComboBoxModel(FOR_JFC_1_1_DCBM_BUG);

  /** The model embedded in m_CompareCombo. */
  protected DefaultComboBoxModel m_CompareModel = new DefaultComboBoxModel(FOR_JFC_1_1_DCBM_BUG);

  /** The model embedded in m_SortCombo. */
  protected DefaultComboBoxModel m_SortModel = new DefaultComboBoxModel(FOR_JFC_1_1_DCBM_BUG);

  /** The model embedded in m_TestsList. */
  protected DefaultListModel m_TestsModel = new DefaultListModel();

  /** The model embedded in m_DisplayedList. */
  protected DefaultListModel m_DisplayedModel = new DefaultListModel();

  /** Displays the currently selected Tester-Class. */
  protected JLabel m_TesterClassesLabel = new JLabel("Testing with", SwingConstants.RIGHT);

  /**
   * Contains all the available classes implementing the Tester-Interface (the display names).
   *
   * @see Tester
   */
  protected static DefaultComboBoxModel m_TesterClassesModel =
      new DefaultComboBoxModel(FOR_JFC_1_1_DCBM_BUG);

  /**
   * Contains all the available classes implementing the Tester-Interface (the actual Classes).
   *
   * @see Tester
   */
  protected static Vector m_Testers = null;

  /**
   * determine all classes implementing the Tester interface (in the same package!).
   *
   * @see Tester
   * @see ClassDiscovery
   */
  static {
    Vector classes = GenericObjectEditor.getClassnames(Tester.class.getName());

    // set names and classes
    m_Testers = new Vector();
    m_TesterClassesModel = new DefaultComboBoxModel();
    for (int i = 0; i < classes.size(); i++) {
      try {
        Class cls = Class.forName(classes.get(i).toString());
        Tester tester = (Tester) cls.newInstance();
        m_Testers.add(cls);
        m_TesterClassesModel.addElement(tester.getDisplayName());
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }

  /**
   * Lists all the available classes implementing the Tester-Interface.
   *
   * @see Tester
   */
  protected JComboBox m_TesterClasses = new JComboBox(m_TesterClassesModel);

  /** Label for the dataset and result key buttons. */
  protected JLabel m_DatasetAndResultKeysLabel =
      new JLabel("Select rows and cols", SwingConstants.RIGHT);

  /** the panel encapsulating the Rows/Columns/Swap buttons. */
  protected JPanel m_PanelDatasetResultKeys = new JPanel(new GridLayout(1, 3));

  /** Click to edit the columns used to determine the scheme. */
  protected JButton m_DatasetKeyBut = new JButton("Rows");

  /** Stores the list of attributes for selecting the scheme columns. */
  protected DefaultListModel m_DatasetKeyModel = new DefaultListModel();

  /** Displays the list of selected columns determining the scheme. */
  protected JList m_DatasetKeyList = new JList(m_DatasetKeyModel);

  /** Click to edit the columns used to determine the scheme. */
  protected JButton m_ResultKeyBut = new JButton("Cols");

  /** For swapping rows and columns. */
  protected JButton m_SwapDatasetKeyAndResultKeyBut = new JButton("Swap");

  /** Stores the list of attributes for selecting the scheme columns. */
  protected DefaultListModel m_ResultKeyModel = new DefaultListModel();

  /** Displays the list of selected columns determining the scheme. */
  protected JList m_ResultKeyList = new JList(m_ResultKeyModel);

  /** Lets the user select which scheme to base comparisons against. */
  protected JButton m_TestsButton = new JButton("Select");

  /** Lets the user select which schemes are compared to base. */
  protected JButton m_DisplayedButton = new JButton("Select");

  /** Holds the list of schemes to base the test against. */
  protected JList m_TestsList = new JList(m_TestsModel);

  /** Holds the list of schemes to display. */
  protected JList m_DisplayedList = new JList(m_DisplayedModel);

  /** Lets the user select which performance measure to analyze. */
  protected JComboBox m_CompareCombo = new JComboBox(m_CompareModel);

  /** Lets the user select which column to use for sorting. */
  protected JComboBox m_SortCombo = new JComboBox(m_SortModel);

  /** Lets the user edit the test significance. */
  protected JTextField m_SigTex = new JTextField("" + ExperimenterDefaults.getSignificance());

  /** Lets the user select whether standard deviations are to be output or not. */
  protected JCheckBox m_ShowStdDevs = new JCheckBox("");

  /** lets the user choose the format for the output. */
  protected JButton m_OutputFormatButton = new JButton("Select");

  /** Click to start the test. */
  protected JButton m_PerformBut = new JButton("Perform test");

  /** Click to save test output to a file. */
  protected JButton m_SaveOutBut = new JButton("Save output");

  /** The buffer saving object for saving output. */
  SaveBuffer m_SaveOut = new SaveBuffer(null, this);

  /** Displays the output of tests. */
  protected JTextArea m_OutText = new JTextArea();

  /** A panel controlling results viewing. */
  protected ResultHistoryPanel m_History = new ResultHistoryPanel(m_OutText);

  /** The file chooser for selecting result files. */
  protected JFileChooser m_FileChooser = new JFileChooser(new File(System.getProperty("user.dir")));

  // File filters for various file types.
  /** CSV file filter. */
  protected ExtensionFileFilter m_csvFileFilter =
      new ExtensionFileFilter(CSVLoader.FILE_EXTENSION, "CSV data files");

  /** ARFF file filter. */
  protected ExtensionFileFilter m_arffFileFilter =
      new ExtensionFileFilter(Instances.FILE_EXTENSION, "Arff data files");

  /** The PairedTTester object. */
  protected Tester m_TTester = new PairedCorrectedTTester();

  /** The instances we're extracting results from. */
  protected Instances m_Instances;

  /** Does any database querying for us. */
  protected InstanceQuery m_InstanceQuery;

  /** A thread to load results instances from a file or database. */
  protected Thread m_LoadThread;

  /** An experiment (used for identifying a result source) -- optional. */
  protected Experiment m_Exp;

  /** the size for a combobox. */
  private Dimension COMBO_SIZE = new Dimension(210, m_ResultKeyBut.getPreferredSize().height);

  /** the initial result matrix. */
  protected ResultMatrix m_ResultMatrix = new ResultMatrixPlainText();

  /** Creates the results panel with no initial experiment. */
  public ResultsPanel() {

    // defaults
    m_TTester.setSignificanceLevel(ExperimenterDefaults.getSignificance());
    m_TTester.setShowStdDevs(ExperimenterDefaults.getShowStdDevs());
    m_ResultMatrix = ExperimenterDefaults.getOutputFormat();
    m_ResultMatrix.setShowStdDev(ExperimenterDefaults.getShowStdDevs());
    m_ResultMatrix.setMeanPrec(ExperimenterDefaults.getMeanPrecision());
    m_ResultMatrix.setStdDevPrec(ExperimenterDefaults.getStdDevPrecision());
    m_ResultMatrix.setRemoveFilterName(ExperimenterDefaults.getRemoveFilterClassnames());
    m_ResultMatrix.setShowAverage(ExperimenterDefaults.getShowAverage());

    // Create/Configure/Connect components

    m_FileChooser.addChoosableFileFilter(m_csvFileFilter);
    m_FileChooser.addChoosableFileFilter(m_arffFileFilter);

    m_FileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
    m_FromExpBut.setEnabled(false);
    m_FromExpBut.setMnemonic('E');
    m_FromExpBut.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            if (m_LoadThread == null) {
              m_LoadThread =
                  new Thread() {
                    public void run() {
                      setInstancesFromExp(m_Exp);
                      m_LoadThread = null;
                    }
                  };
              m_LoadThread.start();
            }
          }
        });
    m_FromDBaseBut.setMnemonic('D');
    m_FromDBaseBut.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            if (m_LoadThread == null) {
              m_LoadThread =
                  new Thread() {
                    public void run() {
                      setInstancesFromDBaseQuery();
                      m_LoadThread = null;
                    }
                  };
              m_LoadThread.start();
            }
          }
        });
    m_FromFileBut.setMnemonic('F');
    m_FromFileBut.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            int returnVal = m_FileChooser.showOpenDialog(ResultsPanel.this);
            if (returnVal == JFileChooser.APPROVE_OPTION) {
              final File selected = m_FileChooser.getSelectedFile();
              if (m_LoadThread == null) {
                m_LoadThread =
                    new Thread() {
                      public void run() {
                        setInstancesFromFile(selected);
                        m_LoadThread = null;
                      }
                    };
                m_LoadThread.start();
              }
            }
          }
        });
    setComboSizes();
    m_TesterClasses.setEnabled(false);
    m_DatasetKeyBut.setEnabled(false);
    m_DatasetKeyBut.setToolTipText("For selecting the keys that are shown as rows.");
    m_DatasetKeyBut.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            setDatasetKeyFromDialog();
          }
        });
    m_DatasetKeyList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    m_ResultKeyBut.setEnabled(false);
    m_ResultKeyBut.setToolTipText("For selecting the keys that are shown as columns.");
    m_ResultKeyBut.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            setResultKeyFromDialog();
          }
        });
    m_ResultKeyList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    m_SwapDatasetKeyAndResultKeyBut.setEnabled(false);
    m_SwapDatasetKeyAndResultKeyBut.setToolTipText(
        "Swaps the keys for selecting rows and columns.");
    m_SwapDatasetKeyAndResultKeyBut.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            swapDatasetKeyAndResultKey();
          }
        });
    m_CompareCombo.setEnabled(false);
    m_SortCombo.setEnabled(false);

    m_SigTex.setEnabled(false);
    m_TestsButton.setEnabled(false);
    m_TestsButton.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            setTestBaseFromDialog();
          }
        });

    m_DisplayedButton.setEnabled(false);
    m_DisplayedButton.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            setDisplayedFromDialog();
          }
        });

    m_ShowStdDevs.setEnabled(false);
    m_ShowStdDevs.setSelected(ExperimenterDefaults.getShowStdDevs());
    m_OutputFormatButton.setEnabled(false);
    m_OutputFormatButton.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            setOutputFormatFromDialog();
          }
        });

    m_PerformBut.setEnabled(false);
    m_PerformBut.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            performTest();
            m_SaveOutBut.setEnabled(true);
          }
        });

    m_PerformBut.setToolTipText(m_TTester.getToolTipText());

    m_SaveOutBut.setEnabled(false);
    m_SaveOutBut.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            saveBuffer();
          }
        });
    m_OutText.setFont(new Font("Monospaced", Font.PLAIN, 12));
    m_OutText.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    m_OutText.setEditable(false);
    m_History.setBorder(BorderFactory.createTitledBorder("Result list"));

    // Set up the GUI layout
    JPanel p1 = new JPanel();
    p1.setBorder(BorderFactory.createTitledBorder("Source"));
    JPanel p2 = new JPanel();
    GridBagLayout gb = new GridBagLayout();
    GridBagConstraints constraints = new GridBagConstraints();
    p2.setBorder(BorderFactory.createEmptyBorder(5, 5, 10, 5));
    //    p2.setLayout(new GridLayout(1, 3));
    p2.setLayout(gb);
    constraints.gridx = 0;
    constraints.gridy = 0;
    constraints.weightx = 5;
    constraints.fill = GridBagConstraints.HORIZONTAL;
    constraints.gridwidth = 1;
    constraints.gridheight = 1;
    constraints.insets = new Insets(0, 2, 0, 2);
    p2.add(m_FromFileBut, constraints);
    constraints.gridx = 1;
    constraints.gridy = 0;
    constraints.weightx = 5;
    constraints.gridwidth = 1;
    constraints.gridheight = 1;
    p2.add(m_FromDBaseBut, constraints);
    constraints.gridx = 2;
    constraints.gridy = 0;
    constraints.weightx = 5;
    constraints.gridwidth = 1;
    constraints.gridheight = 1;
    p2.add(m_FromExpBut, constraints);
    p1.setLayout(new BorderLayout());
    p1.add(m_FromLab, BorderLayout.CENTER);
    p1.add(p2, BorderLayout.EAST);

    JPanel p3 = new JPanel();
    p3.setBorder(BorderFactory.createTitledBorder("Configure test"));
    GridBagLayout gbL = new GridBagLayout();
    p3.setLayout(gbL);

    int y = 0;
    GridBagConstraints gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.EAST;
    gbC.gridy = y;
    gbC.gridx = 0;
    gbC.insets = new Insets(2, 10, 2, 10);
    gbL.setConstraints(m_TesterClassesLabel, gbC);
    m_TesterClassesLabel.setDisplayedMnemonic('w');
    m_TesterClassesLabel.setLabelFor(m_TesterClasses);
    p3.add(m_TesterClassesLabel);
    gbC = new GridBagConstraints();
    gbC.gridy = y;
    gbC.gridx = 1;
    gbC.weightx = 100;
    gbC.insets = new Insets(5, 0, 5, 0);
    gbC.fill = GridBagConstraints.HORIZONTAL;
    gbL.setConstraints(m_TesterClasses, gbC);
    p3.add(m_TesterClasses);
    m_TesterClasses.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            setTester();
          }
        });
    setSelectedItem(m_TesterClasses, ExperimenterDefaults.getTester());

    y++;
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.EAST;
    gbC.gridy = y;
    gbC.gridx = 0;
    gbC.insets = new Insets(2, 10, 2, 10);
    gbL.setConstraints(m_DatasetAndResultKeysLabel, gbC);
    m_DatasetAndResultKeysLabel.setDisplayedMnemonic('R');
    m_DatasetAndResultKeysLabel.setLabelFor(m_DatasetKeyBut);
    p3.add(m_DatasetAndResultKeysLabel);

    m_PanelDatasetResultKeys.add(m_DatasetKeyBut);
    m_PanelDatasetResultKeys.add(m_ResultKeyBut);
    m_PanelDatasetResultKeys.add(m_SwapDatasetKeyAndResultKeyBut);
    gbC = new GridBagConstraints();
    gbC.fill = GridBagConstraints.HORIZONTAL;
    gbC.gridy = y;
    gbC.gridx = 1;
    gbC.weightx = 100;
    gbC.insets = new Insets(5, 0, 5, 0);
    gbL.setConstraints(m_PanelDatasetResultKeys, gbC);
    p3.add(m_PanelDatasetResultKeys);

    y++;
    JLabel lab = new JLabel("Comparison field", SwingConstants.RIGHT);
    lab.setDisplayedMnemonic('m');
    lab.setLabelFor(m_CompareCombo);
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.EAST;
    gbC.gridy = y;
    gbC.gridx = 0;
    gbC.insets = new Insets(2, 10, 2, 10);
    gbL.setConstraints(lab, gbC);
    p3.add(lab);
    gbC = new GridBagConstraints();
    gbC.gridy = y;
    gbC.gridx = 1;
    gbC.weightx = 100;
    gbC.insets = new Insets(5, 0, 5, 0);
    gbC.fill = GridBagConstraints.HORIZONTAL;
    gbL.setConstraints(m_CompareCombo, gbC);
    p3.add(m_CompareCombo);

    y++;
    lab = new JLabel("Significance", SwingConstants.RIGHT);
    lab.setDisplayedMnemonic('g');
    lab.setLabelFor(m_SigTex);
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.EAST;
    gbC.gridy = y;
    gbC.gridx = 0;
    gbC.insets = new Insets(2, 10, 2, 10);
    gbL.setConstraints(lab, gbC);
    p3.add(lab);
    gbC = new GridBagConstraints();
    gbC.fill = GridBagConstraints.HORIZONTAL;
    gbC.gridy = y;
    gbC.gridx = 1;
    gbC.weightx = 100;
    gbL.setConstraints(m_SigTex, gbC);
    p3.add(m_SigTex);

    y++;
    lab = new JLabel("Sorting (asc.) by", SwingConstants.RIGHT);
    lab.setDisplayedMnemonic('S');
    lab.setLabelFor(m_SortCombo);
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.EAST;
    gbC.gridy = y;
    gbC.gridx = 0;
    gbC.insets = new Insets(2, 10, 2, 10);
    gbL.setConstraints(lab, gbC);
    p3.add(lab);
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.WEST;
    gbC.fill = GridBagConstraints.HORIZONTAL;
    gbC.gridy = y;
    gbC.gridx = 1;
    gbC.weightx = 100;
    gbC.insets = new Insets(5, 0, 5, 0);
    gbL.setConstraints(m_SortCombo, gbC);
    p3.add(m_SortCombo);

    y++;
    lab = new JLabel("Test base", SwingConstants.RIGHT);
    lab.setDisplayedMnemonic('b');
    lab.setLabelFor(m_TestsButton);
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.EAST;
    gbC.gridy = y;
    gbC.gridx = 0;
    gbC.insets = new Insets(2, 10, 2, 10);
    gbL.setConstraints(lab, gbC);
    p3.add(lab);
    gbC = new GridBagConstraints();
    gbC.fill = GridBagConstraints.HORIZONTAL;
    gbC.gridy = y;
    gbC.gridx = 1;
    gbC.weightx = 100;
    gbC.insets = new Insets(5, 0, 5, 0);
    gbL.setConstraints(m_TestsButton, gbC);
    p3.add(m_TestsButton);

    y++;
    lab = new JLabel("Displayed Columns", SwingConstants.RIGHT);
    lab.setDisplayedMnemonic('i');
    lab.setLabelFor(m_DisplayedButton);
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.EAST;
    gbC.gridy = y;
    gbC.gridx = 0;
    gbC.insets = new Insets(2, 10, 2, 10);
    gbL.setConstraints(lab, gbC);
    p3.add(lab);
    gbC = new GridBagConstraints();
    gbC.fill = GridBagConstraints.HORIZONTAL;
    gbC.gridy = y;
    gbC.gridx = 1;
    gbC.weightx = 100;
    gbC.insets = new Insets(5, 0, 5, 0);
    gbL.setConstraints(m_DisplayedButton, gbC);
    p3.add(m_DisplayedButton);

    y++;
    lab = new JLabel("Show std. deviations", SwingConstants.RIGHT);
    lab.setDisplayedMnemonic('a');
    lab.setLabelFor(m_ShowStdDevs);
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.EAST;
    gbC.gridy = y;
    gbC.gridx = 0;
    gbC.insets = new Insets(2, 10, 2, 10);
    gbL.setConstraints(lab, gbC);
    p3.add(lab);
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.WEST;
    gbC.gridy = y;
    gbC.gridx = 1;
    gbC.weightx = 100;
    gbC.insets = new Insets(5, 0, 5, 0);
    gbL.setConstraints(m_ShowStdDevs, gbC);
    p3.add(m_ShowStdDevs);

    y++;
    lab = new JLabel("Output Format", SwingConstants.RIGHT);
    lab.setDisplayedMnemonic('O');
    lab.setLabelFor(m_OutputFormatButton);
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.EAST;
    gbC.gridy = y;
    gbC.gridx = 0;
    gbC.insets = new Insets(2, 10, 2, 10);
    gbL.setConstraints(lab, gbC);
    p3.add(lab);
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.WEST;
    gbC.fill = GridBagConstraints.HORIZONTAL;
    gbC.gridy = y;
    gbC.gridx = 1;
    gbC.weightx = 100;
    gbC.insets = new Insets(5, 0, 5, 0);
    gbL.setConstraints(m_OutputFormatButton, gbC);
    p3.add(m_OutputFormatButton);

    JPanel output = new JPanel();
    output.setLayout(new BorderLayout());
    output.setBorder(BorderFactory.createTitledBorder("Test output"));
    output.add(new JScrollPane(m_OutText), BorderLayout.CENTER);

    JPanel mondo = new JPanel();
    gbL = new GridBagLayout();
    mondo.setLayout(gbL);
    gbC = new GridBagConstraints();
    //    gbC.anchor = GridBagConstraints.WEST;
    //    gbC.fill = GridBagConstraints.HORIZONTAL;
    gbC.gridy = 0;
    gbC.gridx = 0;
    gbL.setConstraints(p3, gbC);
    mondo.add(p3);

    JPanel bts = new JPanel();
    m_PerformBut.setMnemonic('t');
    m_SaveOutBut.setMnemonic('S');
    bts.setLayout(new GridLayout(1, 2, 5, 5));
    bts.add(m_PerformBut);
    bts.add(m_SaveOutBut);

    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.NORTH;
    gbC.fill = GridBagConstraints.HORIZONTAL;
    gbC.gridy = 1;
    gbC.gridx = 0;
    gbC.insets = new Insets(5, 5, 5, 5);
    gbL.setConstraints(bts, gbC);
    mondo.add(bts);
    gbC = new GridBagConstraints();
    // gbC.anchor = GridBagConstraints.NORTH;
    gbC.fill = GridBagConstraints.BOTH;
    gbC.gridy = 2;
    gbC.gridx = 0;
    gbC.weightx = 0;
    gbC.weighty = 100;
    gbL.setConstraints(m_History, gbC);
    mondo.add(m_History);
    /*gbC = new GridBagConstraints();
    gbC.fill = GridBagConstraints.BOTH;
    gbC.gridy = 0;     gbC.gridx = 1;
    gbC.gridheight = 3;
    gbC.weightx = 100; gbC.weighty = 100;
    gbL.setConstraints(output, gbC);*/
    // mondo.add(output);
    JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, mondo, output);
    splitPane.setOneTouchExpandable(true);
    // splitPane.setDividerLocation(100);

    setLayout(new BorderLayout());
    add(p1, BorderLayout.NORTH);
    // add(mondo , BorderLayout.CENTER);
    add(splitPane, BorderLayout.CENTER);
  }

  /**
   * Sets the combo-boxes to a fixed size so they don't take up too much room that would be better
   * devoted to the test output box.
   */
  protected void setComboSizes() {

    m_TesterClasses.setPreferredSize(COMBO_SIZE);
    m_PanelDatasetResultKeys.setPreferredSize(COMBO_SIZE);
    m_CompareCombo.setPreferredSize(COMBO_SIZE);
    m_SigTex.setPreferredSize(COMBO_SIZE);
    m_SortCombo.setPreferredSize(COMBO_SIZE);

    m_TesterClasses.setMaximumSize(COMBO_SIZE);
    m_PanelDatasetResultKeys.setMaximumSize(COMBO_SIZE);
    m_CompareCombo.setMaximumSize(COMBO_SIZE);
    m_SigTex.setMaximumSize(COMBO_SIZE);
    m_SortCombo.setMaximumSize(COMBO_SIZE);

    m_TesterClasses.setMinimumSize(COMBO_SIZE);
    m_PanelDatasetResultKeys.setMinimumSize(COMBO_SIZE);
    m_CompareCombo.setMinimumSize(COMBO_SIZE);
    m_SigTex.setMinimumSize(COMBO_SIZE);
    m_SortCombo.setMinimumSize(COMBO_SIZE);
  }

  /**
   * Tells the panel to use a new experiment.
   *
   * @param exp a value of type 'Experiment'
   */
  public void setExperiment(Experiment exp) {

    m_Exp = exp;
    m_FromExpBut.setEnabled(exp != null);
  }

  /** Queries the user enough to make a database query to retrieve experiment results. */
  protected void setInstancesFromDBaseQuery() {

    try {
      if (m_InstanceQuery == null) {
        m_InstanceQuery = new InstanceQuery();
      }
      String dbaseURL = m_InstanceQuery.getDatabaseURL();
      String username = m_InstanceQuery.getUsername();
      String passwd = m_InstanceQuery.getPassword();
      /*dbaseURL = (String) JOptionPane.showInputDialog(this,
      "Enter the database URL",
      "Query Database",
      JOptionPane.PLAIN_MESSAGE,
      null,
      null,
      dbaseURL);*/

      DatabaseConnectionDialog dbd = new DatabaseConnectionDialog(null, dbaseURL, username);
      dbd.setVisible(true);

      // if (dbaseURL == null) {
      if (dbd.getReturnValue() == JOptionPane.CLOSED_OPTION) {
        m_FromLab.setText("Cancelled");
        return;
      }
      dbaseURL = dbd.getURL();
      username = dbd.getUsername();
      passwd = dbd.getPassword();
      m_InstanceQuery.setDatabaseURL(dbaseURL);
      m_InstanceQuery.setUsername(username);
      m_InstanceQuery.setPassword(passwd);
      m_InstanceQuery.setDebug(dbd.getDebug());

      m_InstanceQuery.connectToDatabase();
      if (!m_InstanceQuery.experimentIndexExists()) {
        System.err.println("not found");
        m_FromLab.setText("No experiment index");
        m_InstanceQuery.disconnectFromDatabase();
        return;
      }
      System.err.println("found");
      m_FromLab.setText("Getting experiment index");
      Instances index =
          m_InstanceQuery.retrieveInstances("SELECT * FROM " + InstanceQuery.EXP_INDEX_TABLE);
      if (index.numInstances() == 0) {
        m_FromLab.setText("No experiments available");
        m_InstanceQuery.disconnectFromDatabase();
        return;
      }
      m_FromLab.setText("Got experiment index");

      DefaultListModel lm = new DefaultListModel();
      for (int i = 0; i < index.numInstances(); i++) {
        lm.addElement(index.instance(i).toString());
      }
      JList jl = new JList(lm);
      jl.setSelectedIndex(0);
      int result;
      // display dialog only if there's not just one result!
      if (jl.getModel().getSize() != 1) {
        ListSelectorDialog jd = new ListSelectorDialog(null, jl);
        result = jd.showDialog();
      } else {
        result = ListSelectorDialog.APPROVE_OPTION;
      }
      if (result != ListSelectorDialog.APPROVE_OPTION) {
        m_FromLab.setText("Cancelled");
        m_InstanceQuery.disconnectFromDatabase();
        return;
      }
      Instance selInst = index.instance(jl.getSelectedIndex());
      Attribute tableAttr = index.attribute(InstanceQuery.EXP_RESULT_COL);
      String table = InstanceQuery.EXP_RESULT_PREFIX + selInst.toString(tableAttr);
      setInstancesFromDatabaseTable(table);

    } catch (Exception ex) {
      // 1. print complete stacktrace
      ex.printStackTrace();
      // 2. print message in panel
      m_FromLab.setText("Problem reading database: '" + ex.getMessage() + "'");
    }
  }

  /**
   * Examines the supplied experiment to determine the results destination and attempts to load the
   * results.
   *
   * @param exp a value of type 'Experiment'
   */
  protected void setInstancesFromExp(Experiment exp) {

    if ((exp.getResultListener() instanceof CSVResultListener)) {
      File resultFile = ((CSVResultListener) exp.getResultListener()).getOutputFile();
      if ((resultFile == null)) {
        m_FromLab.setText("No result file");
      } else {
        setInstancesFromFile(resultFile);
      }
    } else if (exp.getResultListener() instanceof DatabaseResultListener) {
      String dbaseURL = ((DatabaseResultListener) exp.getResultListener()).getDatabaseURL();
      try {
        if (m_InstanceQuery == null) {
          m_InstanceQuery = new InstanceQuery();
        }
        m_InstanceQuery.setDatabaseURL(dbaseURL);
        m_InstanceQuery.connectToDatabase();
        String tableName = m_InstanceQuery.getResultsTableName(exp.getResultProducer());
        setInstancesFromDatabaseTable(tableName);
      } catch (Exception ex) {
        m_FromLab.setText("Problem reading database");
      }
    } else {
      m_FromLab.setText("Can't get results from experiment");
    }
  }

  /**
   * Queries a database to load results from the specified table name. The database connection must
   * have already made by m_InstanceQuery.
   *
   * @param tableName the name of the table containing results to retrieve.
   */
  protected void setInstancesFromDatabaseTable(String tableName) {

    try {
      m_FromLab.setText("Reading from database, please wait...");
      final Instances i = m_InstanceQuery.retrieveInstances("SELECT * FROM " + tableName);
      SwingUtilities.invokeAndWait(
          new Runnable() {
            public void run() {
              setInstances(i);
            }
          });
      m_InstanceQuery.disconnectFromDatabase();
    } catch (Exception ex) {
      m_FromLab.setText(ex.getMessage());
    }
  }

  /**
   * Loads results from a set of instances contained in the supplied file.
   *
   * @param f a value of type 'File'
   */
  protected void setInstancesFromFile(File f) {

    String fileType = f.getName();
    try {
      m_FromLab.setText("Reading from file...");
      if (f.getName().toLowerCase().endsWith(Instances.FILE_EXTENSION)) {
        fileType = "arff";
        Reader r = new BufferedReader(new FileReader(f));
        setInstances(new Instances(r));
        r.close();
      } else if (f.getName().toLowerCase().endsWith(CSVLoader.FILE_EXTENSION)) {
        fileType = "csv";
        CSVLoader cnv = new CSVLoader();
        cnv.setSource(f);
        Instances inst = cnv.getDataSet();
        setInstances(inst);
      } else {
        throw new Exception("Unrecognized file type");
      }
    } catch (Exception ex) {
      m_FromLab.setText("File '" + f.getName() + "' not recognised as an " + fileType + " file.");
      if (JOptionPane.showOptionDialog(
              ResultsPanel.this,
              "File '"
                  + f.getName()
                  + "' not recognised as an "
                  + fileType
                  + " file.\n"
                  + "Reason:\n"
                  + ex.getMessage(),
              "Load Instances",
              0,
              JOptionPane.ERROR_MESSAGE,
              null,
              new String[] {"OK"},
              null)
          == 1) {}
    }
  }

  /**
   * Returns a vector with column names of the dataset, listed in "list". If a column cannot be
   * found or the list is empty the ones from the default list are returned.
   *
   * @param list comma-separated list of attribute names
   * @param defaultList the default list of attribute names
   * @param inst the instances to get the attribute names from
   * @return a vector containing attribute names
   */
  protected Vector determineColumnNames(String list, String defaultList, Instances inst) {
    Vector result;
    Vector atts;
    StringTokenizer tok;
    int i;
    String item;

    // get attribute names
    atts = new Vector();
    for (i = 0; i < inst.numAttributes(); i++) atts.add(inst.attribute(i).name().toLowerCase());

    // process list
    result = new Vector();
    tok = new StringTokenizer(list, ",");
    while (tok.hasMoreTokens()) {
      item = tok.nextToken().toLowerCase();
      if (atts.contains(item)) {
        result.add(item);
      } else {
        result.clear();
        break;
      }
    }

    // do we have to return defaults?
    if (result.size() == 0) {
      tok = new StringTokenizer(defaultList, ",");
      while (tok.hasMoreTokens()) result.add(tok.nextToken().toLowerCase());
    }

    return result;
  }

  /**
   * Sets up the panel with a new set of instances, attempting to guess the correct settings for
   * various columns.
   *
   * @param newInstances the new set of results.
   */
  public void setInstances(Instances newInstances) {

    m_Instances = newInstances;
    m_TTester.setInstances(m_Instances);
    m_FromLab.setText("Got " + m_Instances.numInstances() + " results");

    // setup row and column names
    Vector rows = determineColumnNames(ExperimenterDefaults.getRow(), "Key_Dataset", m_Instances);
    Vector cols =
        determineColumnNames(
            ExperimenterDefaults.getColumn(),
            "Key_Scheme,Key_Scheme_options,Key_Scheme_version_ID",
            m_Instances);

    // Do other stuff
    m_DatasetKeyModel.removeAllElements();
    m_ResultKeyModel.removeAllElements();
    m_CompareModel.removeAllElements();
    m_SortModel.removeAllElements();
    m_SortModel.addElement("<default>");
    m_TTester.setSortColumn(-1);
    String selectedList = "";
    String selectedListDataset = "";
    boolean comparisonFieldSet = false;
    for (int i = 0; i < m_Instances.numAttributes(); i++) {
      String name = m_Instances.attribute(i).name();
      if (name.toLowerCase().startsWith("key_", 0)) {
        m_DatasetKeyModel.addElement(name.substring(4));
        m_ResultKeyModel.addElement(name.substring(4));
        m_CompareModel.addElement(name.substring(4));
      } else {
        m_DatasetKeyModel.addElement(name);
        m_ResultKeyModel.addElement(name);
        m_CompareModel.addElement(name);
        if (m_Instances.attribute(i).isNumeric()) m_SortModel.addElement(name);
      }

      if (rows.contains(name.toLowerCase())) {
        m_DatasetKeyList.addSelectionInterval(i, i);
        selectedListDataset += "," + (i + 1);
      } else if (name.toLowerCase().equals("key_run")) {
        m_TTester.setRunColumn(i);
      } else if (name.toLowerCase().equals("key_fold")) {
        m_TTester.setFoldColumn(i);
      } else if (cols.contains(name.toLowerCase())) {
        m_ResultKeyList.addSelectionInterval(i, i);
        selectedList += "," + (i + 1);
      } else if (name.toLowerCase().indexOf(ExperimenterDefaults.getComparisonField()) != -1) {
        m_CompareCombo.setSelectedIndex(i);
        comparisonFieldSet = true;
        //	break;
      } else if ((name.toLowerCase().indexOf("root_relative_squared_error") != -1)
          && (!comparisonFieldSet)) {
        m_CompareCombo.setSelectedIndex(i);
        comparisonFieldSet = true;
      }
    }
    m_TesterClasses.setEnabled(true);
    m_DatasetKeyBut.setEnabled(true);
    m_ResultKeyBut.setEnabled(true);
    m_SwapDatasetKeyAndResultKeyBut.setEnabled(true);
    m_CompareCombo.setEnabled(true);
    m_SortCombo.setEnabled(true);
    if (ExperimenterDefaults.getSorting().length() != 0)
      setSelectedItem(m_SortCombo, ExperimenterDefaults.getSorting());

    Range generatorRange = new Range();
    if (selectedList.length() != 0) {
      try {
        generatorRange.setRanges(selectedList);
      } catch (Exception ex) {
        ex.printStackTrace();
        System.err.println(ex.getMessage());
      }
    }
    m_TTester.setResultsetKeyColumns(generatorRange);

    generatorRange = new Range();
    if (selectedListDataset.length() != 0) {
      try {
        generatorRange.setRanges(selectedListDataset);
      } catch (Exception ex) {
        ex.printStackTrace();
        System.err.println(ex.getMessage());
      }
    }
    m_TTester.setDatasetKeyColumns(generatorRange);

    m_SigTex.setEnabled(true);

    setTTester();
  }

  /**
   * Sets the selected item of an combobox, since using setSelectedItem(...) doesn't work, if one
   * checks object references!
   *
   * @param cb the combobox to set the item for
   * @param item the item to set active
   */
  protected void setSelectedItem(JComboBox cb, String item) {
    int i;

    for (i = 0; i < cb.getItemCount(); i++) {
      if (cb.getItemAt(i).toString().equals(item)) {
        cb.setSelectedIndex(i);
        break;
      }
    }
  }

  /** Updates the test chooser with possible tests. */
  protected void setTTester() {

    // default is to display all columns
    m_TTester.setDisplayedResultsets(null);

    String name = (new SimpleDateFormat("HH:mm:ss - ")).format(new Date()) + "Available resultsets";
    StringBuffer outBuff = new StringBuffer();
    outBuff.append("Available resultsets\n" + m_TTester.resultsetKey() + "\n\n");
    m_History.addResult(name, outBuff);
    m_History.setSingle(name);

    m_TestsModel.removeAllElements();
    for (int i = 0; i < m_TTester.getNumResultsets(); i++) {
      String tname = m_TTester.getResultsetName(i);
      /*      if (tname.length() > 20) {
      tname = tname.substring(0, 20);
      } */
      m_TestsModel.addElement(tname);
    }

    m_DisplayedModel.removeAllElements();
    for (int i = 0; i < m_TestsModel.size(); i++)
      m_DisplayedModel.addElement(m_TestsModel.elementAt(i));

    m_TestsModel.addElement("Summary");
    m_TestsModel.addElement("Ranking");

    m_TestsList.setSelectedIndex(0);
    m_DisplayedList.setSelectionInterval(0, m_DisplayedModel.size() - 1);

    m_TestsButton.setEnabled(true);
    m_DisplayedButton.setEnabled(true);
    m_ShowStdDevs.setEnabled(true);
    m_OutputFormatButton.setEnabled(true);
    m_PerformBut.setEnabled(true);
  }

  /** Carries out a t-test using the current configuration. */
  protected void performTest() {

    String sigStr = m_SigTex.getText();
    if (sigStr.length() != 0) {
      m_TTester.setSignificanceLevel((new Double(sigStr)).doubleValue());
    } else {
      m_TTester.setSignificanceLevel(ExperimenterDefaults.getSignificance());
    }

    // Carry out the test chosen and biff the results to the output area
    m_TTester.setShowStdDevs(m_ShowStdDevs.isSelected());
    if (m_Instances.attribute(m_SortCombo.getSelectedItem().toString()) != null)
      m_TTester.setSortColumn(
          m_Instances.attribute(m_SortCombo.getSelectedItem().toString()).index());
    else m_TTester.setSortColumn(-1);
    int compareCol = m_CompareCombo.getSelectedIndex();
    int tType = m_TestsList.getSelectedIndex();

    String name =
        (new SimpleDateFormat("HH:mm:ss - ")).format(new Date())
            + (String) m_CompareCombo.getSelectedItem()
            + " - "
            + (String) m_TestsList.getSelectedValue();
    StringBuffer outBuff = new StringBuffer();
    outBuff.append(m_TTester.header(compareCol));
    outBuff.append("\n");
    m_History.addResult(name, outBuff);
    m_History.setSingle(name);
    m_TTester.setDisplayedResultsets(m_DisplayedList.getSelectedIndices());
    m_TTester.setResultMatrix(m_ResultMatrix);
    try {
      if (tType < m_TTester.getNumResultsets()) {
        outBuff.append(m_TTester.multiResultsetFull(tType, compareCol));
      } else if (tType == m_TTester.getNumResultsets()) {
        outBuff.append(m_TTester.multiResultsetSummary(compareCol));
      } else {
        outBuff.append(m_TTester.multiResultsetRanking(compareCol));
      }
      outBuff.append("\n");
    } catch (Exception ex) {
      outBuff.append(ex.getMessage() + "\n");
    }
    m_History.updateResult(name);
  }

  public void setResultKeyFromDialog() {

    ListSelectorDialog jd = new ListSelectorDialog(null, m_ResultKeyList);

    // Open the dialog
    int result = jd.showDialog();

    // If accepted, update the ttester
    if (result == ListSelectorDialog.APPROVE_OPTION) {
      int[] selected = m_ResultKeyList.getSelectedIndices();
      String selectedList = "";
      for (int i = 0; i < selected.length; i++) {
        selectedList += "," + (selected[i] + 1);
      }
      Range generatorRange = new Range();
      if (selectedList.length() != 0) {
        try {
          generatorRange.setRanges(selectedList);
        } catch (Exception ex) {
          ex.printStackTrace();
          System.err.println(ex.getMessage());
        }
      }
      m_TTester.setResultsetKeyColumns(generatorRange);
      setTTester();
    }
  }

  public void setDatasetKeyFromDialog() {

    ListSelectorDialog jd = new ListSelectorDialog(null, m_DatasetKeyList);

    // Open the dialog
    int result = jd.showDialog();

    // If accepted, update the ttester
    if (result == ListSelectorDialog.APPROVE_OPTION) {
      int[] selected = m_DatasetKeyList.getSelectedIndices();
      String selectedList = "";
      for (int i = 0; i < selected.length; i++) {
        selectedList += "," + (selected[i] + 1);
      }
      Range generatorRange = new Range();
      if (selectedList.length() != 0) {
        try {
          generatorRange.setRanges(selectedList);
        } catch (Exception ex) {
          ex.printStackTrace();
          System.err.println(ex.getMessage());
        }
      }
      m_TTester.setDatasetKeyColumns(generatorRange);
      setTTester();
    }
  }

  /** Swaps the keys for dataset and result. */
  protected void swapDatasetKeyAndResultKey() {
    int[] tmpSelected;
    Range tmpRange;

    // lists
    tmpSelected = m_DatasetKeyList.getSelectedIndices();
    m_DatasetKeyList.setSelectedIndices(m_ResultKeyList.getSelectedIndices());
    m_ResultKeyList.setSelectedIndices(tmpSelected);

    // tester
    tmpRange = m_TTester.getDatasetKeyColumns();
    m_TTester.setDatasetKeyColumns(m_TTester.getResultsetKeyColumns());
    m_TTester.setResultsetKeyColumns(tmpRange);
    setTTester();
  }

  public void setTestBaseFromDialog() {
    ListSelectorDialog jd = new ListSelectorDialog(null, m_TestsList);

    // Open the dialog
    jd.showDialog();
  }

  public void setDisplayedFromDialog() {
    ListSelectorDialog jd = new ListSelectorDialog(null, m_DisplayedList);

    // Open the dialog
    jd.showDialog();
  }

  /**
   * displays the Dialog for the output format and sets the chosen settings, if the user approves.
   */
  public void setOutputFormatFromDialog() {
    OutputFormatDialog dialog = new OutputFormatDialog(PropertyDialog.getParentFrame(this));

    m_ResultMatrix.setShowStdDev(m_ShowStdDevs.isSelected());
    dialog.setResultMatrix(m_ResultMatrix);
    dialog.setLocationRelativeTo(this);

    if (dialog.showDialog() == OutputFormatDialog.APPROVE_OPTION) {
      m_ResultMatrix = dialog.getResultMatrix();
      m_ShowStdDevs.setSelected(m_ResultMatrix.getShowStdDev());
    }
  }

  /** Save the currently selected result buffer to a file. */
  protected void saveBuffer() {
    StringBuffer sb = m_History.getSelectedBuffer();
    if (sb != null) {
      if (m_SaveOut.save(sb)) {
        JOptionPane.showMessageDialog(
            this, "File saved", "Results", JOptionPane.INFORMATION_MESSAGE);
      }
    } else {
      m_SaveOutBut.setEnabled(false);
    }
  }

  /** sets the currently selected Tester-Class. */
  protected void setTester() {
    Tester tester;
    Tester t;
    int i;

    if (m_TesterClasses.getSelectedItem() == null) return;

    tester = null;

    // find display name
    try {
      for (i = 0; i < m_Testers.size(); i++) {
        t = (Tester) ((Class) m_Testers.get(i)).newInstance();
        if (t.getDisplayName().equals(m_TesterClasses.getSelectedItem())) {
          tester = t;
          break;
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }

    if (tester == null) {
      tester = new PairedCorrectedTTester(); // default
      m_TesterClasses.setSelectedItem(tester.getDisplayName());
    }

    tester.assign(m_TTester);
    m_TTester = tester;
    m_PerformBut.setToolTipText(m_TTester.getToolTipText());
    System.out.println("Tester set to: " + m_TTester.getClass().getName());
  }

  /**
   * Tests out the results panel from the command line.
   *
   * @param args ignored
   */
  public static void main(String[] args) {

    try {
      final JFrame jf = new JFrame("Weka Experiment: Results Analysis");
      jf.getContentPane().setLayout(new BorderLayout());
      final ResultsPanel sp = new ResultsPanel();
      // sp.setBorder(BorderFactory.createTitledBorder("Setup"));
      jf.getContentPane().add(sp, BorderLayout.CENTER);
      jf.addWindowListener(
          new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
              jf.dispose();
              System.exit(0);
            }
          });
      jf.pack();
      jf.setSize(700, 550);
      jf.setVisible(true);
    } catch (Exception ex) {
      ex.printStackTrace();
      System.err.println(ex.getMessage());
    }
  }
}
Exemple #5
0
  /** Creates the results panel with no initial experiment. */
  public ResultsPanel() {

    // defaults
    m_TTester.setSignificanceLevel(ExperimenterDefaults.getSignificance());
    m_TTester.setShowStdDevs(ExperimenterDefaults.getShowStdDevs());
    m_ResultMatrix = ExperimenterDefaults.getOutputFormat();
    m_ResultMatrix.setShowStdDev(ExperimenterDefaults.getShowStdDevs());
    m_ResultMatrix.setMeanPrec(ExperimenterDefaults.getMeanPrecision());
    m_ResultMatrix.setStdDevPrec(ExperimenterDefaults.getStdDevPrecision());
    m_ResultMatrix.setRemoveFilterName(ExperimenterDefaults.getRemoveFilterClassnames());
    m_ResultMatrix.setShowAverage(ExperimenterDefaults.getShowAverage());

    // Create/Configure/Connect components

    m_FileChooser.addChoosableFileFilter(m_csvFileFilter);
    m_FileChooser.addChoosableFileFilter(m_arffFileFilter);

    m_FileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
    m_FromExpBut.setEnabled(false);
    m_FromExpBut.setMnemonic('E');
    m_FromExpBut.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            if (m_LoadThread == null) {
              m_LoadThread =
                  new Thread() {
                    public void run() {
                      setInstancesFromExp(m_Exp);
                      m_LoadThread = null;
                    }
                  };
              m_LoadThread.start();
            }
          }
        });
    m_FromDBaseBut.setMnemonic('D');
    m_FromDBaseBut.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            if (m_LoadThread == null) {
              m_LoadThread =
                  new Thread() {
                    public void run() {
                      setInstancesFromDBaseQuery();
                      m_LoadThread = null;
                    }
                  };
              m_LoadThread.start();
            }
          }
        });
    m_FromFileBut.setMnemonic('F');
    m_FromFileBut.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            int returnVal = m_FileChooser.showOpenDialog(ResultsPanel.this);
            if (returnVal == JFileChooser.APPROVE_OPTION) {
              final File selected = m_FileChooser.getSelectedFile();
              if (m_LoadThread == null) {
                m_LoadThread =
                    new Thread() {
                      public void run() {
                        setInstancesFromFile(selected);
                        m_LoadThread = null;
                      }
                    };
                m_LoadThread.start();
              }
            }
          }
        });
    setComboSizes();
    m_TesterClasses.setEnabled(false);
    m_DatasetKeyBut.setEnabled(false);
    m_DatasetKeyBut.setToolTipText("For selecting the keys that are shown as rows.");
    m_DatasetKeyBut.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            setDatasetKeyFromDialog();
          }
        });
    m_DatasetKeyList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    m_ResultKeyBut.setEnabled(false);
    m_ResultKeyBut.setToolTipText("For selecting the keys that are shown as columns.");
    m_ResultKeyBut.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            setResultKeyFromDialog();
          }
        });
    m_ResultKeyList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    m_SwapDatasetKeyAndResultKeyBut.setEnabled(false);
    m_SwapDatasetKeyAndResultKeyBut.setToolTipText(
        "Swaps the keys for selecting rows and columns.");
    m_SwapDatasetKeyAndResultKeyBut.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            swapDatasetKeyAndResultKey();
          }
        });
    m_CompareCombo.setEnabled(false);
    m_SortCombo.setEnabled(false);

    m_SigTex.setEnabled(false);
    m_TestsButton.setEnabled(false);
    m_TestsButton.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            setTestBaseFromDialog();
          }
        });

    m_DisplayedButton.setEnabled(false);
    m_DisplayedButton.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            setDisplayedFromDialog();
          }
        });

    m_ShowStdDevs.setEnabled(false);
    m_ShowStdDevs.setSelected(ExperimenterDefaults.getShowStdDevs());
    m_OutputFormatButton.setEnabled(false);
    m_OutputFormatButton.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            setOutputFormatFromDialog();
          }
        });

    m_PerformBut.setEnabled(false);
    m_PerformBut.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            performTest();
            m_SaveOutBut.setEnabled(true);
          }
        });

    m_PerformBut.setToolTipText(m_TTester.getToolTipText());

    m_SaveOutBut.setEnabled(false);
    m_SaveOutBut.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            saveBuffer();
          }
        });
    m_OutText.setFont(new Font("Monospaced", Font.PLAIN, 12));
    m_OutText.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    m_OutText.setEditable(false);
    m_History.setBorder(BorderFactory.createTitledBorder("Result list"));

    // Set up the GUI layout
    JPanel p1 = new JPanel();
    p1.setBorder(BorderFactory.createTitledBorder("Source"));
    JPanel p2 = new JPanel();
    GridBagLayout gb = new GridBagLayout();
    GridBagConstraints constraints = new GridBagConstraints();
    p2.setBorder(BorderFactory.createEmptyBorder(5, 5, 10, 5));
    //    p2.setLayout(new GridLayout(1, 3));
    p2.setLayout(gb);
    constraints.gridx = 0;
    constraints.gridy = 0;
    constraints.weightx = 5;
    constraints.fill = GridBagConstraints.HORIZONTAL;
    constraints.gridwidth = 1;
    constraints.gridheight = 1;
    constraints.insets = new Insets(0, 2, 0, 2);
    p2.add(m_FromFileBut, constraints);
    constraints.gridx = 1;
    constraints.gridy = 0;
    constraints.weightx = 5;
    constraints.gridwidth = 1;
    constraints.gridheight = 1;
    p2.add(m_FromDBaseBut, constraints);
    constraints.gridx = 2;
    constraints.gridy = 0;
    constraints.weightx = 5;
    constraints.gridwidth = 1;
    constraints.gridheight = 1;
    p2.add(m_FromExpBut, constraints);
    p1.setLayout(new BorderLayout());
    p1.add(m_FromLab, BorderLayout.CENTER);
    p1.add(p2, BorderLayout.EAST);

    JPanel p3 = new JPanel();
    p3.setBorder(BorderFactory.createTitledBorder("Configure test"));
    GridBagLayout gbL = new GridBagLayout();
    p3.setLayout(gbL);

    int y = 0;
    GridBagConstraints gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.EAST;
    gbC.gridy = y;
    gbC.gridx = 0;
    gbC.insets = new Insets(2, 10, 2, 10);
    gbL.setConstraints(m_TesterClassesLabel, gbC);
    m_TesterClassesLabel.setDisplayedMnemonic('w');
    m_TesterClassesLabel.setLabelFor(m_TesterClasses);
    p3.add(m_TesterClassesLabel);
    gbC = new GridBagConstraints();
    gbC.gridy = y;
    gbC.gridx = 1;
    gbC.weightx = 100;
    gbC.insets = new Insets(5, 0, 5, 0);
    gbC.fill = GridBagConstraints.HORIZONTAL;
    gbL.setConstraints(m_TesterClasses, gbC);
    p3.add(m_TesterClasses);
    m_TesterClasses.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            setTester();
          }
        });
    setSelectedItem(m_TesterClasses, ExperimenterDefaults.getTester());

    y++;
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.EAST;
    gbC.gridy = y;
    gbC.gridx = 0;
    gbC.insets = new Insets(2, 10, 2, 10);
    gbL.setConstraints(m_DatasetAndResultKeysLabel, gbC);
    m_DatasetAndResultKeysLabel.setDisplayedMnemonic('R');
    m_DatasetAndResultKeysLabel.setLabelFor(m_DatasetKeyBut);
    p3.add(m_DatasetAndResultKeysLabel);

    m_PanelDatasetResultKeys.add(m_DatasetKeyBut);
    m_PanelDatasetResultKeys.add(m_ResultKeyBut);
    m_PanelDatasetResultKeys.add(m_SwapDatasetKeyAndResultKeyBut);
    gbC = new GridBagConstraints();
    gbC.fill = GridBagConstraints.HORIZONTAL;
    gbC.gridy = y;
    gbC.gridx = 1;
    gbC.weightx = 100;
    gbC.insets = new Insets(5, 0, 5, 0);
    gbL.setConstraints(m_PanelDatasetResultKeys, gbC);
    p3.add(m_PanelDatasetResultKeys);

    y++;
    JLabel lab = new JLabel("Comparison field", SwingConstants.RIGHT);
    lab.setDisplayedMnemonic('m');
    lab.setLabelFor(m_CompareCombo);
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.EAST;
    gbC.gridy = y;
    gbC.gridx = 0;
    gbC.insets = new Insets(2, 10, 2, 10);
    gbL.setConstraints(lab, gbC);
    p3.add(lab);
    gbC = new GridBagConstraints();
    gbC.gridy = y;
    gbC.gridx = 1;
    gbC.weightx = 100;
    gbC.insets = new Insets(5, 0, 5, 0);
    gbC.fill = GridBagConstraints.HORIZONTAL;
    gbL.setConstraints(m_CompareCombo, gbC);
    p3.add(m_CompareCombo);

    y++;
    lab = new JLabel("Significance", SwingConstants.RIGHT);
    lab.setDisplayedMnemonic('g');
    lab.setLabelFor(m_SigTex);
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.EAST;
    gbC.gridy = y;
    gbC.gridx = 0;
    gbC.insets = new Insets(2, 10, 2, 10);
    gbL.setConstraints(lab, gbC);
    p3.add(lab);
    gbC = new GridBagConstraints();
    gbC.fill = GridBagConstraints.HORIZONTAL;
    gbC.gridy = y;
    gbC.gridx = 1;
    gbC.weightx = 100;
    gbL.setConstraints(m_SigTex, gbC);
    p3.add(m_SigTex);

    y++;
    lab = new JLabel("Sorting (asc.) by", SwingConstants.RIGHT);
    lab.setDisplayedMnemonic('S');
    lab.setLabelFor(m_SortCombo);
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.EAST;
    gbC.gridy = y;
    gbC.gridx = 0;
    gbC.insets = new Insets(2, 10, 2, 10);
    gbL.setConstraints(lab, gbC);
    p3.add(lab);
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.WEST;
    gbC.fill = GridBagConstraints.HORIZONTAL;
    gbC.gridy = y;
    gbC.gridx = 1;
    gbC.weightx = 100;
    gbC.insets = new Insets(5, 0, 5, 0);
    gbL.setConstraints(m_SortCombo, gbC);
    p3.add(m_SortCombo);

    y++;
    lab = new JLabel("Test base", SwingConstants.RIGHT);
    lab.setDisplayedMnemonic('b');
    lab.setLabelFor(m_TestsButton);
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.EAST;
    gbC.gridy = y;
    gbC.gridx = 0;
    gbC.insets = new Insets(2, 10, 2, 10);
    gbL.setConstraints(lab, gbC);
    p3.add(lab);
    gbC = new GridBagConstraints();
    gbC.fill = GridBagConstraints.HORIZONTAL;
    gbC.gridy = y;
    gbC.gridx = 1;
    gbC.weightx = 100;
    gbC.insets = new Insets(5, 0, 5, 0);
    gbL.setConstraints(m_TestsButton, gbC);
    p3.add(m_TestsButton);

    y++;
    lab = new JLabel("Displayed Columns", SwingConstants.RIGHT);
    lab.setDisplayedMnemonic('i');
    lab.setLabelFor(m_DisplayedButton);
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.EAST;
    gbC.gridy = y;
    gbC.gridx = 0;
    gbC.insets = new Insets(2, 10, 2, 10);
    gbL.setConstraints(lab, gbC);
    p3.add(lab);
    gbC = new GridBagConstraints();
    gbC.fill = GridBagConstraints.HORIZONTAL;
    gbC.gridy = y;
    gbC.gridx = 1;
    gbC.weightx = 100;
    gbC.insets = new Insets(5, 0, 5, 0);
    gbL.setConstraints(m_DisplayedButton, gbC);
    p3.add(m_DisplayedButton);

    y++;
    lab = new JLabel("Show std. deviations", SwingConstants.RIGHT);
    lab.setDisplayedMnemonic('a');
    lab.setLabelFor(m_ShowStdDevs);
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.EAST;
    gbC.gridy = y;
    gbC.gridx = 0;
    gbC.insets = new Insets(2, 10, 2, 10);
    gbL.setConstraints(lab, gbC);
    p3.add(lab);
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.WEST;
    gbC.gridy = y;
    gbC.gridx = 1;
    gbC.weightx = 100;
    gbC.insets = new Insets(5, 0, 5, 0);
    gbL.setConstraints(m_ShowStdDevs, gbC);
    p3.add(m_ShowStdDevs);

    y++;
    lab = new JLabel("Output Format", SwingConstants.RIGHT);
    lab.setDisplayedMnemonic('O');
    lab.setLabelFor(m_OutputFormatButton);
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.EAST;
    gbC.gridy = y;
    gbC.gridx = 0;
    gbC.insets = new Insets(2, 10, 2, 10);
    gbL.setConstraints(lab, gbC);
    p3.add(lab);
    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.WEST;
    gbC.fill = GridBagConstraints.HORIZONTAL;
    gbC.gridy = y;
    gbC.gridx = 1;
    gbC.weightx = 100;
    gbC.insets = new Insets(5, 0, 5, 0);
    gbL.setConstraints(m_OutputFormatButton, gbC);
    p3.add(m_OutputFormatButton);

    JPanel output = new JPanel();
    output.setLayout(new BorderLayout());
    output.setBorder(BorderFactory.createTitledBorder("Test output"));
    output.add(new JScrollPane(m_OutText), BorderLayout.CENTER);

    JPanel mondo = new JPanel();
    gbL = new GridBagLayout();
    mondo.setLayout(gbL);
    gbC = new GridBagConstraints();
    //    gbC.anchor = GridBagConstraints.WEST;
    //    gbC.fill = GridBagConstraints.HORIZONTAL;
    gbC.gridy = 0;
    gbC.gridx = 0;
    gbL.setConstraints(p3, gbC);
    mondo.add(p3);

    JPanel bts = new JPanel();
    m_PerformBut.setMnemonic('t');
    m_SaveOutBut.setMnemonic('S');
    bts.setLayout(new GridLayout(1, 2, 5, 5));
    bts.add(m_PerformBut);
    bts.add(m_SaveOutBut);

    gbC = new GridBagConstraints();
    gbC.anchor = GridBagConstraints.NORTH;
    gbC.fill = GridBagConstraints.HORIZONTAL;
    gbC.gridy = 1;
    gbC.gridx = 0;
    gbC.insets = new Insets(5, 5, 5, 5);
    gbL.setConstraints(bts, gbC);
    mondo.add(bts);
    gbC = new GridBagConstraints();
    // gbC.anchor = GridBagConstraints.NORTH;
    gbC.fill = GridBagConstraints.BOTH;
    gbC.gridy = 2;
    gbC.gridx = 0;
    gbC.weightx = 0;
    gbC.weighty = 100;
    gbL.setConstraints(m_History, gbC);
    mondo.add(m_History);
    /*gbC = new GridBagConstraints();
    gbC.fill = GridBagConstraints.BOTH;
    gbC.gridy = 0;     gbC.gridx = 1;
    gbC.gridheight = 3;
    gbC.weightx = 100; gbC.weighty = 100;
    gbL.setConstraints(output, gbC);*/
    // mondo.add(output);
    JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, mondo, output);
    splitPane.setOneTouchExpandable(true);
    // splitPane.setDividerLocation(100);

    setLayout(new BorderLayout());
    add(p1, BorderLayout.NORTH);
    // add(mondo , BorderLayout.CENTER);
    add(splitPane, BorderLayout.CENTER);
  }
  /** performs the creation of the dialog and all its components. */
  protected void initGUI() {
    JPanel panel;
    SpinnerNumberModel model;
    JPanel panel2;

    getContentPane().setLayout(new BorderLayout());

    panel = new JPanel(new GridLayout(6, 1));
    panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    getContentPane().add(panel, BorderLayout.CENTER);

    // mean precision
    m_MeanPrecSpinner = new JSpinner();
    m_MeanPrecSpinner.addChangeListener(
        new ChangeListener() {
          public void stateChanged(ChangeEvent e) {
            getData();
          }
        });
    model = (SpinnerNumberModel) m_MeanPrecSpinner.getModel();
    model.setMaximum(new Integer(20));
    model.setMinimum(new Integer(0));
    m_MeanPrecLabel = new JLabel("Mean Precision");
    m_MeanPrecLabel.setDisplayedMnemonic('M');
    m_MeanPrecLabel.setLabelFor(m_MeanPrecSpinner);
    panel2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
    panel2.add(m_MeanPrecLabel);
    panel2.add(m_MeanPrecSpinner);
    panel.add(panel2);

    // stddev precision
    m_StdDevPrecSpinner = new JSpinner();
    m_StdDevPrecSpinner.addChangeListener(
        new ChangeListener() {
          public void stateChanged(ChangeEvent e) {
            getData();
          }
        });
    model = (SpinnerNumberModel) m_StdDevPrecSpinner.getModel();
    model.setMaximum(new Integer(20));
    model.setMinimum(new Integer(0));
    m_StdDevPrecLabel = new JLabel("StdDev. Precision");
    m_StdDevPrecLabel.setDisplayedMnemonic('S');
    m_StdDevPrecLabel.setLabelFor(m_StdDevPrecSpinner);
    panel2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
    panel2.add(m_StdDevPrecLabel);
    panel2.add(m_StdDevPrecSpinner);
    panel.add(panel2);

    // Format
    m_OutputFormatComboBox = new JComboBox(m_OutputFormatNames);
    m_OutputFormatComboBox.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            getData();
          }
        });
    m_OutputFormatLabel = new JLabel("Output Format");
    m_OutputFormatLabel.setDisplayedMnemonic('F');
    m_OutputFormatLabel.setLabelFor(m_OutputFormatComboBox);
    panel2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
    panel2.add(m_OutputFormatLabel);
    panel2.add(m_OutputFormatComboBox);
    panel.add(panel2);

    // Average
    m_ShowAverageCheckBox = new JCheckBox("");
    m_ShowAverageCheckBox.addChangeListener(
        new ChangeListener() {
          public void stateChanged(ChangeEvent e) {
            getData();
          }
        });
    m_ShowAverageLabel = new JLabel("Show Average");
    m_ShowAverageLabel.setDisplayedMnemonic('A');
    m_ShowAverageLabel.setLabelFor(m_ShowAverageCheckBox);
    panel2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
    panel2.add(m_ShowAverageLabel);
    panel2.add(m_ShowAverageCheckBox);
    panel.add(panel2);

    // Remove filter classname
    m_RemoveFilterNameCheckBox = new JCheckBox("");
    m_RemoveFilterNameCheckBox.addChangeListener(
        new ChangeListener() {
          public void stateChanged(ChangeEvent e) {
            getData();
          }
        });
    m_RemoveFilterNameLabel = new JLabel("Remove filter classnames");
    m_RemoveFilterNameLabel.setDisplayedMnemonic('R');
    m_RemoveFilterNameLabel.setLabelFor(m_RemoveFilterNameCheckBox);
    panel2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
    panel2.add(m_RemoveFilterNameLabel);
    panel2.add(m_RemoveFilterNameCheckBox);
    panel.add(panel2);

    // Advanced setup
    m_ResultMatrix = ExperimenterDefaults.getOutputFormat();
    m_ResultMatrixEditor = new GenericObjectEditor(true);
    m_ResultMatrixEditor.setClassType(ResultMatrix.class);
    m_ResultMatrixEditor.setValue(m_ResultMatrix);
    m_ResultMatrixEditor.addPropertyChangeListener(
        new PropertyChangeListener() {
          public void propertyChange(PropertyChangeEvent e) {
            // user selected different class?
            if (!m_ResultMatrix.getClass().equals(m_ResultMatrixEditor.getValue().getClass())) {
              // if it's the preferred class, then automaticallly use the Experimenter defaults
              if (m_ResultMatrixEditor
                  .getValue()
                  .getClass()
                  .equals(ExperimenterDefaults.getOutputFormat().getClass())) {
                m_ResultMatrix = ExperimenterDefaults.getOutputFormat();
                m_ResultMatrixEditor.setValue(ExperimenterDefaults.getOutputFormat());
              } else {
                m_ResultMatrix = (ResultMatrix) m_ResultMatrixEditor.getValue();
              }
              setData();
            }
            repaint();
          }
        });
    ((GenericObjectEditor.GOEPanel) m_ResultMatrixEditor.getCustomEditor())
        .addOkListener(
            new ActionListener() {
              public void actionPerformed(ActionEvent e) {
                m_ResultMatrix = (ResultMatrix) m_ResultMatrixEditor.getValue();
                setData();
              }
            });
    m_ResultMatrixPanel = new PropertyPanel(m_ResultMatrixEditor, false);
    m_ResultMatrixLabel = new JLabel("Advanced setup");
    panel2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
    panel2.add(m_ResultMatrixLabel);
    panel2.add(m_ResultMatrixPanel);
    panel.add(panel2);

    // Buttons
    panel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
    getContentPane().add(panel, BorderLayout.SOUTH);
    m_CancelButton = new JButton("Cancel");
    m_CancelButton.setMnemonic('C');
    m_CancelButton.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            m_Result = CANCEL_OPTION;
            setVisible(false);
          }
        });
    m_OkButton = new JButton("OK");
    m_OkButton.setMnemonic('O');
    m_OkButton.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            getData();
            m_Result = APPROVE_OPTION;
            setVisible(false);
          }
        });
    panel.add(m_OkButton);
    panel.add(m_CancelButton);

    // default button
    getRootPane().setDefaultButton(m_OkButton);

    // initial layout (to get widths and heights)
    pack();

    // adjust dimensions
    m_MeanPrecLabel.setPreferredSize(
        new Dimension(m_RemoveFilterNameLabel.getWidth(), m_MeanPrecLabel.getHeight()));
    m_MeanPrecSpinner.setPreferredSize(
        new Dimension(m_MeanPrecSpinner.getWidth() * 3, m_MeanPrecSpinner.getHeight()));
    m_StdDevPrecLabel.setPreferredSize(
        new Dimension(m_RemoveFilterNameLabel.getWidth(), m_StdDevPrecLabel.getHeight()));
    m_StdDevPrecSpinner.setPreferredSize(
        new Dimension(m_StdDevPrecSpinner.getWidth() * 3, m_StdDevPrecSpinner.getHeight()));
    m_OutputFormatLabel.setPreferredSize(
        new Dimension(m_RemoveFilterNameLabel.getWidth(), m_OutputFormatLabel.getHeight()));
    m_ShowAverageLabel.setPreferredSize(
        new Dimension(m_RemoveFilterNameLabel.getWidth(), m_ShowAverageLabel.getHeight()));
    m_ResultMatrixLabel.setPreferredSize(
        new Dimension(m_RemoveFilterNameLabel.getWidth(), m_ResultMatrixLabel.getHeight()));
    m_ResultMatrixPanel.setPreferredSize(
        new Dimension(
            (int) (m_ResultMatrixPanel.getWidth() * 1.5), m_ResultMatrixPanel.getHeight()));

    // final layout
    pack();
  }