2017-01-21 17 views
0

私は、igraphとIntramiRExploreRのVisualization関数を使ってインタラクティブグラフィックを作成するための関数を含む、同僚のカスタムRパッケージ、IntramiRExploreRと一緒に行くためのJava GUIを作成しています。パラメータ:のmiRが選択JCheckboxes介して行わベクター、および方法、脱穀、およびプラットフォームであるRCaller、スレッド処理、およびJava GUI

Visualisation(miR,mRNA_type=c('GeneSymbol'),method,thresh,platform=Platform,visualisation = 'igraph',layout = 'interactive') 

はのJRadioButtonから取り込まれます。私はRで関数を実行し、テキスト出力形式を使用して関数を実行し、両方が正しく実行されるので、関数自体と変数の埋め込み方法は間違いありません。

コードは、まず、前述のを呼び出すために、同一のパラメータおよびオブジェクトを使用するのJButtonを提供

caller.getParser().getAsStringArray(//one of seven parameters) 

を使用してテキストにアクセス出力

Visualisation(miR,mRNA_type=c('GeneSymbol'),method,thresh,platform=Platform) 

の結果と正確JTableのに記入ただし、JButtonをクリックするとigraphが作成されますが、グラフィックが完全に作成されるとすぐにそのフレームが破棄されます。ボタンが再び関数を呼び出し、クリックされた二回目は、提供されるエラーは次のとおりです。

Exception in thread "AWT-EventQueue-0" com.github.rcaller.exception.ExecutionException: Can not run C:\Program Files\R\R-3.3.0\bin\x64\Rscript.exe. Reason: java.lang.IllegalThreadStateException 

私はIGRAPHの可視化を処理するための新しいスレッドを作成する必要があります、または私はこれを扱うことができないのですRCallerにおけるいくつかの方法があります? 2番目のRCallerブロックとRCodeブロックを呼び出した後、Javaはオブジェクトのメモリを空にしていますか?

は、ここで私は守秘義務に私の契約に違反することなく表示することができます私のコードの何:懸念の

public void actionPerformed(ActionEvent e){//if goButton is clicked 
       if(e.getSource() == goButton){ 
        JFrame resultFrame = new JFrame("Results: For full readout, use export button below.");//creates entire resultFrame 
        resultFrame.setLayout(new BorderLayout()); 
        resultFrame.setSize(new Dimension(950,750)); 
        JPanel resultBack = new JPanel(); 
        resultBack.setLayout(new BorderLayout());//creates the resultBack to be placed into JScrollPane 

       //RESULTS (from user query; calls R commands to fill out JTable) 
        //create int checkCnt to keep track of how much info is needed 
         int checkCnt = 0; 
         for(int t = 0;t<155;t++){ 
          if(selected[0][t]==true){//if targets for one miR with index t is queried 
           checkCnt++; 
          }} 

       //create JTable 
         //create column names 
         String[] colNames = {"miRNA", "tar_GS", "tar_FB", "tar_CG", "Score", "Function", "Experiment", "Method"}; 

         //determine threshold 
          int threshold=0; 
          if(checkCnt==1){threshold=100;} 
          if(checkCnt==2){threshold=50;} 
          if(checkCnt==3){threshold=33;} 
          if(checkCnt==4){threshold=25;} 
          if(checkCnt>=5){threshold=20;} 

          /*create RCaller and wire query to buttons; 
          code handles table filling, 
          ///code1 handles graphic display*/ 
          RCaller caller = RCaller.create(); 
          RCaller caller1 = RCaller.create(); 
          RCode code = RCode.create(); 
          RCode code1 = RCode.create(); 
          code.R_require("IntramiRExploreR"); 
          code.R_require("futile.logger"); 
          code.R_require("devtools"); 
          code.R_require("Runiversal"); 
          code1.R_require("IntramiRExploreR"); 
          code1.R_require("futile.logger"); 
          code1.R_require("devtools"); 

          //create array of selected miRs to input to R code 
          String[] chosen = new String[checkCnt]; 
          for(int kk=0;kk<checkCnt;kk++){ 
           chosen[kk] = litmiR(selected)[kk]; 
          } 
          code.addStringArray("miR", chosen); 
          code.addInt("thresh", threshold); 
          code1.addStringArray("miR", chosen); 
          code1.addInt("thresh", threshold); 
          String method =new String(); 

          if(Pears.isSelected()){ 
           method="Pearson"; 
           code.addString("method", method); 
           code1.addString("method", method); 
           } 
          else if(Dist.isSelected()){ 
           method="Distance"; 
           code.addString("method", method); 
           code1.addString("method", method); 
           } 
          else{ 
           method="Both"; 
           code.addString("method", method); 
           code1.addString("method", method); 
          } 
          if(Affy1.isSelected()){ 
           String Platform="Affy1"; 
           code.addString("Platform", Platform); 
           code1.addString("Platform", Platform); 
          } 
          else{ 
           String Platform="Affy2"; 
           code.addString("Platform", Platform); 
           code1.addString("Platform", Platform); 
          } 


          code.addRCode("yy <-Visualisation(miR,mRNA_type=c('GeneSymbol'),method,thresh,platform=Platform)"); 
           String [] aa= caller.getParser().getAsStringArray("miRNA"); 
           String [] aa1= caller.getParser().getAsStringArray("Target_GeneSymbol"); 
           String [] aa2= caller.getParser().getAsStringArray("Targets_FBID"); 
           String [] aa3= caller.getParser().getAsStringArray("Targets_CGID"); 
           double [] aa4= caller.getParser().getAsDoubleArray("Score"); 
           //convert double array to string array 
           String [] sa4= new String[aa4.length]; 
           for(int ss=0;ss<aa4.length;ss++){ 
            sa4[ss]= Double.toString(aa4[ss]); 
           } 
           String [] aa5 = caller.getParser().getAsStringArray("GeneFunction"); 
           String [] aa6 = caller.getParser().getAsStringArray("Experiments"); 


         //create JTable objects 
          String[][] results = new String[checkCnt*threshold][8]; 
          int w = 0; 
          int x = 0; 
          for(int n=0;n<checkCnt;n++){ 
           for(int jj=0;jj<threshold;jj++){//first miR 
            results[jj+w][0]=aa[jj+x*threshold];//the first miR, then the next one after n loops once 
            results[jj+w][1]=aa1[jj+x*threshold];//tar_GS 
            results[jj+w][2]=aa2[jj+x*threshold];//tar_FB 
            results[jj+w][3]=aa3[jj+x*threshold];//tar_CG 
            results[jj+w][4]= sa4[jj+x*threshold];//Score 
            results[jj+w][5]=aa5[jj+x*threshold];//Function 
            results[jj+w][6]=aa6[jj+x*threshold];//Experiment 

           } 
           w=w+threshold; 
           x++; 
          } 
          System.out.println(checkCnt); 

         //make JTable 
          JTable resultTable = new JTable(results, colNames); 

        //create scroll pane to embed results JTable in; allow for vertical scrolling 
         JScrollPane scrollTable = new JScrollPane(resultTable); 
         resultTable.setFillsViewportHeight(true); 
         scrollTable.setPreferredSize(new Dimension(resultBack.getWidth(),(resultFrame.getHeight()-150))); 
         scrollTable.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 
         scrollTable.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
         scrollTable.getVerticalScrollBar().setUnitIncrement(12); 

        //create bottom buttonPanel to allow for visualization, exportation, and ontological research 
         JPanel buttonPanel = new JPanel(); 
         buttonPanel.setPreferredSize(new Dimension(200, 150)); 
         buttonPanel.setBackground(Color.LIGHT_GRAY); 
         buttonPanel.setLayout(null); 


         //create buttons 
          JButton gOnt = new JButton("Gene Ontology"); 
          gOnt.setFont(new Font("Arial", Font.PLAIN, 18)); 
          gOnt.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
          gOnt.setBounds(50,50,250,100); 
          buttonPanel.add(gOnt); 
          JButton vis = new JButton("Visualization"); 
          vis.setFont(new Font("Arial", Font.PLAIN, 18)); 
          vis.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
          vis.setBounds(650,50,250,100); 
          buttonPanel.add(vis); 
          vis.addActionListener(new ActionListener(){ 
           **public void actionPerformed(ActionEvent v){ 
            if(v.getSource() == vis){ 

             code1.addRCode("yy1<-Visualisation(miR,mRNA_type=c('GeneSymbol'),method,thresh,platform=Platform,visualisation = 'igraph',layout = 'interactive')"); 
             caller1.setRCode(code1); 
             caller1.runAndReturnResult("yy1"); 
            } 
           } 
          });** 
          JButton exp = new JButton("Export as .txt file"); 
          exp.setFont(new Font("Arial", Font.PLAIN, 18)); 
          exp.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
          exp.setBounds(350, 50, 250, 100); 
          buttonPanel.add(exp); 


        resultFrame.setLocation(470,150);//add in the panels and display the resultFrame 
        resultFrame.add(buttonPanel, BorderLayout.PAGE_END); 
        resultFrame.add(scrollTable, BorderLayout.PAGE_START); 
        resultFrame.setVisible(true); 
        }}}); 

面積がVIS私のJButtonのActionListenerです。私は絶対に他のすべてがうまくいると確信していますが、igraphは最初にポピュレートした後に応答しなくなり、2番目の呼び出しでIllegalThreadExceptionエラーが発生します。

GUIはNON GUIスレッドから変更することはできません。

+0

長時間実行するタスクを実行する必要がある場合は、バックグラウンドスレッドで実行する必要があります。その結果としてUIを変更する必要がある場合は、SwingWorkerを使用することをお勧めします。[[ Worker Threads and SwingWorker](詳細については、http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html)を参照してください。 – MadProgrammer

答えて

1

これは私が最初にチェックするものです。

GUIに情報を渡すバックグラウンドスレッドがあることを確認してください。そうしないと、処理が終了するまでGUIが応答しなくなります(バックグラウンドスレッドがない場合)

actionPerformedコードの周りにいつでもGUI実行可能ファイルを置くことができます。あなたのケースで

SwingUtilities.invokeLaterを(新しいRunnableを(){...})。

関連する問題