📄 knowledgeflow.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.
*/
/*
* KnowledgeFlow.java
* Copyright (C) 2002 Mark Hall
*
*/
package weka.gui.beans;
import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.beans.BeanInfo;
import java.beans.Beans;
import java.beans.Customizer;
import java.beans.EventSetDescriptor;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.MethodDescriptor;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.beancontext.BeanContextChild;
import java.beans.beancontext.BeanContextSupport;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.JWindow;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import weka.core.Utils;
import weka.gui.LogPanel;
/**
* Main GUI class for the KnowledgeFlow
*
* @author <a href="mailto:mhall@cs.waikato.ac.nz">Mark Hall</a>
* @version $Revision$
* @since 1.0
* @see JPanel
* @see PropertyChangeListener
*/
public class KnowledgeFlow extends JPanel implements PropertyChangeListener {
/**
* Location of the property file for the KnowledgeFlow
*/
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");
}
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);
}
try {
/* 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");
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());
// 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);
//------ 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
StringTokenizer st = new StringTokenizer(wekaAlgs, ", ");
while (st.hasMoreTokens()) {
String current = st.nextToken().trim();
newV.addElement(current);
}
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);
}
}
/**
* Used for displaying the bean components and their visible
* connections
*
* @author <a href="mailto:mhall@cs.waikato.ac.nz">Mark Hall</a>
* @version $Revision$
* @since 1.0
* @see JPanel
*/
protected class BeanLayout extends JPanel {
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);
}
}
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;
// which operation is in progress
private int m_mode = NONE;
/**
* 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();
private JToggleButton m_pointerB;
private JButton m_saveB;
private JButton m_loadB;
private JButton m_stopB;
private JButton m_helpB;
/**
* Reference to bean being manipulated
*/
private BeanInstance m_editElement;
/**
* Event set descriptor for the bean being manipulated
*/
private EventSetDescriptor m_sourceEventSetDescriptor;
/**
* Used to record screen coordinates during move and connect
* operations
*/
private int m_oldX, m_oldY;
private int m_startX, m_startY;
/** The file chooser for selecting layout files */
protected JFileChooser m_FileChooser
= new JFileChooser(new File(System.getProperty("user.dir")));
protected LogPanel m_logPanel = new LogPanel(null, true);
protected BeanContextSupport m_bcSupport = new BeanContextSupport();
/**
* Creates a new <code>KnowledgeFlow</code> instance.
*/
public KnowledgeFlow() {
// Grab a fontmetrics object
JWindow temp = new JWindow();
temp.show();
temp.getGraphics().setFont(new Font("Monospaced", Font.PLAIN, 10));
m_fontM = temp.getGraphics().getFontMetrics();
temp.hide();
m_bcSupport.setDesignTime(true);
m_beanLayout.setLayout(null);
// handle mouse events
m_beanLayout.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent me) {
if (m_toolBarBean == null) {
if (((me.getModifiers() & InputEvent.BUTTON1_MASK)
== InputEvent.BUTTON1_MASK) && m_mode == NONE) {
BeanInstance bi = BeanInstance.findInstance(me.getPoint());
JComponent bc = null;
if (bi != null) {
bc = (JComponent)(bi.getBean());
}
if (bc != null && (bc instanceof Visible)) {
m_editElement = bi;
m_oldX = me.getX();
m_oldY = me.getY();
m_mode = MOVING;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -