📄 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 weka.core.Capabilities;import weka.core.Instances;import weka.core.OptionHandler;import weka.core.Utils;import weka.core.Capabilities.Capability;import weka.core.converters.AbstractFileLoader;import weka.core.converters.AbstractFileSaver;import weka.core.converters.ConverterUtils;import weka.core.converters.Loader;import weka.core.converters.SerializedInstancesLoader;import weka.core.converters.URLSourcedLoader;import weka.datagenerators.DataGenerator;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.ConverterFileChooser;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;import weka.gui.ViewerDialog;import weka.gui.explorer.Explorer.CapabilitiesFilterChangeEvent;import weka.gui.explorer.Explorer.CapabilitiesFilterChangeListener;import weka.gui.sql.SqlViewerDialog;import java.awt.BorderLayout;import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.Font;import java.awt.GridLayout;import java.awt.Toolkit;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.BufferedOutputStream;import java.io.BufferedWriter;import java.io.File;import java.io.FileOutputStream;import java.io.FileWriter;import java.io.ObjectOutputStream;import java.net.URL;import javax.swing.BorderFactory;import javax.swing.JButton;import javax.swing.JCheckBox;import javax.swing.JComboBox;import javax.swing.JDialog;import javax.swing.JFileChooser;import javax.swing.JFrame;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.ListSelectionModel;import javax.swing.SwingUtilities;import javax.swing.event.ListSelectionEvent;import javax.swing.event.ListSelectionListener;import javax.swing.filechooser.FileFilter;/** * 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: 1.66 $ */public class PreprocessPanel extends JPanel implements CapabilitiesFilterChangeListener { /** 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..."); /** Click to generate artificial data */ protected JButton m_GenerateBut = new JButton("Generate..."); /** Click to revert back to the last saved point */ protected JButton m_UndoBut = new JButton("Undo"); /** Click to open the current instances in a viewer */ protected JButton m_EditBut = new JButton("Edit..."); /** 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 ConverterFileChooser m_FileChooser = new ConverterFileChooser(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 working instances */ protected Instances m_Instances; /** The last generator that was selected */ protected DataGenerator m_DataGenerator = null; /** 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(); /** the parent frame */ protected Explorer m_Explorer = null; static { GenericObjectEditor.registerEditors(); } /** * Creates the instances panel with no initial instances. */ public PreprocessPanel() { // Create/Configure/Connect components m_FilterEditor.setClassType(weka.filters.Filter.class); if (ExplorerDefaults.getFilter() != null) m_FilterEditor.setValue(ExplorerDefaults.getFilter()); 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_GenerateBut.setToolTipText("Generates artificial data"); m_UndoBut.setToolTipText("Undo the last change to the dataset"); m_EditBut.setToolTipText("Open the current dataset in a Viewer for editing"); m_SaveBut.setToolTipText("Save the working relation to a file"); m_ApplyFilterBut.setToolTipText("Apply the current filter to the data"); 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) { SqlViewerDialog dialog = new SqlViewerDialog(null); dialog.setVisible(true); if (dialog.getReturnValue() == JOptionPane.OK_OPTION) setInstancesFromDBQ(dialog.getURL(), dialog.getUser(), dialog.getPassword(), dialog.getQuery()); } }); m_OpenFileBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setInstancesFromFileQ(); } }); m_GenerateBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { generateInstances(); } }); m_UndoBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { undo(); } }); m_EditBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { edit(); } }); 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); 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_EditBut.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_GenerateBut); buttons.add(m_UndoBut); buttons.add(m_EditBut); 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); JPanel lhs = new JPanel(); lhs.setLayout(new BorderLayout()); lhs.add(m_InstSummaryPanel, BorderLayout.NORTH); lhs.add(attInfo, BorderLayout.CENTER); JPanel rhs = new JPanel(); rhs.setLayout(new BorderLayout()); rhs.add(attVis, BorderLayout.CENTER); JPanel relation = new JPanel(); relation.setLayout(new GridLayout(1, 2)); relation.add(lhs); relation.add(rhs); JPanel middle = new JPanel(); middle.setLayout(new BorderLayout()); middle.add(filter, BorderLayout.NORTH); middle.add(relation, BorderLayout.CENTER); setLayout(new BorderLayout()); add(buttons, BorderLayout.NORTH); add(middle, BorderLayout.CENTER); } /** * 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. *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -