2015-08-10 1 views
0

Я работаю над разработкой графического интерфейса с использованием Java. GUI в какой-то момент установил бы связь с R, используя Rserve для выполнения некоторой функции. Сначала я проверил соединение с R, используя Rserve в основном методе GUI, и он отлично работал. Вот код:Rserve не удается установить соединение в actionPerformed method в Java GUI код

public static void main(String[] args) throws RserveException, 
      REXPMismatchException { 

     // Setting up connection to R 
     RConnection rc = new RConnection(); 
     REXP x = rc.eval("R.version.string"); //example to check if connection to R is set 
     System.out.println(x.asString()); 

     // Run the GUI construction in the Event-Dispatching thread for thread-safety 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 

       new GUIMain(); // Let the constructor do the job 
      } 
     }); 
    } 

Теперь я хочу, чтобы настроить подключение к R в методе actionPerformed (на выполнение определенного события). Который я не могу сделать.

public void actionPerformed(ActionEvent e) { 

     //Handle open raw imaging file button and menu item action. 
     if ((e.getSource() == OpenImagingFileButton) || (e.getSource() == LoadRawSpectraMenuItem)) { 
      int returnVal = fc1.showOpenDialog(GUIMain.this); 

      if (returnVal == JFileChooser.APPROVE_OPTION) { 
       file = fc1.getSelectedFile(); 
       System.out.println(file.getAbsolutePath()); 


       REXP x = null; //example to check if connection to R is set 
       try { 
        x = rc.eval("R.version.string"); 
       } catch (RserveException e1) { 
        e1.printStackTrace(); 
       } 
       try { 
        System.out.println(x.asString()); 
       } catch (REXPMismatchException e1) { 
        e1.printStackTrace(); 
       } 
       System.out.println(" - Done "); 
      } 
     } 
} 

Если я вставляю бросает RserveException, REXPMismatchException в этом методе я получаю ошибку, что переопределяется метод не бросать эти исключения. На окружающих код withtry прилов блок (как показано в приведенном выше коде), я получаю следующие ошибки:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at GUIMain.actionPerformed(GUIMain.java:482) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289) 
    at java.awt.Component.processMouseEvent(Component.java:6516) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3312) 
    at java.awt.Component.processEvent(Component.java:6281) 
    at java.awt.Container.processEvent(Container.java:2229) 
    at java.awt.Component.dispatchEventImpl(Component.java:4872) 
    at java.awt.Container.dispatchEventImpl(Container.java:2287) 
    at java.awt.Component.dispatchEvent(Component.java:4698) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
    at java.awt.Container.dispatchEventImpl(Container.java:2273) 
    at java.awt.Window.dispatchEventImpl(Window.java:2719) 
    at java.awt.Component.dispatchEvent(Component.java:4698) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:747) 
    at java.awt.EventQueue.access$300(EventQueue.java:103) 
    at java.awt.EventQueue$3.run(EventQueue.java:706) 
    at java.awt.EventQueue$3.run(EventQueue.java:704) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
    at java.awt.EventQueue$4.run(EventQueue.java:720) 
    at java.awt.EventQueue$4.run(EventQueue.java:718) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:717) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 

Как я могу решить эту проблему?

ответ

0

Я получил решение, добавив новое Rconnection в метод actionPerformed.

public void actionPerformed(ActionEvent e) { 

     //Handle open raw imaging file button and menu item action. 
     if ((e.getSource() == OpenImagingFileButton) || (e.getSource() == LoadRawSpectraMenuItem)) { 
      int returnVal = fc1.showOpenDialog(GUIMain.this); 

      if (returnVal == JFileChooser.APPROVE_OPTION) { 
       file = fc1.getSelectedFile(); 
       System.out.println(file.getAbsolutePath()); 


       REXP x = null; //example to check if connection to R is set 
       try { 
        rc = new RConnection(); 
        x = rc.eval("R.version.string");    
       } catch (RserveException e1) { 
        e1.printStackTrace(); 
       } 
       try { 
        System.out.println(x.asString()); 
       } catch (REXPMismatchException e1) { 
        e1.printStackTrace(); 
       } 
       System.out.println(" - Done "); 
      } 
     } 
}