📄 knowledgeflowapp.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. *//* * KnowledgeFlowApp.java * Copyright (C) 2005 Mark Hall * */package weka.gui.beans;import weka.core.Memory;import weka.core.Utils;import weka.core.SerializedObject;import weka.core.xml.KOML;import weka.gui.ExtensionFileFilter;import weka.gui.ListSelectorDialog;import weka.gui.LogPanel;import weka.gui.LookAndFeel;import weka.gui.GenericObjectEditor;import weka.gui.GenericPropertiesCreator;import weka.gui.HierarchyPropertyParser;import weka.gui.beans.xml.XMLBeans;import weka.gui.visualize.PrintablePanel;import java.io.OutputStream;import java.io.InputStream;import java.io.FileOutputStream;import java.io.FileInputStream;import java.io.ObjectOutputStream;import java.io.ObjectInputStream;import java.io.LineNumberReader;import java.io.InputStreamReader;import java.io.File;import java.io.IOException;import java.lang.reflect.Method;import java.util.Enumeration;import java.util.StringTokenizer;import java.util.Vector;import java.util.TreeMap;import java.util.Iterator;import java.util.Properties;import java.util.Enumeration;import java.util.Date;import java.util.Hashtable;import java.text.SimpleDateFormat;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.Box;import javax.swing.JFrame;import javax.swing.JWindow;import javax.swing.JButton;import javax.swing.JToggleButton;import javax.swing.JButton;import javax.swing.DefaultListModel;import javax.swing.JList;import javax.swing.JLabel;import javax.swing.JComponent;import javax.swing.JPopupMenu;import javax.swing.JMenuItem;import javax.swing.JTabbedPane;import javax.swing.JToolBar;import javax.swing.JScrollPane;import javax.swing.ButtonGroup;import javax.swing.ButtonModel;import javax.swing.ImageIcon;import javax.swing.SwingConstants;import javax.swing.JFileChooser;import javax.swing.JTextArea;import javax.swing.filechooser.FileFilter;import java.awt.BorderLayout;import java.awt.FlowLayout;import java.awt.GridLayout;import java.awt.Cursor;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Dimension;import java.awt.event.MouseEvent;import java.awt.event.MouseAdapter;import java.awt.event.MouseMotionAdapter;import java.awt.Point;import java.awt.Font;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;import java.awt.event.InputEvent;import java.awt.Image;import java.awt.Toolkit;import java.awt.Insets;import java.awt.Component;import java.awt.FontMetrics;import java.beans.Customizer;import java.beans.EventSetDescriptor;import java.beans.Beans;import java.beans.PropertyDescriptor;import java.beans.MethodDescriptor;import java.beans.PropertyChangeListener;import java.beans.PropertyChangeEvent;import java.beans.beancontext.*;import java.beans.BeanInfo;import java.beans.Introspector;import java.beans.IntrospectionException;/** * Main GUI class for the KnowledgeFlow * * @author Mark Hall * @version $Revision: 1.14 $ * @since 1.0 * @see JPanel * @see PropertyChangeListener */public class KnowledgeFlowApp extends JPanel implements PropertyChangeListener { /** * Location of the property file for the KnowledgeFlowApp */ protected static String PROPERTY_FILE = "weka/gui/beans/Beans.props"; /** Contains the editor properties */ private static Properties BEAN_PROPERTIES; /** * Holds the details needed to construct button bars for various supported * classes of weka algorithms/tools */ private static Vector TOOLBARS = new Vector(); /** Loads the configuration property file */ static { // Allow a properties file in the current directory to override try { BEAN_PROPERTIES = Utils.readProperties(PROPERTY_FILE); java.util.Enumeration keys = (java.util.Enumeration)BEAN_PROPERTIES.propertyNames(); if (!keys.hasMoreElements()) { throw new Exception( "Could not read a configuration file for the bean\n" +"panel. An example file is included with the Weka distribution.\n" +"This file should be named \"" + PROPERTY_FILE + "\" and\n" +"should be placed either in your user home (which is set\n" + "to \"" + System.getProperties().getProperty("user.home") + "\")\n" + "or the directory that java was started from\n"); } } catch (Exception ex) { JOptionPane.showMessageDialog(null, ex.getMessage(), "KnowledgeFlow", JOptionPane.ERROR_MESSAGE); } try { TreeMap wrapList = new TreeMap(); GenericPropertiesCreator creator = new GenericPropertiesCreator(); creator.execute(false); /* now process the keys in the GenericObjectEditor.props. For each key that has an entry in the Beans.props associating it with a bean component a button tool bar will be created */ Properties GEOProps = //Utils.readProperties("weka/gui/GenericObjectEditor.props"); creator.getOutputProperties(); Enumeration en = GEOProps.propertyNames(); while (en.hasMoreElements()) { String geoKey = (String)en.nextElement(); // try to match this key with one in the Beans.props file String beanCompName = BEAN_PROPERTIES.getProperty(geoKey); if (beanCompName != null) { // add details necessary to construct a button bar for this class // of algorithms Vector newV = new Vector(); // check for a naming alias for this toolbar String toolBarNameAlias = BEAN_PROPERTIES.getProperty(geoKey+".alias"); String toolBarName = (toolBarNameAlias != null) ? toolBarNameAlias : geoKey.substring(geoKey.lastIndexOf('.')+1, geoKey.length()); // look for toolbar ordering information for this wrapper type String order = BEAN_PROPERTIES.getProperty(geoKey+".order"); Integer intOrder = (order != null) ? new Integer(order) : new Integer(0); // Name for the toolbar (name of weka algorithm class) newV.addElement(toolBarName); // Name of bean capable of handling this class of algorithm newV.addElement(beanCompName); // add the root package for this key String rootPackage = geoKey.substring(0, geoKey.lastIndexOf('.')); newV.addElement(rootPackage); // All the weka algorithms of this class of algorithm String wekaAlgs = GEOProps.getProperty(geoKey); Hashtable roots = GenericObjectEditor.sortClassesByRoot(wekaAlgs); Hashtable hpps = new Hashtable(); Enumeration enm = roots.keys(); while (enm.hasMoreElements()) { String root = (String) enm.nextElement(); String classes = (String) roots.get(root); weka.gui.HierarchyPropertyParser hpp = new weka.gui.HierarchyPropertyParser(); hpp.build(classes, ", "); // System.err.println(hpp.showTree()); hpps.put(root, hpp); } //------ test the HierarchyPropertyParser /* weka.gui.HierarchyPropertyParser hpp = new weka.gui.HierarchyPropertyParser(); hpp.build(wekaAlgs, ", "); System.err.println(hpp.showTree()); */ // ----- end test the HierarchyPropertyParser // newV.addElement(hpp); // add the hierarchical property parser newV.addElement(hpps); // add the hierarchical property parser StringTokenizer st = new StringTokenizer(wekaAlgs, ", "); while (st.hasMoreTokens()) { String current = st.nextToken().trim(); newV.addElement(current); } wrapList.put(intOrder, newV); // TOOLBARS.addElement(newV); } } Iterator keysetIt = wrapList.keySet().iterator(); while (keysetIt.hasNext()) { Integer key = (Integer)keysetIt.next(); Vector newV = (Vector)wrapList.get(key); if (newV != null) { TOOLBARS.addElement(newV); } } } catch (Exception ex) { JOptionPane.showMessageDialog(null, "Could not read a configuration file for the generic objecte editor" +". An example file is included with the Weka distribution.\n" +"This file should be named \"GenericObjectEditor.props\" and\n" +"should be placed either in your user home (which is set\n" + "to \"" + System.getProperties().getProperty("user.home") + "\")\n" + "or the directory that java was started from\n", "KnowledgeFlow", JOptionPane.ERROR_MESSAGE); } try { String standardToolBarNames = BEAN_PROPERTIES. getProperty("weka.gui.beans.KnowledgeFlow.standardToolBars"); StringTokenizer st = new StringTokenizer(standardToolBarNames, ", "); while (st.hasMoreTokens()) { String tempBarName = st.nextToken().trim(); // construct details for this toolbar Vector newV = new Vector(); // add the name of the toolbar newV.addElement(tempBarName); // indicate that this is a standard toolbar (no wrapper bean) newV.addElement("null"); String toolBarContents = BEAN_PROPERTIES. getProperty("weka.gui.beans.KnowledgeFlow."+tempBarName); StringTokenizer st2 = new StringTokenizer(toolBarContents, ", "); while (st2.hasMoreTokens()) { String tempBeanName = st2.nextToken().trim(); newV.addElement(tempBeanName); } TOOLBARS.addElement(newV); } } catch (Exception ex) { JOptionPane.showMessageDialog(null, ex.getMessage(), "KnowledgeFlow", JOptionPane.ERROR_MESSAGE); } } /** * Used for displaying the bean components and their visible * connections * * @author <a href="mailto:mhall@cs.waikato.ac.nz">Mark Hall</a> * @version $Revision: 1.14 $ * @since 1.0 * @see PrintablePanel */ protected class BeanLayout extends PrintablePanel { public void paintComponent(Graphics gx) { super.paintComponent(gx); BeanInstance.paintLabels(gx); BeanConnection.paintConnections(gx); // BeanInstance.paintConnections(gx); if (m_mode == CONNECTING) { gx.drawLine(m_startX, m_startY, m_oldX, m_oldY); } else if (m_mode == SELECTING) { gx.drawRect((m_startX < m_oldX) ? m_startX : m_oldX, (m_startY < m_oldY) ? m_startY : m_oldY, Math.abs(m_oldX-m_startX), Math.abs(m_oldY-m_startY)); } } public void doLayout() { super.doLayout(); Vector comps = BeanInstance.getBeanInstances(); for (int i = 0; i < comps.size(); i++) { BeanInstance bi = (BeanInstance)comps.elementAt(i); JComponent c = (JComponent)bi.getBean(); Dimension d = c.getPreferredSize(); c.setBounds(bi.getX(), bi.getY(), d.width, d.height); c.revalidate(); } } } // Used for measuring and splitting icon labels // over multiple lines FontMetrics m_fontM; // constants for operations in progress protected static final int NONE = 0; protected static final int MOVING = 1; protected static final int CONNECTING = 2; protected static final int ADDING = 3; protected static final int SELECTING = 4; // which operation is in progress private int m_mode = NONE; /** the extension for the user components, when serialized to XML */ protected final static String USERCOMPONENTS_XML_EXTENSION = ".xml"; /** * Button group to manage all toolbar buttons */ private ButtonGroup m_toolBarGroup = new ButtonGroup(); /** * Holds the selected toolbar bean */ private Object m_toolBarBean; /** * The layout area */ private BeanLayout m_beanLayout = new BeanLayout(); /** * Tabbed pane to hold tool bars */ private JTabbedPane m_toolBars = new JTabbedPane(); /** * Stuff relating to user created meta beans */ private JToolBar m_userToolBar = null; private Box m_userBoxPanel = null; private Vector m_userComponents = new Vector(); private boolean m_firstUserComponentOpp = true; private JToggleButton m_pointerB; private JButton m_saveB;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -