/* * 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. */ /* * GUIChooser.java * Copyright (C) 1999 University of Waikato, Hamilton, New Zealand * */ package weka.gui; import weka.classifiers.EnsembleLibrary; import weka.classifiers.evaluation.ThresholdCurve; import weka.core.Copyright; import weka.core.Instances; import weka.core.Memory; import weka.core.SystemInfo; import weka.core.Utils; import weka.core.Version; import weka.gui.arffviewer.ArffViewer; import weka.gui.beans.KnowledgeFlow; import weka.gui.beans.KnowledgeFlowApp; import weka.gui.boundaryvisualizer.BoundaryVisualizer; import weka.gui.experiment.Experimenter; import weka.gui.explorer.Explorer; import weka.gui.graphvisualizer.GraphVisualizer; import weka.gui.sql.SqlViewer; import weka.gui.treevisualizer.Node; import weka.gui.treevisualizer.NodePlace; import weka.gui.treevisualizer.PlaceNode2; import weka.gui.treevisualizer.TreeBuild; import weka.gui.treevisualizer.TreeVisualizer; import weka.gui.visualize.PlotData2D; import weka.gui.visualize.ThresholdVisualizePanel; import weka.gui.visualize.VisualizePanel; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Color; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; 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.WindowAdapter; import java.awt.event.WindowEvent; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.Reader; import java.util.Collections; import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingConstants; /** * The main class for the Weka GUIChooser. Lets the user choose * which GUI they want to run. * * @author Len Trigg (trigg@cs.waikato.ac.nz) * @author Mark Hall (mhall@cs.waikato.ac.nz) * @author FracPete (fracpete at waikato dot ac dot nz) * @version $Revision: 1.34 $ */ public class GUIChooser extends JFrame { /** for serialization */ private static final long serialVersionUID = 9001529425230247914L; /** the GUIChooser itself */ protected GUIChooser m_Self; // Applications /** the panel for the application buttons */ protected JPanel m_PanelApplications = new JPanel(); /** Click to open the Explorer */ protected Button m_ExplorerBut = new Button("Explorer"); /** The frame containing the explorer interface */ protected JFrame m_ExplorerFrame; /** Click to open the Explorer */ protected Button m_ExperimenterBut = new Button("Experimenter"); /** The frame containing the experiment interface */ protected JFrame m_ExperimenterFrame; /** Click to open the KnowledgeFlow */ protected Button m_KnowledgeFlowBut = new Button("KnowledgeFlow"); /** The frame containing the knowledge flow interface */ protected JFrame m_KnowledgeFlowFrame; /** Click to open the simplecli */ protected Button m_SimpleBut = new Button("Simple CLI"); /** The SimpleCLI */ protected SimpleCLI m_SimpleCLI; // Tools /** the panel for the tool buttons */ protected JPanel m_PanelTools = new JPanel(); /** Click to open the ArffViewer */ protected Button m_ArffViewerBut = new Button("ArffViewer"); /** keeps track of the opened ArffViewer instancs */ protected Vector m_ArffViewers = new Vector(); /** Click to open the SqlViewer */ protected Button m_SqlViewerBut = new Button("SqlViewer"); /** The frame containing the SqlViewer */ protected JFrame m_SqlViewerFrame; /** Click to open the EnsembleLibrary */ protected Button m_EnsembleLibraryBut = new Button("Ensemble Library"); /** The frame containing the ensemble library interface */ protected JFrame m_EnsembleLibraryFrame; // Visualization /** the panel for the visualization buttons */ protected JPanel m_PanelVisualization = new JPanel(); /** Click to open the Plot visualization */ protected Button m_PlotBut = new Button("Plot"); /** keeps track of the opened plots */ protected Vector m_Plots = new Vector(); /** Click to open the ROC visualization */ protected Button m_ROCBut = new Button("ROC"); /** keeps track of the opened ROCs */ protected Vector m_ROCs = new Vector(); /** Click to open the tree visualizer */ protected Button m_TreeVisualizerBut = new Button("TreeVisualizer"); /** keeps track of the opened tree visualizer instancs */ protected Vector m_TreeVisualizers = new Vector(); /** Click to open the graph visualizer */ protected Button m_GraphVisualizerBut = new Button("GraphVisualizer"); /** keeps track of the opened graph visualizer instancs */ protected Vector m_GraphVisualizers = new Vector(); /** Click to open the boundary visualizer */ protected Button m_BoundaryVisualizerBut = new Button("BoundaryVisualizer"); /** The frame containing the boundary visualizer */ protected JFrame m_BoundaryVisualizerFrame; // Help /** the panel for the help buttons */ protected JPanel m_PanelHelp = new JPanel(); /** Click to open the Weka homepage */ protected Button m_HomepageBut = new Button("Homepage"); /** Click to open the online documentation */ protected Button m_WekaDocBut = new Button("Online doc"); /** Click to open WekaWiki */ protected Button m_WekaWikiBut = new Button("HOWTOs, ..."); /** Click to open the Sourceforge homepage */ protected Button m_SourceforgeBut = new Button("Sourceforge"); /** Click to open the System info */ protected Button m_SystemInfoBut = new Button("SystemInfo"); /** The frame containing the system info */ protected JFrame m_SystemInfoFrame; // Other /** the panel for the other buttons */ protected JPanel m_PanelOther = new JPanel(); /** Click to open the LogWindow */ protected Button m_LogWindowBut = new Button("Log"); /** Click to open the MemoryUsage */ protected Button m_MemoryUsageBut = new Button("Memory usage"); /** The frame containing the memory usage */ protected JFrame m_MemoryUsageFrame; /** Click to exit Weka */ protected Button m_ExitBut = new Button("Exit"); /** The frame of the LogWindow */ protected static LogWindow m_LogWindow = new LogWindow(); /** The weka image */ Image m_weka = Toolkit.getDefaultToolkit(). getImage(ClassLoader.getSystemResource("weka/gui/weka3.gif")); /** filechooser for the TreeVisualizer */ protected JFileChooser m_FileChooserTreeVisualizer = new JFileChooser(new File(System.getProperty("user.dir"))); /** filechooser for the GraphVisualizer */ protected JFileChooser m_FileChooserGraphVisualizer = new JFileChooser(new File(System.getProperty("user.dir"))); /** filechooser for Plots */ protected JFileChooser m_FileChooserPlot = new JFileChooser(new File(System.getProperty("user.dir"))); /** filechooser for ROC curves */ protected JFileChooser m_FileChooserROC = new JFileChooser(new File(System.getProperty("user.dir"))); /** the icon for the frames */ protected Image m_Icon; /** * Creates the experiment environment gui with no initial experiment */ public GUIChooser() { super("Weka GUI Chooser"); m_Self = this; // filechoosers m_FileChooserGraphVisualizer.addChoosableFileFilter( new ExtensionFileFilter(".bif", "BIF Files (*.bif)")); m_FileChooserGraphVisualizer.addChoosableFileFilter( new ExtensionFileFilter(".xml", "XML Files (*.xml)")); m_FileChooserPlot.addChoosableFileFilter( new ExtensionFileFilter( Instances.FILE_EXTENSION, "ARFF Files (*" + Instances.FILE_EXTENSION + ")")); m_FileChooserPlot.setMultiSelectionEnabled(true); m_FileChooserROC.addChoosableFileFilter( new ExtensionFileFilter( Instances.FILE_EXTENSION, "ARFF Files (*" + Instances.FILE_EXTENSION + ")")); // general layout m_Icon = Toolkit.getDefaultToolkit().getImage( ClassLoader.getSystemResource("weka/gui/weka_icon.gif")); setIconImage(m_Icon); this.getContentPane().setLayout(new BorderLayout()); JPanel panels = new JPanel(); panels.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; c.gridwidth = GridBagConstraints.REMAINDER; c.weightx = 2; c.weighty = 2; panels.add(m_PanelApplications, c); c.weightx = 2; c.weighty = 2; panels.add(m_PanelTools, c); c.weightx = 2; c.weighty = 3; panels.add(m_PanelVisualization, c); c.weightx = 2; c.weighty = 3; panels.add(m_PanelHelp, c); c.weightx = 2; c.weighty = 1; panels.add(m_PanelOther, c); getContentPane().add(panels, BorderLayout.SOUTH); // applications m_PanelApplications.setBorder(BorderFactory.createTitledBorder("Applications")); m_PanelApplications.setLayout(new GridLayout(2, 2)); m_PanelApplications.add(m_ExplorerBut); m_PanelApplications.add(m_ExperimenterBut); m_PanelApplications.add(m_KnowledgeFlowBut); m_PanelApplications.add(m_SimpleBut); // tools m_PanelTools.setBorder(BorderFactory.createTitledBorder("Tools")); // see below //m_PanelTools.setLayout(new GridLayout(2, 2)); m_PanelTools.setLayout(new GridLayout(1, 2)); m_PanelTools.add(m_ArffViewerBut); m_PanelTools.add(m_SqlViewerBut); // removed due to bugs... FracPete //m_PanelTools.add(m_EnsembleLibraryBut); //m_PanelTools.add(new JLabel("")); // visualization m_PanelVisualization.setBorder(BorderFactory.createTitledBorder("Visualization")); m_PanelVisualization.setLayout(new GridLayout(3, 2)); m_PanelVisualization.add(m_PlotBut); m_PanelVisualization.add(m_ROCBut); m_PanelVisualization.add(m_TreeVisualizerBut); m_PanelVisualization.add(m_GraphVisualizerBut); m_PanelVisualization.add(m_BoundaryVisualizerBut); m_PanelVisualization.add(new JLabel("")); // help m_PanelHelp.setBorder(BorderFactory.createTitledBorder("Help")); m_PanelHelp.setLayout(new GridLayout(3, 2)); m_PanelHelp.add(m_HomepageBut); m_PanelHelp.add(m_WekaDocBut); m_PanelHelp.add(m_WekaWikiBut); m_PanelHelp.add(m_SourceforgeBut); m_PanelHelp.add(m_SystemInfoBut); m_PanelHelp.add(new JLabel("")); // other m_PanelOther.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); m_PanelOther.setLayout(new GridLayout(2, 2)); m_PanelOther.add(m_LogWindowBut); m_PanelOther.add(m_MemoryUsageBut); m_PanelOther.add(m_ExitBut); m_PanelOther.add(new JLabel("")); JPanel wekaPan = new JPanel(); wekaPan.setToolTipText("Weka, a native bird of New Zealand"); ImageIcon wii = new ImageIcon(m_weka); JLabel wekaLab = new JLabel(wii); wekaPan.add(wekaLab); this.getContentPane().add(wekaPan, BorderLayout.CENTER); JPanel titlePan = new JPanel(); titlePan.setLayout(new GridLayout(8,1)); titlePan.setBorder(BorderFactory.createEmptyBorder(10, 5, 10, 5)); titlePan.add(new JLabel("Waikato Environment for", SwingConstants.CENTER)); titlePan.add(new JLabel("Knowledge Analysis", SwingConstants.CENTER)); titlePan.add(new JLabel("")); titlePan.add(new JLabel("Version " + Version.VERSION, SwingConstants.CENTER)); titlePan.add(new JLabel("")); titlePan.add(new JLabel("(c) " + Copyright.getFromYear() + " - " + Copyright.getToYear(), SwingConstants.CENTER)); titlePan.add(new JLabel(Copyright.getOwner(), SwingConstants.CENTER)); titlePan.add(new JLabel(Copyright.getAddress(), SwingConstants.CENTER)); this.getContentPane().add(titlePan, BorderLayout.NORTH); // applications m_ExplorerBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (m_ExplorerFrame == null) { m_ExplorerBut.setEnabled(false); m_ExplorerFrame = new JFrame("Weka Explorer"); m_ExplorerFrame.setIconImage(m_Icon); m_ExplorerFrame.getContentPane().setLayout(new BorderLayout()); m_ExplorerFrame.getContentPane().add(new Explorer(), BorderLayout.CENTER); m_ExplorerFrame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent w) { m_ExplorerFrame.dispose(); m_ExplorerFrame = null; m_ExplorerBut.setEnabled(true); checkExit(); } }); m_ExplorerFrame.pack(); m_ExplorerFrame.setSize(800, 600); m_ExplorerFrame.setVisible(true); } } }); m_ExperimenterBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (m_ExperimenterFrame == null) { m_ExperimenterBut.setEnabled(false); m_ExperimenterFrame = new JFrame("Weka Experiment Environment"); m_ExperimenterFrame.setIconImage(m_Icon); m_ExperimenterFrame.getContentPane().setLayout(new BorderLayout()); m_ExperimenterFrame.getContentPane() .add(new Experimenter(false), BorderLayout.CENTER); m_ExperimenterFrame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent w) { m_ExperimenterFrame.dispose(); m_ExperimenterFrame = null; m_ExperimenterBut.setEnabled(true); checkExit(); } }); m_ExperimenterFrame.pack(); m_ExperimenterFrame.setSize(800, 600); m_ExperimenterFrame.setVisible(true); } } }); KnowledgeFlowApp.addStartupListener(new weka.gui.beans.StartUpListener() { public void startUpComplete() { if (m_KnowledgeFlowFrame == null) { final KnowledgeFlowApp kna = KnowledgeFlowApp.getSingleton(); m_KnowledgeFlowBut.setEnabled(false); m_KnowledgeFlowFrame = new JFrame("Weka KnowledgeFlow Environment"); m_KnowledgeFlowFrame.setIconImage(m_Icon); m_KnowledgeFlowFrame.getContentPane().setLayout(new BorderLayout()); m_KnowledgeFlowFrame.getContentPane() .add(kna, BorderLayout.CENTER); m_KnowledgeFlowFrame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent w) { kna.clearLayout(); m_KnowledgeFlowFrame.dispose(); m_KnowledgeFlowFrame = null; m_KnowledgeFlowBut.setEnabled(true); checkExit(); } }); m_KnowledgeFlowFrame.pack(); m_KnowledgeFlowFrame.setSize(900, 600); m_KnowledgeFlowFrame.setVisible(true); } } }); m_KnowledgeFlowBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { KnowledgeFlow.startApp(); } }); m_SimpleBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (m_SimpleCLI == null) { m_SimpleBut.setEnabled(false); try { m_SimpleCLI = new SimpleCLI(); m_SimpleCLI.setIconImage(m_Icon); } catch (Exception ex) { throw new Error("Couldn't start SimpleCLI!"); } m_SimpleCLI.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent w) { m_SimpleCLI.dispose(); m_SimpleCLI = null; m_SimpleBut.setEnabled(true); checkExit(); } }); m_SimpleCLI.setVisible(true); } } }); // tools m_ArffViewerBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { final ArffViewer av = new ArffViewer(); av.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent w) { m_ArffViewers.remove(av); checkExit(); } }); av.setVisible(true); m_ArffViewers.add(av); } }); m_SqlViewerBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (m_SqlViewerFrame == null) { m_SqlViewerBut.setEnabled(false); final SqlViewer sql = new SqlViewer(null); m_SqlViewerFrame = new JFrame("SqlViewer"); m_SqlViewerFrame.setIconImage(m_Icon); m_SqlViewerFrame.getContentPane().setLayout(new BorderLayout()); m_SqlViewerFrame.getContentPane().add(sql, BorderLayout.CENTER); m_SqlViewerFrame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent w) { sql.saveSize(); m_SqlViewerFrame.dispose(); m_SqlViewerFrame = null; m_SqlViewerBut.setEnabled(true); checkExit(); } }); m_SqlViewerFrame.pack(); m_SqlViewerFrame.setVisible(true); } } }); m_EnsembleLibraryBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (m_EnsembleLibraryFrame == null) { m_EnsembleLibraryBut.setEnabled(false); m_EnsembleLibraryFrame = new JFrame("EnsembleLibrary"); m_EnsembleLibraryFrame.setIconImage(m_Icon); m_EnsembleLibraryFrame.getContentPane().setLayout(new BorderLayout()); EnsembleLibrary value = new EnsembleLibrary(); EnsembleLibraryEditor libraryEditor = new EnsembleLibraryEditor(); libraryEditor.setValue(value); m_EnsembleLibraryFrame.getContentPane().add(libraryEditor.getCustomEditor(), BorderLayout.CENTER); m_EnsembleLibraryFrame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent w) { m_EnsembleLibraryFrame.dispose(); m_EnsembleLibraryFrame = null; m_EnsembleLibraryBut.setEnabled(true); checkExit(); } }); m_EnsembleLibraryFrame.pack(); m_EnsembleLibraryFrame.setSize(800, 600); m_EnsembleLibraryFrame.setVisible(true); } } }); // visualization m_PlotBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // choose file int retVal = m_FileChooserPlot.showOpenDialog(m_Self); if (retVal != JFileChooser.APPROVE_OPTION) return; // build plot VisualizePanel panel = new VisualizePanel(); String filenames = ""; File[] files = m_FileChooserPlot.getSelectedFiles(); for (int j = 0; j < files.length; j++) { String filename = files[j].getAbsolutePath(); if (j > 0) filenames += ", "; filenames += filename; System.err.println("Loading instances from " + filename); try { Reader r = new java.io.BufferedReader(new FileReader(filename)); Instances i = new Instances(r); i.setClassIndex(i.numAttributes()-1); PlotData2D pd1 = new PlotData2D(i); if (j == 0) { pd1.setPlotName("Master plot"); panel.setMasterPlot(pd1); } else { pd1.setPlotName("Plot "+(j+1)); pd1.m_useCustomColour = true; pd1.m_customColour = (j % 2 == 0) ? Color.red : Color.blue; panel.addPlot(pd1); } } catch (Exception ex) { ex.printStackTrace(); JOptionPane.showMessageDialog( m_Self, "Error loading file '" + files[j] + "':\n" + ex.getMessage()); return; } } // create frame final JFrame frame = new JFrame("Plot - " + filenames); frame.setIconImage(m_Icon); frame.getContentPane().setLayout(new BorderLayout()); frame.getContentPane().add(panel, BorderLayout.CENTER); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { m_Plots.remove(frame); frame.dispose(); checkExit(); } }); frame.pack(); frame.setSize(800, 600); frame.setVisible(true); m_Plots.add(frame); } }); m_ROCBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // choose file int retVal = m_FileChooserROC.showOpenDialog(m_Self); if (retVal != JFileChooser.APPROVE_OPTION) return; // create plot String filename = m_FileChooserROC.getSelectedFile().getAbsolutePath(); Instances result = null; try { result = new Instances(new BufferedReader(new FileReader(filename))); } catch (Exception ex) { ex.printStackTrace(); JOptionPane.showMessageDialog( m_Self, "Error loading file '" + filename + "':\n" + ex.getMessage()); return; } result.setClassIndex(result.numAttributes() - 1); ThresholdVisualizePanel vmc = new ThresholdVisualizePanel(); vmc.setROCString("(Area under ROC = " + Utils.doubleToString(ThresholdCurve.getROCArea(result), 4) + ")"); vmc.setName(result.relationName()); PlotData2D tempd = new PlotData2D(result); tempd.setPlotName(result.relationName()); tempd.addInstanceNumberAttribute(); try { vmc.addPlot(tempd); } catch (Exception ex) { ex.printStackTrace(); JOptionPane.showMessageDialog( m_Self, "Error adding plot:\n" + ex.getMessage()); return; } final JFrame frame = new JFrame("ROC - " + filename); frame.setIconImage(m_Icon); frame.getContentPane().setLayout(new BorderLayout()); frame.getContentPane().add(vmc, BorderLayout.CENTER); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { m_ROCs.remove(frame); frame.dispose(); checkExit(); } }); frame.pack(); frame.setSize(800, 600); frame.setVisible(true); m_ROCs.add(frame); } }); m_TreeVisualizerBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // choose file int retVal = m_FileChooserTreeVisualizer.showOpenDialog(m_Self); if (retVal != JFileChooser.APPROVE_OPTION) return; // build tree String filename = m_FileChooserTreeVisualizer.getSelectedFile().getAbsolutePath(); TreeBuild builder = new TreeBuild(); Node top = null; NodePlace arrange = new PlaceNode2(); try { top = builder.create(new FileReader(filename)); } catch (Exception ex) { ex.printStackTrace(); JOptionPane.showMessageDialog( m_Self, "Error loading file '" + filename + "':\n" + ex.getMessage()); return; } // create frame final JFrame frame = new JFrame("TreeVisualizer - " + filename); frame.setIconImage(m_Icon); frame.getContentPane().setLayout(new BorderLayout()); frame.getContentPane().add(new TreeVisualizer(null, top, arrange), BorderLayout.CENTER); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { m_TreeVisualizers.remove(frame); frame.dispose(); checkExit(); } }); frame.pack(); frame.setSize(800, 600); frame.setVisible(true); m_TreeVisualizers.add(frame); } }); m_GraphVisualizerBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // choose file int retVal = m_FileChooserGraphVisualizer.showOpenDialog(m_Self); if (retVal != JFileChooser.APPROVE_OPTION) return; // build graph String filename = m_FileChooserGraphVisualizer.getSelectedFile().getAbsolutePath(); GraphVisualizer panel = new GraphVisualizer(); try{ if ( filename.toLowerCase().endsWith(".xml") || filename.toLowerCase().endsWith(".bif") ) { panel.readBIF(new FileInputStream(filename)); } else { panel.readDOT(new FileReader(filename)); } } catch (Exception ex) { ex.printStackTrace(); JOptionPane.showMessageDialog( m_Self, "Error loading file '" + filename + "':\n" + ex.getMessage()); return; } // create frame final JFrame frame = new JFrame("GraphVisualizer - " + filename); frame.setIconImage(m_Icon); frame.getContentPane().setLayout(new BorderLayout()); frame.getContentPane().add(panel, BorderLayout.CENTER); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { m_GraphVisualizers.remove(frame); frame.dispose(); checkExit(); } }); frame.pack(); frame.setSize(800, 600); frame.setVisible(true); m_GraphVisualizers.add(frame); } }); m_BoundaryVisualizerBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (m_BoundaryVisualizerFrame == null) { m_BoundaryVisualizerBut.setEnabled(false); m_BoundaryVisualizerFrame = new JFrame("BoundaryVisualizer"); m_BoundaryVisualizerFrame.setIconImage(m_Icon); m_BoundaryVisualizerFrame.getContentPane().setLayout(new BorderLayout()); m_BoundaryVisualizerFrame.getContentPane().add(new BoundaryVisualizer(), BorderLayout.CENTER); m_BoundaryVisualizerFrame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent w) { m_BoundaryVisualizerFrame.dispose(); m_BoundaryVisualizerFrame = null; m_BoundaryVisualizerBut.setEnabled(true); checkExit(); } }); m_BoundaryVisualizerFrame.pack(); m_BoundaryVisualizerFrame.setSize(800, 600); m_BoundaryVisualizerFrame.setVisible(true); // dont' do a System.exit after last window got closed! BoundaryVisualizer.setExitIfNoWindowsOpen(false); } } }); // help m_HomepageBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { BrowserHelper.openURL("http://www.cs.waikato.ac.nz/~ml/weka/"); } }); m_WekaDocBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { BrowserHelper.openURL("http://weka.sourceforge.net/wekadoc/"); } }); m_WekaWikiBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { BrowserHelper.openURL("http://weka.sourceforge.net/wiki/"); } }); m_SourceforgeBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { BrowserHelper.openURL("http://sourceforge.net/projects/weka/"); } }); m_SystemInfoBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (m_SystemInfoFrame == null) { m_SystemInfoBut.setEnabled(false); m_SystemInfoFrame = new JFrame("SystemInfo"); m_SystemInfoFrame.setIconImage(m_Icon); m_SystemInfoFrame.getContentPane().setLayout(new BorderLayout()); // get info Hashtable info = new SystemInfo().getSystemInfo(); // sort names Vector names = new Vector(); Enumeration enm = info.keys(); while (enm.hasMoreElements()) names.add(enm.nextElement()); Collections.sort(names); // generate table String[][] data = new String[info.size()][2]; for (int i = 0; i < names.size(); i++) { data[i][0] = names.get(i).toString(); data[i][1] = info.get(data[i][0]).toString(); } String[] titles = new String[]{"Key", "Value"}; JTable table = new JTable(data, titles); m_SystemInfoFrame.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER); m_SystemInfoFrame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent w) { m_SystemInfoFrame.dispose(); m_SystemInfoFrame = null; m_SystemInfoBut.setEnabled(true); checkExit(); } }); m_SystemInfoFrame.pack(); m_SystemInfoFrame.setSize(800, 600); m_SystemInfoFrame.setVisible(true); } } }); // other m_LogWindow.setIconImage(m_Icon); m_LogWindowBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { m_LogWindow.setVisible(true); } }); m_MemoryUsageBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (m_MemoryUsageFrame == null) { final MemoryUsagePanel panel = new MemoryUsagePanel(); m_MemoryUsageBut.setEnabled(false); m_MemoryUsageFrame = new JFrame("Memory usage"); m_MemoryUsageFrame.setIconImage(m_Icon); m_MemoryUsageFrame.getContentPane().setLayout(new BorderLayout()); m_MemoryUsageFrame.getContentPane().add(panel, BorderLayout.CENTER); m_MemoryUsageFrame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent w) { panel.stopMonitoring(); m_MemoryUsageFrame.dispose(); m_MemoryUsageFrame = null; m_MemoryUsageBut.setEnabled(true); checkExit(); } }); m_MemoryUsageFrame.pack(); m_MemoryUsageFrame.setSize(400, 50); Point l = panel.getFrameLocation(); if ((l.x != -1) && (l.y != -1)) m_MemoryUsageFrame.setLocation(l); m_MemoryUsageFrame.setVisible(true); Dimension size = m_MemoryUsageFrame.getPreferredSize(); m_MemoryUsageFrame.setSize(new Dimension((int) size.getWidth(), (int) size.getHeight())); } } }); m_ExitBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dispose(); checkExit(); } }); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent w) { dispose(); checkExit(); } }); pack(); } /** * Kills the JVM if all windows have been closed. */ private void checkExit() { if (!isVisible() // applications && (m_ExplorerFrame == null) && (m_ExperimenterFrame == null) && (m_KnowledgeFlowFrame == null) && (m_SimpleCLI == null) // tools && (m_ArffViewers.size() == 0) && (m_SqlViewerFrame == null) && (m_EnsembleLibraryFrame == null) // visualization && (m_Plots.size() == 0) && (m_ROCs.size() == 0) && (m_TreeVisualizers.size() == 0) && (m_GraphVisualizers.size() == 0) && (m_BoundaryVisualizerFrame == null) // help && (m_SystemInfoFrame == null) ) { System.exit(0); } } /** variable for the GUIChooser class which would be set to null by the memory monitoring thread to free up some memory if we running out of memory */ private static GUIChooser m_chooser; /** for monitoring the Memory consumption */ private static Memory m_Memory = new Memory(true); /** * Tests out the GUIChooser environment. * * @param args ignored. */ public static void main(String [] args) { LookAndFeel.setLookAndFeel(); try { // uncomment to disable the memory management: //m_Memory.setEnabled(false); m_chooser = new GUIChooser(); m_chooser.setVisible(true); Thread memMonitor = new Thread() { public void run() { while(true) { try { //System.out.println("before sleeping"); this.sleep(4000); System.gc(); if (m_Memory.isOutOfMemory()) { // clean up m_chooser.dispose(); if(m_chooser.m_ExperimenterFrame!=null) { m_chooser.m_ExperimenterFrame.dispose(); m_chooser.m_ExperimenterFrame =null; } if(m_chooser.m_ExplorerFrame!=null) { m_chooser.m_ExplorerFrame.dispose(); m_chooser.m_ExplorerFrame = null; } if(m_chooser.m_KnowledgeFlowFrame!=null) { m_chooser.m_KnowledgeFlowFrame.dispose(); m_chooser.m_KnowledgeFlowFrame = null; } if(m_chooser.m_SimpleCLI!=null) { m_chooser.m_SimpleCLI.dispose(); m_chooser.m_SimpleCLI = null; } if (m_chooser.m_ArffViewers.size() > 0) { for (int i = 0; i < m_chooser.m_ArffViewers.size(); i++) { ArffViewer av = (ArffViewer) m_chooser.m_ArffViewers.get(i); av.dispose(); } m_chooser.m_ArffViewers.clear(); } m_chooser = null; System.gc(); // stop threads m_Memory.stopThreads(); // display error m_chooser.m_LogWindow.setVisible(true); m_chooser.m_LogWindow.toFront(); System.err.println("\ndisplayed message:"); m_Memory.showOutOfMemory(); System.err.println("\nexiting..."); System.exit(-1); } } catch(InterruptedException ex) { ex.printStackTrace(); } } } }; memMonitor.setPriority(Thread.NORM_PRIORITY); memMonitor.start(); } catch (Exception ex) { ex.printStackTrace(); System.err.println(ex.getMessage()); } } }