📄 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) 1999 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.PropertyChangeEvent;import java.beans.PropertyChangeListener;import java.beans.PropertyChangeSupport;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.InputStreamReader;import java.io.Reader;import java.io.Writer;import java.net.URL;import javax.swing.BorderFactory;import javax.swing.JButton;import javax.swing.JFileChooser;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.ListSelectionModel;import javax.swing.SwingConstants;import javax.swing.SwingUtilities;import javax.swing.event.ListSelectionEvent;import javax.swing.event.ListSelectionListener;import javax.swing.filechooser.FileFilter;import weka.core.Instances;import weka.core.SerializedObject;import weka.core.converters.Loader;import weka.experiment.InstanceQuery;import weka.filters.Filter;import weka.gui.AttributeSelectionPanel;import weka.gui.AttributeSummaryPanel;import weka.gui.ExtensionFileFilter;import weka.gui.FileEditor;import weka.gui.GenericArrayEditor;import weka.gui.GenericObjectEditor;import weka.gui.InstancesSummaryPanel;import weka.gui.Logger;import weka.gui.PropertyDialog;import weka.gui.SysErrLog;import weka.gui.TaskLogger;import weka.core.UnassignedClassException;/** * This panel controls simple preprocessing of instances. Attributes may be * selected for inclusion/exclusion, summary information on instances and * attributes is shown. A sequence of filters may be configured to alter the * set of instances. Altered instances may also be saved. * * @author Len Trigg (trigg@cs.waikato.ac.nz) * @version $Revision: 1.23.2.1 $ */public class PreprocessPanel extends JPanel { /** Displays simple stats on the base instances */ protected InstancesSummaryPanel m_BaseInstPanel = new InstancesSummaryPanel(); /** Displays simple stats on the working instances */ protected InstancesSummaryPanel m_WorkingInstPanel = 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..."); protected GenericObjectEditor m_DatabaseQueryEditor = new GenericObjectEditor(); /** Click to apply filters and replace the working dataset */ protected JButton m_ApplyBut = new JButton("Apply Filters"); /** Click to replace the base dataset with the working dataset */ protected JButton m_ReplaceBut = new JButton("Replace"); /** 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(); /** Lets the user add a series of filters */ protected GenericArrayEditor m_Filters = new GenericArrayEditor(); /** Displays summary stats on the selected attribute */ protected AttributeSummaryPanel m_AttSummaryPanel = new AttributeSummaryPanel(); /** Filter to ensure only arff files are selected */ protected FileFilter m_ArffFilter = new ExtensionFileFilter(Instances.FILE_EXTENSION, "Arff data files"); /** The file chooser for selecting arff files */ protected JFileChooser m_FileChooser = new JFileChooser(new File(System.getProperty("user.dir"))); /** 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 unadulterated instances */ protected Instances m_BaseInstances; /** The working (filtered) copy */ protected Instances m_WorkingInstances; /** * Manages sending notifications to people when we change the set of * working instances. */ protected PropertyChangeSupport m_Support = new PropertyChangeSupport(this); /** A thread to loading/saving instances from a file or URL */ protected Thread m_IOThread; protected Logger m_Log = new SysErrLog(); /** A copy of the most recently applied filters */ protected SerializedObject m_FiltersCopy = null; 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) { setBaseInstancesFromDBQ(); } }); } catch (Exception ex) { } 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_ReplaceBut .setToolTipText("Replace the base relation with the working relation"); m_ApplyBut.setToolTipText("Update working relation with current filters"); m_SaveBut.setToolTipText("Save the working relation to a file"); m_Filters.setToolTipText("Edit a list of filters to transform instances"); m_FileChooser.setFileFilter(m_ArffFilter); m_FileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); m_OpenURLBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setBaseInstancesFromURLQ(); } }); m_OpenDBBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { PropertyDialog pd = new PropertyDialog(m_DatabaseQueryEditor,100,100); //setBaseInstancesFromDBQ(); } }); m_OpenFileBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setBaseInstancesFromFileQ(); } }); m_ReplaceBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setBaseInstances(m_WorkingInstances); } }); m_ApplyBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setWorkingInstancesFromFilters(); } }); m_SaveBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { saveWorkingInstancesToFileQ(); } }); 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); break; } } } } }); m_BaseInstPanel.setBorder(BorderFactory .createTitledBorder("Base relation")); m_WorkingInstPanel.setBorder(BorderFactory .createTitledBorder("Working relation")); m_AttPanel.setBorder(BorderFactory .createTitledBorder("Attributes in base relation")); m_Filters.setBorder(BorderFactory.createTitledBorder("Filters")); m_AttSummaryPanel.setBorder(BorderFactory .createTitledBorder("Attribute info for base relation")); m_Filters.setValue(new Filter [0]); m_ReplaceBut.setEnabled(false); m_ApplyBut.setEnabled(false); m_SaveBut.setEnabled(false); // Set up the GUI layout JPanel instInfo = new JPanel(); instInfo.setLayout(new GridLayout(1, 2)); instInfo.add(m_BaseInstPanel); instInfo.add(m_WorkingInstPanel); 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_ApplyBut); buttons.add(m_ReplaceBut); buttons.add(m_SaveBut); JPanel filterNAttInfo = new JPanel(); filterNAttInfo.setLayout(new GridLayout(2, 1)); filterNAttInfo.add(m_Filters); filterNAttInfo.add(m_AttSummaryPanel); JPanel filters = new JPanel(); filters.setLayout(new GridLayout(1, 2)); filters.add(m_AttPanel); filters.add(filterNAttInfo); JPanel p3 = new JPanel(); p3.setLayout(new BorderLayout()); p3.add(instInfo, BorderLayout.NORTH); p3.add(filters, BorderLayout.CENTER); setLayout(new BorderLayout()); add(buttons, BorderLayout.NORTH); add(p3, BorderLayout.CENTER); } /** * gets a copy of the most recently applied filters. * @return a serialized array of the most recently applied filters */ protected synchronized SerializedObject getMostRecentFilters() { return m_FiltersCopy; } /** * Sets the Logger to receive informational messages * * @param newLog the Logger that will now get info messages */ public void setLog(Logger newLog) { m_Log = newLog; } /** * Tells the panel to use a new base set of instances. * * @param inst a set of Instances */ public void setBaseInstances(Instances inst) { m_BaseInstances = inst; try { Runnable r = new Runnable() { public void run() { m_BaseInstPanel.setInstances(m_BaseInstances); m_AttPanel.setInstances(m_BaseInstances); m_AttSummaryPanel.setInstances(m_BaseInstances); m_Log.logMessage("Base relation is now " + m_BaseInstances.relationName() + " (" + m_BaseInstances.numInstances() + " instances)"); m_Log.statusMessage("OK"); // clear most recently applied filters m_FiltersCopy = null; setWorkingInstances(m_BaseInstances); m_ApplyBut.setEnabled(true); m_ReplaceBut.setEnabled(false); m_SaveBut.setEnabled(false); } }; if (SwingUtilities.isEventDispatchThread()) { r.run(); } else { SwingUtilities.invokeAndWait(r); } } catch (Exception ex) { JOptionPane.showMessageDialog(this, "Problem setting base instances:\n" + ex.getMessage(), "Instances", JOptionPane.ERROR_MESSAGE); } } /** * Tells the panel to use a new working set of instances. * * @param inst a set of Instances */ public void setWorkingInstances(Instances inst) { if (m_WorkingInstances != inst) { m_WorkingInstances = inst; m_WorkingInstPanel.setInstances(m_WorkingInstances); m_Log.logMessage("Working relation is now " + m_WorkingInstances.relationName() + " (" + m_WorkingInstances.numInstances() + " instances)"); m_Log.statusMessage("OK"); m_ReplaceBut.setEnabled(true); m_SaveBut.setEnabled(true); // Fire a propertychange event m_Support.firePropertyChange("", null, null); } } /** * Gets the working set of instances. * * @return the working instances */ public Instances getWorkingInstances() { return m_WorkingInstances; } /** * Adds a PropertyChangeListener who will be notified of value changes. * * @param l a value of type 'PropertyChangeListener' */ public void addPropertyChangeListener(PropertyChangeListener l) { m_Support.addPropertyChangeListener(l); } /** * Removes a PropertyChangeListener. * * @param l a value of type 'PropertyChangeListener' */ public void removePropertyChangeListener(PropertyChangeListener l) { m_Support.removePropertyChangeListener(l); } /** * Gets an array of all the filters that have been configured for use. * * @return an array containing all the filters */ protected Filter [] getFilters() { Filter [] extras = (Filter [])m_Filters.getValue(); if (extras == null) { extras = new Filter [0]; } weka.filters.AttributeFilter af = null; try { // Configure the attributeFilter from the current attribute panel int [] selectedAttributes = m_AttPanel.getSelectedAttributes(); if (selectedAttributes.length < m_BaseInstances.numAttributes()) { af = new weka.filters.AttributeFilter(); af.setInvertSelection(true); af.setAttributeIndicesArray(selectedAttributes); } } catch (Exception ex) { ex.printStackTrace(); m_Log.logMessage(ex.getMessage()); } if (af == null) { return extras; } Filter [] result = new Filter[extras.length + 1]; result[0] = af; System.arraycopy(extras, 0, result, 1, extras.length); return result; } /** * Passes the supplied instances through all the filters that have * been configured for use. * * @param instances the input instances * @return the filtered instances */ protected Instances filterInstances(Instances instances) { Filter [] filters = getFilters(); Instances temp = instances; try { if (m_Log instanceof TaskLogger) { ((TaskLogger)m_Log).taskStarted(); } for (int i = 0; i < filters.length; i++) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -