ex.printStackTrace();
  protected void applyFilter() {    if (m_IOThread == null) {      m_IOThread = new Thread() {	public void run() {	  try {	    Filter filter = (Filter) m_FilterEditor.getValue();	    if (filter != null) {	    	      if (m_Log instanceof TaskLogger) {		((TaskLogger)m_Log).taskStarted();	      }	      m_Log.statusMessage("Saving undo information");	      addUndoPoint();	      m_Log.statusMessage("Passing dataset through filter "				  + filter.getClass().getName());	      filter.setInputFormat(m_Instances);	      m_Instances = filter.useFilter(m_Instances, filter);	      setInstances(m_Instances);	      if (m_Log instanceof TaskLogger) {		((TaskLogger)m_Log).taskFinished();	      }	    }	    	  } catch (Exception ex) {		    if (m_Log instanceof TaskLogger) {	      ((TaskLogger)m_Log).taskFinished();	    }	    // Pop up an error optionpane	    JOptionPane.showMessageDialog(PreprocessPanel.this,					  "Problem filtering instances:\n"					  + ex.getMessage(),					  "Apply Filter",					  JOptionPane.ERROR_MESSAGE);	    ex.printStackTrace();	    m_Log.logMessage("Problem filtering instances: " + ex.getMessage());	  }	  m_IOThread = null;	}      };      m_IOThread.setPriority(Thread.MIN_PRIORITY); // UI has most priority      m_IOThread.start();    } else {      JOptionPane.showMessageDialog(this,				    "Can't apply filter at this time,\n"				    + "currently busy with other IO",				    "Apply Filter",				    JOptionPane.WARNING_MESSAGE);    }  }