📄 genericarrayeditor.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.
*/
/*
* GenericArrayEditor.java
* Copyright (C) 1999 Len Trigg
*
*/
package weka.gui;
import weka.core.SelectedTag;
import weka.core.SerializedObject;
import weka.classifiers.Classifier;
import java.lang.reflect.Array;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeSupport;
import java.beans.PropertyChangeListener;
import java.beans.PropertyEditor;
import java.beans.PropertyEditorManager;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Font;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.BorderLayout;
import java.awt.FontMetrics;
import java.awt.FlowLayout;
import java.awt.event.ItemListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.ListCellRenderer;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JPanel;
import javax.swing.JList;
import javax.swing.ListModel;
import javax.swing.DefaultListModel;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.JOptionPane;
/**
* A PropertyEditor for arrays of objects that themselves have
* property editors.
*
* @author Len Trigg (trigg@cs.waikato.ac.nz)
* @version $Revision: 1.1 $
*/
public class GenericArrayEditor extends JPanel
implements PropertyEditor {
/** Handles property change notification */
private PropertyChangeSupport m_Support = new PropertyChangeSupport(this);
/** The label for when we can't edit that type */
private JLabel m_Label = new JLabel("Can't edit", SwingConstants.CENTER);
/** The list component displaying current values */
private JList m_ElementList = new JList();
/** The class of objects allowed in the array */
private Class m_ElementClass = String.class;
/** The defaultlistmodel holding our data */
private DefaultListModel m_ListModel;
/** The property editor for the class we are editing */
private PropertyEditor m_ElementEditor;
/** Click this to delete the selected array values */
private JButton m_DeleteBut = new JButton("Delete");
/** Click to add the current object configuration to the array */
private JButton m_AddBut = new JButton("Add");
/** Listens to buttons being pressed and taking the appropriate action */
private ActionListener m_InnerActionListener =
new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == m_DeleteBut) {
int [] selected = m_ElementList.getSelectedIndices();
if (selected != null) {
for (int i = 0; i < selected.length; i++) {
int current = selected[i];
m_ListModel.removeElementAt(current);
if (m_ListModel.size() > current) {
m_ElementList.setSelectedIndex(current);
}
}
m_Support.firePropertyChange("", null, null);
}
if (m_ElementList.getSelectedIndex() == -1) {
m_DeleteBut.setEnabled(false);
}
} else if (e.getSource() == m_AddBut) {
int selected = m_ElementList.getSelectedIndex();
Object addObj = m_ElementEditor.getValue();
// Make a full copy of the object using serialization
try {
SerializedObject so = new SerializedObject(addObj);
addObj = so.getObject();
if (selected != -1) {
m_ListModel.insertElementAt(addObj, selected);
} else {
m_ListModel.addElement(addObj);
}
m_Support.firePropertyChange("", null, null);
} catch (Exception ex) {
JOptionPane.showMessageDialog(GenericArrayEditor.this,
"Could not create an object copy",
null,
JOptionPane.ERROR_MESSAGE);
}
}
}
};
/** Listens to list items being selected and takes appropriate action */
private ListSelectionListener m_InnerSelectionListener =
new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if (e.getSource() == m_ElementList) {
// Enable the delete button
if (m_ElementList.getSelectedIndex() != -1) {
m_DeleteBut.setEnabled(true);
}
}
}
};
/**
* Sets up the array editor.
*/
public GenericArrayEditor() {
setLayout(new BorderLayout());
add(m_Label, BorderLayout.CENTER);
m_DeleteBut.addActionListener(m_InnerActionListener);
m_AddBut.addActionListener(m_InnerActionListener);
m_ElementList.addListSelectionListener(m_InnerSelectionListener);
m_AddBut.setToolTipText("Add the current item to the list");
m_DeleteBut.setToolTipText("Delete the selected list item");
}
/** This class handles the creation of list cell renderers from the
* property editors.
*/
private class EditorListCellRenderer implements ListCellRenderer {
/** The class of the property editor for array objects */
private Class m_EditorClass;
/** The class of the array values */
private Class m_ValueClass;
/**
* Creates the list cell renderer.
*
* @param editorClass The class of the property editor for array objects
* @param valueClass The class of the array values
*/
public EditorListCellRenderer(Class editorClass, Class valueClass) {
m_EditorClass = editorClass;
m_ValueClass = valueClass;
}
/**
* Creates a cell rendering component.
*
* @param JList the list that will be rendered in
* @param Object the cell value
* @param int which element of the list to render
* @param boolean true if the cell is selected
* @param boolean true if the cell has the focus
* @return the rendering component
*/
public Component getListCellRendererComponent(final JList list,
final Object value,
final int index,
final boolean isSelected,
final boolean cellHasFocus) {
try {
final PropertyEditor e = (PropertyEditor)m_EditorClass.newInstance();
if (e instanceof GenericObjectEditor) {
// ((GenericObjectEditor) e).setDisplayOnly(true);
((GenericObjectEditor) e).setClassType(m_ValueClass);
}
e.setValue(value);
return new JPanel() {
public void paintComponent(Graphics g) {
Insets i = this.getInsets();
Rectangle box = new Rectangle(i.left, i.top,
this.getWidth() - i.right,
this.getHeight() - i.bottom );
g.setColor(isSelected
? list.getSelectionBackground()
: list.getBackground());
g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.setColor(isSelected
? list.getSelectionForeground()
: list.getForeground());
e.paintValue(g, box);
}
public Dimension getPreferredSize() {
Font f = this.getFont();
FontMetrics fm = this.getFontMetrics(f);
return new Dimension(0, fm.getHeight());
}
};
} catch (Exception ex) {
return null;
}
}
}
/**
* Updates the type of object being edited, so attempts to find an
* appropriate propertyeditor.
*
* @param o a value of type 'Object'
*/
private void updateEditorType(Object o) {
// Determine if the current object is an array
m_ElementEditor = null; m_ListModel = null;
removeAll();
if ((o != null) && (o.getClass().isArray())) {
Class elementClass = o.getClass().getComponentType();
PropertyEditor editor = PropertyEditorManager.findEditor(elementClass);
Component view = null;
ListCellRenderer lcr = new DefaultListCellRenderer();
if (editor != null) {
if (editor instanceof GenericObjectEditor) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -