2016-01-11 41 views
0

正試圖添加JFrame以查看它是否有助於使用launch4j將小型jar文件轉換爲.exe。我寫了一個簡短的程序來幫助對工作中的HPLC數據進行分類,並且只是簡單點擊一下。Java應用程序未完成

它在我從命令行java KFile運行並且JFileChooser允許我選擇腳本進行工作的目錄時起作用。當我將它轉換爲.exe時,JFileChooser從不呈現,並且.exe​​關閉。

我讀到我可能需要一個JFrame父級,因此我創建了一個JFrame,但現在腳本在完成之前掛起,就好像等待框架關閉一樣。我對Java很新,所以我不知道如何解決這個問題。

import java.io.*; 
import java.nio.channels.FileChannel; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.Files; 
import java.nio.file.attribute.BasicFileAttributes; 
import java.nio.file.FileVisitResult; 
import java.nio.MappedByteBuffer; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import java.util.Collection; 
import java.util.ArrayList; 
import java.nio.file.SimpleFileVisitor; 



public class KFile extends SimpleFileVisitor<Path> { 

    public static void main(String[] args) { 

     Path currPath = Paths.get(""); 
     String currDir = currPath.toAbsolutePath().toString(); 
     System.out.println(currDir); 


     File dataDir = chooseDir("open"); 
     File destDir = chooseDir("save"); 


     if(!destDir.exists()) { 

      try { 
       destDir.mkdir(); 
      } 
      catch (SecurityException se) { 
       System.out.println("Couldn't make directory!"); 
      } 

     } 
     int n = 0; 
     if(dataDir.exists()) { 
      Collection<Path> allDir = new ArrayList<Path>(); 
      try { 
       addTree(dataDir.toPath(),allDir); 
      } 
      catch (IOException e) { 
       System.out.println("Error with scanning"); 
      } 
      for(Path thisPath : allDir) { 
       if(thisPath.toString().contains("Report.pdf")) { 
        Path thisDir = thisPath.getParent(); 
        File f = new File(thisDir.toString(), "\\Report.txt"); 
        n = n + 1; 
        String fileName = "Report " + n + ".pdf"; 
        try { 
         fileName = parseName(f); 
         System.out.println(fileName); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        File thisFile = new File(destDir + "\\" + fileName); 

        try { 
         copyFile(thisPath.toFile(),thisFile); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 

     } 


    } 


    public static boolean copyFile(File sourceFile, File destFile) throws IOException { 
     //create file if it doesn't exist. 
     if(!destFile.exists()) { 
      destFile.createNewFile();   
     } 

     FileChannel source = null; 
     FileChannel destination = null; 

     try { 
      source = new FileInputStream(sourceFile).getChannel(); 
      destination = new FileOutputStream(destFile).getChannel(); 
      destination.transferFrom(source, 0, source.size()); 
     } 
     finally { 
      if(source != null) { 
       source.close(); 
      } 
      if(destination != null) { 
       destination.close(); 
       return true; 
      } 
      return false; 
     } 

    } 

    public static File chooseDir(String s) { 

     JFrame myFrame = new JFrame("HPLC Data Transfer"); 
     myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     myFrame.pack(); 
     myFrame.setVisible(true); 

     JFileChooser chooser = new JFileChooser(); 
     File currDir = new File(System.getProperty("user.home") + "\\Documents"); 

     chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
     chooser.setCurrentDirectory(currDir); 

     int choice = 0; 
     if (s.equals("save")) { 
      choice = chooser.showSaveDialog(myFrame); 
     } else { 
      choice = chooser.showOpenDialog(myFrame); 
     } 

     myFrame.setVisible(false); 
     myFrame.removeAll(); 
     if(choice == JFileChooser.APPROVE_OPTION) { 
      System.out.println("You chose to open: " + chooser.getSelectedFile().getName()); 
      return chooser.getSelectedFile(); 
     } 
     return new File(""); 
    } 

    static String parseName(File f) throws IOException { 

     BufferedReader textReader = new BufferedReader(new InputStreamReader(new FileInputStream(f), "UTF-16")); 

     int lnCnt = 32; 
     String[] fileData = new String[lnCnt]; 

     for (int i = 0; i < lnCnt; i++) { 
      fileData[i] = textReader.readLine(); 
     } 
     fileData[1] = fileData[1].replace("\uFEFF",""); 
     String name = fileData[1].substring(13) + ".pdf"; 

     textReader.close(); 
     return name; 
    } 

    static void addTree(Path directory, final Collection<Path> all) 
     throws IOException { 
    Files.walkFileTree(directory, new SimpleFileVisitor<Path>() { 
     @Override 
     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) 
       throws IOException { 
      all.add(file); 
      return FileVisitResult.CONTINUE; 
     } 
    }); 
} 

} 

回答

2

你可以試着改變

myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

myFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

,然後調用

myFrame.dispose(); 

終止JFrame。 由於javadocs說:EXIT_ON_CLOSE終止使用System.exit();我不知道整個程序,如果這是你停止應用程序中的問題,但我希望它能幫助:)

2

它看起來像你剛纔叫setVisible(false)你的JFrame的時候。這只是隱藏你的JFrame,它並沒有擺脫它。如果你想完全擺脫你的框架(及其所有資源),請致電myFrame.dispose();

相關問題