package edu.cmu.minorthird.classify.multi; import java.awt.Color; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.util.Iterator; import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import edu.cmu.minorthird.classify.Feature; import edu.cmu.minorthird.classify.Instance; import edu.cmu.minorthird.util.StringUtil; import edu.cmu.minorthird.util.gui.ComponentViewer; import edu.cmu.minorthird.util.gui.ParallelViewer; import edu.cmu.minorthird.util.gui.SmartVanillaViewer; import edu.cmu.minorthird.util.gui.TransformedViewer; import edu.cmu.minorthird.util.gui.Viewer; /** * Support routines for building GUI's to view datasets, instances, and * etc. * * @author William Cohen */ public class GUI{ /** A JComponent holding a very concise rendering of an example. */ public static JComponent conciseExampleRendererComponent(MultiExample e, int len,boolean emphasized){ if(e==null) return new JTextField("[null example]"); String sourceString= e.getSource()==null?"[null]":StringUtil.truncate(len,e.getSource() .toString()); JTextField tf=new JTextField(e.getLabel()+" "+sourceString); Color c=(emphasized?Color.blue:Color.black); tf.setBorder(BorderFactory.createLineBorder(c,2)); return tf; } public static JComponent conciseMultiExampleRendererComponent(MultiExample e, int len,boolean emphasized){ if(e==null) return new JTextField("[null example]"); String sourceString= e.getSource()==null?"[null]":StringUtil.truncate(len,e.getSource() .toString()); JTextField tf=new JTextField(e.getMultiLabel()+" "+sourceString); Color c=(emphasized?Color.blue:Color.black); tf.setBorder(BorderFactory.createLineBorder(c,2)); return tf; } /** Create and return a viewer which shows features of * an example, plus it's source in another window. */ public static Viewer newSourcedMultiExampleViewer(){ ParallelViewer main=new ParallelViewer(); main.addSubView("Features",new MultiExampleViewer()); main.addSubView("Source",new TransformedViewer(new SmartVanillaViewer()){ static final long serialVersionUID=20080130L; @Override public Object transform(Object o){ return ((MultiExample)o).getSource(); } }); main.addSubView("Subpopulation",new TransformedViewer( new SmartVanillaViewer()){ static final long serialVersionUID=20080130L; @Override public Object transform(Object o){ return "Subpopulation ID='"+((MultiExample)o).getSubpopulationId()+"'"; } }); return main; } /** A viewer for examples. */ public static class MultiExampleViewer extends ComponentViewer{ static final long serialVersionUID=20080130L; public MultiExampleViewer(){ super(); } public MultiExampleViewer(MultiExample instance){ super(instance); } @Override public boolean canReceive(Object o){ return(o instanceof MultiExample); } @Override public JComponent componentFor(Object o){ MultiExample e=(MultiExample)o; JPanel p=new JPanel(); p.setLayout(new GridBagLayout()); GridBagConstraints gbc=fillerGBC(); gbc.fill=GridBagConstraints.HORIZONTAL; gbc=new GridBagConstraints(); p.add(new JLabel("Class label: "+e.getMultiLabel().toDetails()),gbc); gbc=fillerGBC(); gbc.gridy=1; p.add(instanceComponent(e),gbc); return p; } } /** A viewer for instances */ public static class InstanceViewer extends ComponentViewer{ static final long serialVersionUID=20080130L; public InstanceViewer(){ super(); } public InstanceViewer(Instance instance){ super(instance); } @Override public boolean canReceive(Object o){ return(o instanceof Instance); } @Override public JComponent componentFor(Object o){ return instanceComponent((Instance)o); } } private static JComponent instanceComponent(Instance instance){ int numRows=0; for(Iterator<Feature> i=instance.featureIterator();i.hasNext();i.next()){ numRows++; } Object[][] tableData=new Object[numRows][2]; int k=0; for(Iterator<Feature> i=instance.featureIterator();i.hasNext();){ Feature f=i.next(); tableData[k][0]=f; tableData[k][1]=new Double(instance.getWeight(f)); k++; } String[] columnNames={"Feature Name","Weight"}; JTable table=new JTable(tableData,columnNames); return new JScrollPane(table); } }