📄 propertysheetpanel.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.
*/
/*
* PropertySheet.java
* Copyright (C) 1999 Len Trigg
*
*/
package weka.gui;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.BeanInfo;
import java.beans.Beans;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.MethodDescriptor;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.beans.PropertyDescriptor;
import java.beans.PropertyEditor;
import java.beans.PropertyEditorManager;
import java.beans.PropertyVetoException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingConstants;
/**
* Displays a property sheet where (supported) properties of the target
* object may be edited.
*
* @author Len Trigg (trigg@cs.waikato.ac.nz)
* @version $Revision$
*/
public class PropertySheetPanel extends JPanel
implements PropertyChangeListener {
/** The target object being edited */
private Object m_Target;
/** Holds properties of the target */
private PropertyDescriptor m_Properties[];
/** Holds the methods of the target */
private MethodDescriptor m_Methods[];
/** Holds property editors of the object */
private PropertyEditor m_Editors[];
/** Holds current object values for each property */
private Object m_Values[];
/** Stores GUI components containing each editing component */
private JComponent m_Views[];
/** The labels for each property */
private JLabel m_Labels[];
/** The tool tip text for each property */
private String m_TipTexts[];
/** StringBuffer containing help text for the object being edited */
private StringBuffer m_HelpText;
/** Help frame */
private JFrame m_HelpFrame;
/** Button to pop up the full help text in a separate frame */
private JButton m_HelpBut;
/** A count of the number of properties we have an editor for */
private int m_NumEditable = 0;
/** The panel holding global info and help, if provided by
the object being editied */
private JPanel m_aboutPanel;
/**
* Creates the property sheet panel.
*/
public PropertySheetPanel() {
// setBorder(BorderFactory.createLineBorder(Color.red));
setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));
}
/**
* Return the panel containing global info and help for
* the object being edited. May return null if the edited
* object provides no global info or tip text.
*
* @return the about panel.
*/
public JPanel getAboutPanel() {
return m_aboutPanel;
}
/** A support object for handling property change listeners */
private PropertyChangeSupport support = new PropertyChangeSupport(this);
/**
* Updates the property sheet panel with a changed property and also passed
* the event along.
*
* @param evt a value of type 'PropertyChangeEvent'
*/
public void propertyChange(PropertyChangeEvent evt) {
wasModified(evt); // Let our panel update before guys downstream
support.firePropertyChange("", null, null);
}
/**
* Adds a PropertyChangeListener.
*
* @param l a value of type 'PropertyChangeListener'
*/
public void addPropertyChangeListener(PropertyChangeListener l) {
support.addPropertyChangeListener(l);
}
/**
* Removes a PropertyChangeListener.
*
* @param l a value of type 'PropertyChangeListener'
*/
public void removePropertyChangeListener(PropertyChangeListener l) {
support.removePropertyChangeListener(l);
}
/**
* Sets a new target object for customisation.
*
* @param targ a value of type 'Object'
*/
public synchronized void setTarget(Object targ) {
// used to offset the components for the properties of targ
// if there happens to be globalInfo available in targ
int componentOffset = 0;
// Close any child windows at this point
removeAll();
GridBagLayout gbLayout = new GridBagLayout();
setLayout(gbLayout);
setVisible(false);
m_NumEditable = 0;
m_Target = targ;
try {
BeanInfo bi = Introspector.getBeanInfo(m_Target.getClass());
m_Properties = bi.getPropertyDescriptors();
m_Methods = bi.getMethodDescriptors();
} catch (IntrospectionException ex) {
System.err.println("PropertySheet: Couldn't introspect");
return;
}
int rowHeight = 12;
JTextArea jt = new JTextArea();
m_HelpText = null;
JScrollPane js = null;
// Look for a globalInfo method that returns a string
// describing the target
for (int i = 0;i < m_Methods.length; i++) {
String name = m_Methods[i].getDisplayName();
Method meth = m_Methods[i].getMethod();
if (name.equals("globalInfo")) {
if (meth.getReturnType().equals(String.class)) {
try {
Object args[] = { };
String globalInfo = (String)(meth.invoke(m_Target, args));
String summary = globalInfo;
int ci = globalInfo.indexOf('.');
if (ci != -1) {
summary = globalInfo.substring(0, ci + 1);
}
final String className = targ.getClass().getName();
m_HelpText = new StringBuffer("NAME\n");
m_HelpText.append(className).append("\n\n");
m_HelpText.append("SYNOPSIS\n").append(globalInfo).append("\n\n");
m_HelpBut = new JButton("More");
m_HelpBut.setToolTipText("More information about "
+ className);
m_HelpBut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent a) {
openHelpFrame();
m_HelpBut.setEnabled(false);
}
});
jt.setColumns(30);
jt.setFont(new Font("SansSerif", Font.PLAIN,12));
jt.setEditable(false);
jt.setLineWrap(true);
jt.setWrapStyleWord(true);
jt.setText(summary);
jt.setBackground(getBackground());
rowHeight = 12;
JPanel jp = new JPanel();
jp.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder("About"),
BorderFactory.createEmptyBorder(5, 5, 5, 5)
));
jp.setLayout(new BorderLayout());
jp.add(jt, BorderLayout.CENTER);
JPanel p2 = new JPanel();
p2.setLayout(new BorderLayout());
p2.add(m_HelpBut, BorderLayout.NORTH);
jp.add(p2, BorderLayout.EAST);
GridBagConstraints gbConstraints = new GridBagConstraints();
// gbConstraints.anchor = GridBagConstraints.EAST;
gbConstraints.fill = GridBagConstraints.BOTH;
// gbConstraints.gridy = 0; gbConstraints.gridx = 0;
gbConstraints.gridwidth = 2;
gbConstraints.insets = new Insets(0,5,0,5);
gbLayout.setConstraints(jp, gbConstraints);
m_aboutPanel = jp;
add(m_aboutPanel);
componentOffset = 1;
break;
} catch (Exception ex) {
}
}
}
}
m_Editors = new PropertyEditor[m_Properties.length];
m_Values = new Object[m_Properties.length];
m_Views = new JComponent[m_Properties.length];
m_Labels = new JLabel[m_Properties.length];
m_TipTexts = new String[m_Properties.length];
boolean firstTip = true;
for (int i = 0; i < m_Properties.length; i++) {
// Don't display hidden or expert properties.
if (m_Properties[i].isHidden() || m_Properties[i].isExpert()) {
continue;
}
String name = m_Properties[i].getDisplayName();
Class type = m_Properties[i].getPropertyType();
Method getter = m_Properties[i].getReadMethod();
Method setter = m_Properties[i].getWriteMethod();
// Only display read/write properties.
if (getter == null || setter == null) {
continue;
}
JComponent view = null;
try {
Object args[] = { };
Object value = getter.invoke(m_Target, args);
m_Values[i] = value;
PropertyEditor editor = null;
Class pec = m_Properties[i].getPropertyEditorClass();
if (pec != null) {
try {
editor = (PropertyEditor)pec.newInstance();
} catch (Exception ex) {
// Drop through.
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -