📄 preprocesspanel.java
字号:
/*
* 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 2 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, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
* PreprocessPanel.java
* Copyright (C) 2003 Richard Kirkby, Len Trigg
*
*/
package weka.gui.explorer;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Reader;
import java.io.Writer;
import java.net.URL;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.filechooser.FileFilter;
import weka.core.Attribute;
import weka.core.Instance;
import weka.core.Instances;
import weka.core.converters.C45Loader;
import weka.core.converters.CSVLoader;
import weka.core.converters.Loader;
import weka.experiment.InstanceQuery;
import weka.filters.Filter;
import weka.filters.SupervisedFilter;
import weka.filters.unsupervised.attribute.Remove;
import weka.gui.AttributeSelectionPanel;
import weka.gui.AttributeSummaryPanel;
import weka.gui.AttributeVisualizationPanel;
import weka.gui.ExtensionFileFilter;
import weka.gui.FileEditor;
import weka.gui.GenericObjectEditor;
import weka.gui.InstancesSummaryPanel;
import weka.gui.Logger;
import weka.gui.PropertyDialog;
import weka.gui.PropertyPanel;
import weka.gui.SysErrLog;
import weka.gui.TaskLogger;
/**
* This panel controls simple preprocessing of instances. Summary
* information on instances and attributes is shown. Filters may be
* configured to alter the set of instances. Altered instances may
* also be saved.
*
* @author Richard Kirkby (rkirkby@cs.waikato.ac.nz)
* @author Len Trigg (trigg@cs.waikato.ac.nz)
* @version $Revision$
*/
public class PreprocessPanel extends JPanel {
/** Displays simple stats on the working instances */
protected InstancesSummaryPanel m_InstSummaryPanel =
new InstancesSummaryPanel();
/** Click to load base instances from a file */
protected JButton m_OpenFileBut = new JButton("Open file...");
/** Click to load base instances from a URL */
protected JButton m_OpenURLBut = new JButton("Open URL...");
/** Click to load base instances from a Database */
protected JButton m_OpenDBBut = new JButton("Open DB...");
/** Lets the user enter a DB query */
protected GenericObjectEditor m_DatabaseQueryEditor =
new GenericObjectEditor();
/** Click to revert back to the last saved point */
protected JButton m_UndoBut = new JButton("Undo");
/** Click to apply filters and save the results */
protected JButton m_SaveBut = new JButton("Save...");
/** Panel to let the user toggle attributes */
protected AttributeSelectionPanel m_AttPanel = new AttributeSelectionPanel();
/** Button for removing attributes */
JButton m_RemoveButton = new JButton("Remove");
/** Displays summary stats on the selected attribute */
protected AttributeSummaryPanel m_AttSummaryPanel =
new AttributeSummaryPanel();
/** Lets the user configure the filter */
protected GenericObjectEditor m_FilterEditor =
new GenericObjectEditor();
/** Filter configuration */
protected PropertyPanel m_FilterPanel = new PropertyPanel(m_FilterEditor);
/** Click to apply filters and save the results */
protected JButton m_ApplyFilterBut = new JButton("Apply");
/** The file chooser for selecting arff files */
protected JFileChooser m_FileChooser
= new JFileChooser(new File(System.getProperty("user.dir")));
/** File filters for various file types */
protected ExtensionFileFilter m_bsiFileFilter =
new ExtensionFileFilter(Instances.SERIALIZED_OBJ_FILE_EXTENSION,
"Binary serialized instances");
protected ExtensionFileFilter m_c45FileFilter =
new ExtensionFileFilter(C45Loader.FILE_EXTENSION,
"C45 names files");
protected ExtensionFileFilter m_csvFileFilter =
new ExtensionFileFilter(CSVLoader.FILE_EXTENSION,
"CSV data files");
protected ExtensionFileFilter m_arffFileFilter =
new ExtensionFileFilter(Instances.FILE_EXTENSION,
"Arff data files");
/** Stores the last URL that instances were loaded from */
protected String m_LastURL = "http://";
/** Stores the last sql query executed */
protected String m_SQLQ = new String("SELECT * FROM ?");
/** The working instances */
protected Instances m_Instances;
/** The visualization of the attribute values */
protected AttributeVisualizationPanel m_AttVisualizePanel =
new AttributeVisualizationPanel();
/** Keeps track of undo points */
protected File[] m_tempUndoFiles = new File[20]; // set number of undo ops here
/** The next available slot for an undo point */
protected int m_tempUndoIndex = 0;
/**
* Manages sending notifications to people when we change the set of
* working instances.
*/
protected PropertyChangeSupport m_Support = new PropertyChangeSupport(this);
/** A thread for loading/saving instances from a file or URL */
protected Thread m_IOThread;
/** The message logger */
protected Logger m_Log = new SysErrLog();
static {
java.beans.PropertyEditorManager
.registerEditor(java.io.File.class,
FileEditor.class);
java.beans.PropertyEditorManager
.registerEditor(weka.core.SelectedTag.class,
weka.gui.SelectedTagEditor.class);
java.beans.PropertyEditorManager
.registerEditor(weka.filters.Filter.class,
weka.gui.GenericObjectEditor.class);
java.beans.PropertyEditorManager
.registerEditor(weka.attributeSelection.ASSearch.class,
weka.gui.GenericObjectEditor.class);
java.beans.PropertyEditorManager
.registerEditor(weka.attributeSelection.ASEvaluation.class,
weka.gui.GenericObjectEditor.class);
java.beans.PropertyEditorManager
.registerEditor(weka.experiment.InstanceQuery.class,
weka.gui.GenericObjectEditor.class);
java.beans.PropertyEditorManager
.registerEditor(weka.core.converters.Loader.class,
weka.gui.GenericObjectEditor.class);
}
/**
* Creates the instances panel with no initial instances.
*/
public PreprocessPanel() {
// Create/Configure/Connect components
try {
m_DatabaseQueryEditor.setClassType(weka.experiment.InstanceQuery.class);
m_DatabaseQueryEditor.setValue(new weka.experiment.InstanceQuery());
((GenericObjectEditor.GOEPanel)m_DatabaseQueryEditor.getCustomEditor())
.addOkListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setInstancesFromDBQ();
}
});
} catch (Exception ex) {
}
m_FilterEditor.setClassType(weka.filters.Filter.class);
m_OpenFileBut.setToolTipText("Open a set of instances from a file");
m_OpenURLBut.setToolTipText("Open a set of instances from a URL");
m_OpenDBBut.setToolTipText("Open a set of instances from a database");
m_UndoBut.setToolTipText("Undo the last change to the dataset");
m_SaveBut.setToolTipText("Save the working relation to a file");
m_ApplyFilterBut.setToolTipText("Apply the current filter to the data");
m_FileChooser.
addChoosableFileFilter(m_bsiFileFilter);
m_FileChooser.
addChoosableFileFilter(m_c45FileFilter);
m_FileChooser.
addChoosableFileFilter(m_csvFileFilter);
m_FileChooser.
addChoosableFileFilter(m_arffFileFilter);
m_FileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
m_OpenURLBut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setInstancesFromURLQ();
}
});
m_OpenDBBut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
PropertyDialog pd = new PropertyDialog(m_DatabaseQueryEditor,100,100);
}
});
m_OpenFileBut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setInstancesFromFileQ();
}
});
m_UndoBut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
undo();
}
});
m_SaveBut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
saveWorkingInstancesToFileQ();
}
});
m_ApplyFilterBut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
applyFilter((Filter) m_FilterEditor.getValue());
}
});
m_AttPanel.getSelectionModel()
.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
ListSelectionModel lm = (ListSelectionModel) e.getSource();
for (int i = e.getFirstIndex(); i <= e.getLastIndex(); i++) {
if (lm.isSelectedIndex(i)) {
m_AttSummaryPanel.setAttribute(i);
m_AttVisualizePanel.setAttribute(i);
break;
}
}
}
}
});
m_InstSummaryPanel.setBorder(BorderFactory
.createTitledBorder("Current relation"));
JPanel attStuffHolderPanel = new JPanel();
attStuffHolderPanel.setBorder(BorderFactory
.createTitledBorder("Attributes"));
attStuffHolderPanel.setLayout(new BorderLayout());
attStuffHolderPanel.add(m_AttPanel, BorderLayout.CENTER);
m_RemoveButton.setEnabled(false);
m_RemoveButton.setToolTipText("Remove selected attributes.");
m_RemoveButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
Remove r = new Remove();
int [] selected = m_AttPanel.getSelectedAttributes();
if (selected.length == 0) {
return;
}
if (selected.length == m_Instances.numAttributes()) {
// Pop up an error optionpane
JOptionPane.showMessageDialog(PreprocessPanel.this,
"Can't remove all attributes from data!\n",
"Remove Attributes",
JOptionPane.ERROR_MESSAGE);
m_Log.logMessage("Can't remove all attributes from data!");
m_Log.statusMessage("Problem removing attributes");
return;
}
r.setAttributeIndicesArray(selected);
r.setInputFormat(new Instances(m_Instances));
applyFilter(r);
} catch (Exception ex) {
if (m_Log instanceof TaskLogger) {
((TaskLogger)m_Log).taskFinished();
}
// Pop up an error optionpane
JOptionPane.showMessageDialog(PreprocessPanel.this,
"Problem filtering instances:\n"
+ ex.getMessage(),
"Remove Attributes",
JOptionPane.ERROR_MESSAGE);
m_Log.logMessage("Problem removing attributes: " + ex.getMessage());
m_Log.statusMessage("Problem removing attributes");
}
}
});
JPanel p1 = new JPanel();
p1.setBorder(BorderFactory.createEmptyBorder(10, 5, 10, 5));
p1.setLayout(new BorderLayout());
p1.add(m_RemoveButton, BorderLayout.CENTER);
attStuffHolderPanel.add(p1, BorderLayout.SOUTH);
m_AttSummaryPanel.setBorder(BorderFactory
.createTitledBorder("Selected attribute"));
m_UndoBut.setEnabled(false);
m_SaveBut.setEnabled(false);
m_ApplyFilterBut.setEnabled(false);
// Set up the GUI layout
JPanel buttons = new JPanel();
buttons.setBorder(BorderFactory.createEmptyBorder(10, 5, 10, 5));
buttons.setLayout(new GridLayout(1, 6, 5, 5));
buttons.add(m_OpenFileBut);
buttons.add(m_OpenURLBut);
buttons.add(m_OpenDBBut);
buttons.add(m_UndoBut);
buttons.add(m_SaveBut);
JPanel attInfo = new JPanel();
attInfo.setLayout(new BorderLayout());
attInfo.add(attStuffHolderPanel, BorderLayout.CENTER);
JPanel filter = new JPanel();
filter.setBorder(BorderFactory
.createTitledBorder("Filter"));
filter.setLayout(new BorderLayout());
filter.add(m_FilterPanel, BorderLayout.CENTER);
filter.add(m_ApplyFilterBut, BorderLayout.EAST);
JPanel attVis = new JPanel();
attVis.setLayout( new GridLayout(2,1) );
attVis.add(m_AttSummaryPanel);
JComboBox colorBox = m_AttVisualizePanel.getColorBox();
colorBox.setToolTipText("The chosen attribute will also be used as the " +
"class attribute when a filter is applied.");
final JButton visAllBut = new JButton("Visualize All");
visAllBut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
if (m_Instances != null) {
try {
final weka.gui.beans.AttributeSummarizer as =
new weka.gui.beans.AttributeSummarizer();
as.setColoringIndex(m_AttVisualizePanel.getColoringIndex());
as.setInstances(m_Instances);
final javax.swing.JFrame jf = new javax.swing.JFrame();
jf.getContentPane().setLayout(new java.awt.BorderLayout());
jf.getContentPane().add(as, java.awt.BorderLayout.CENTER);
jf.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
visAllBut.setEnabled(true);
jf.dispose();
}
});
jf.setSize(830,600);
jf.setVisible(true);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
});
JPanel histoHolder = new JPanel();
histoHolder.setLayout(new BorderLayout());
histoHolder.add(m_AttVisualizePanel, BorderLayout.CENTER);
JPanel histoControls = new JPanel();
histoControls.setLayout(new BorderLayout());
histoControls.add(colorBox, BorderLayout.CENTER);
histoControls.add(visAllBut, BorderLayout.EAST);
histoHolder.add(histoControls, BorderLayout.NORTH);
attVis.add(histoHolder);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -