2013-04-04 21 views
0

我爲GUI更新系統創建了一個JAR,該系統在其自身內下載可執行文件並執行它。每當我運行原始副本時,這對我來說都是完美的。但是,從互聯網下載時,GUI會中斷。標題字體恢復爲原始字體,並且下載按鈕激活預定的對話框,但其中不會下載文件。請記住,我的setup.jar原始副本的作品,但下載的版本什麼都不做。JAR在下載時不兼容

該JAR可以找到here,但專門爲直接下載,你可能會發現它here

這裏是我的JAVA文件& JAR的層次的圖片內容:

public class UpdateMechanism extends JFrame 
           implements ActionListener { 
    protected static JButton aroundTheLake; 
    protected static JFrame frame; 

    private static JButton aroundTheRiver() { 
     aroundTheLake = new JButton("DOWNLOAD & INSTALL!"); 
     aroundTheLake.setVerticalTextPosition(AbstractButton.CENTER); 
     aroundTheLake.setHorizontalTextPosition(AbstractButton.LEADING); //aka LEFT, for left-to-right locales 
     aroundTheLake.addActionListener(new UpdateMechanism()); 
     aroundTheLake.setMnemonic(KeyEvent.VK_D); 
     aroundTheLake.setActionCommand("aroundthelake"); 
     return aroundTheLake; 
    } 

    private static String readURL(String targetURL) { 
     String returnish = ""; 
     try { 
      URL tempURL = new URL(targetURL); 
      Scanner s = new Scanner(tempURL.openStream()); 
      while (s.hasNextLine()) { 
       returnish = returnish+s.nextLine(); 
      } 
     } catch (IOException e) { 
      System.out.println(e); 
     } 
     return returnish; 
    } 

    private static String readFile(String targetFile) { 
     String returnString = ""; 
     try { 
      File tempFile = new File(targetFile); 
      Scanner s = new Scanner(tempFile); 
      while (s.hasNextLine()) { 
       returnString = returnString + s.nextLine(); 
      } 
     } catch(IOException e) { 
      // ! 
      System.out.println(e); 
     } 
     return returnString; 
    } 

    public void actionPerformed(ActionEvent e) { 
     if ("aroundthelake".equals(e.getActionCommand())) { 
      JOptionPane.showMessageDialog(frame, 
              "Please wait, this may take a while depending on your connection..."); 
      new Thread() { 
       public void run() { 
        URL url; 
        URLConnection con; 
        DataInputStream dis; 
        FileOutputStream fos; 
        byte[] fileData; 
        try { 
         url = new URL("http://hivelocity.dl.sourceforge.net/project/theneverhood/setup.exe"); 
         con = url.openConnection(); 
         dis = new DataInputStream(con.getInputStream()); 
         fileData = new byte[con.getContentLength()]; 
         for (int x = 0; x < fileData.length; x++) { 
          fileData[x] = dis.readByte(); 
         } 
         dis.close(); 
         fos = new FileOutputStream(new File("executable/setup.exe")); 
         fos.write(fileData); 
         fos.close(); 
         Runtime.getRuntime().exec("executable/setup.exe", null, new File("executable/")); 
        } 
        catch(MalformedURLException m) { 
         System.out.println(m); 
        } 
        catch(IOException io) { 
         System.out.println(io); 
        } 
       } 
      }.start(); 
     } else { 
      // man 
     } 
    } 

    private static void showGUI() { 
     frame = new JFrame("The Neverhood Restoration Project"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(new Dimension(1024, 600)); 
     frame.setExtendedState(frame.MAXIMIZED_BOTH); 
     frame.getContentPane().setBackground(new Color(0xA64343)); 

     File fileCheck = new File("C:/Program Files (x86)"); 
     String returnString = null; 
     String rootDirectory = null; 
     if (fileCheck.exists()) { 
      rootDirectory = "C:/Program Files (x86)/DreamWorks Interactive"; 
      String checkFile = rootDirectory+"/Neverhood/version.txt"; 
      File tempFile = new File(checkFile); 
      if (tempFile.exists()) { 
       returnString = readFile(checkFile); 
      } else { 
       returnString = "It appears you do not have the Neverhood Restoration Project installed, or you are using an earlier version."; 
      } 
     } else { 
      rootDirectory = "C:/Program Files/DreamWorks Interactive"; 
      String checkFile = rootDirectory+"/Neverhood/version.txt"; 
      File tempFile = new File(checkFile); 
      if (tempFile.exists()) { 
       returnString = readFile(checkFile); 
      } else { 
       returnString = "It appears you do not have the Neverhood Restoration Project installed, or you are using an earlier version."; 
      } 
     } 
     if (returnString.equals(readURL("http://theneverhood.sourceforge.net/version.txt"))) { 
      returnString = "You are updated to the recent version!"; 
     } else { 
      returnString = "It appears you're not updated."; 
     } 

     JLabel headerLabel = new JLabel("The Neverhood Restoration Project"); 
     headerLabel.setHorizontalAlignment(JLabel.CENTER); 
     JPanel heapPanel = new JPanel(); 
     heapPanel.setLayout(new BoxLayout(heapPanel, BoxLayout.PAGE_AXIS)); 
     heapPanel.setPreferredSize(new Dimension(500, heapPanel.getPreferredSize().height)); 
     JTextArea heapLabel = new JTextArea(50, 50);   
     heapLabel.setLineWrap(true); 
     heapLabel.setWrapStyleWord(true); 
     heapLabel.setEditable(false); 
     heapLabel.setBorder(BorderFactory.createEmptyBorder(10, 20, 10, 20)); 
     heapLabel.setFont(new Font("Serif", Font.PLAIN, 14)); 
     heapLabel.append("Current version: "+readURL("http://theneverhood.sourceforge.net/prettyversion.txt")+".\nInstalled version: "+readFile(rootDirectory+"/Neverhood/prettyversion.txt")+".\n"+returnString+"\n" + 
      "You can read the full version of the document to the left at http://theneverhood.sourceforge.net." 
      + "\nHaven't installed yet? Below is the download button. Just click to save setup.exe in and enjoy!"); 
     heapPanel.add(heapLabel); 
     if (returnString == "It appears you're not updated.") { 
      heapPanel.add(aroundTheRiver()); 
     } 

     try { 
      Font sFont = Font.createFont(Font.TRUETYPE_FONT, new File("DUGFB___.TTF")); 
      sFont = sFont.deriveFont(Font.PLAIN, 48); 
      GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
      ge.registerFont(sFont); 
      headerLabel.setFont(sFont); 
     } catch (FontFormatException | IOException e) { 
      System.out.println(e); 
     } 

     BufferedImage icoImage = null; 
     try { 
      icoImage = ImageIO.read(
       frame.getClass().getResource("/nhood.bmp")); 
     } catch (IOException e) { 
      System.out.println(e); 
     } 
     frame.setIconImage(icoImage); 

     JEditorPane updateLog = new JEditorPane(); 
     JScrollPane scrollPane = new JScrollPane(updateLog); 
     updateLog.setEditable(false); 

     try { 
      updateLog.setPage("http://theneverhood.sourceforge.net/"); 
     } catch (IOException e) { 
      updateLog.setContentType("text/html"); 
      updateLog.setText("<html>The application could not load the webpage.</html>"); 
     } 

     frame.add(headerLabel, BorderLayout.NORTH); 
     frame.add(scrollPane); 
     frame.add(heapPanel, BorderLayout.EAST); 
     frame.pack(); 
     frame.setVisible(true); 
    } 


    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       showGUI(); 
      } 
     }); 
    } 
} 

The poorly illustrated arrow points to "executable," not META-INF.

這畫是當它從所提供的鏈接下載。 The JAR when downloaded from the Internet.

+0

的代碼是越野車在幾個地方。您應該單獨測試每種方法,然後移動。 – Jatin 2013-04-04 05:48:40

回答

1

有在代碼中的許多小錯誤:

new Thread() { 
      public void run() { 
       URL url; 
       URLConnection con; 
       DataInputStream dis; 
       FileOutputStream fos; 
       byte[] fileData; 
       try { 
        url = new URL("http://hivelocity.dl.sourceforge.net/project/theneverhood/setup.exe"); 
        con = url.openConnection(); 
        dis = new DataInputStream(con.getInputStream()); 
        fileData = new byte[con.getContentLength()]; 
        for (int x = 0; x < fileData.length; x++) { 
         fileData[x] = dis.readByte(); 
        } 
        dis.close(); 
        File f = new File("executable"); 
        if(!f.isDirectory()) 
         f.mkdir(); 
        fos = new FileOutputStream(new File("executable/setup.exe")); 
        fos.write(fileData); 
        fos.close(); 

        Runtime.getRuntime().exec("executable/setup.exe", null, new File("executable/")); 
       } 
       catch(MalformedURLException m) { 
        System.out.println(m); 
       } 
       catch(IOException io) { 
        System.out.println(io); 
       } 
      } 
     }.start(); 

另外,我會建議是使用,而不是一個Runtime的ProcessBuilder。 實施例:

List<String> command = new ArrayList<String>(); 
    command.add("cmd"); 
    command.add("/C"); 
    File dcr = new File("executable/setup.exe"); 
    dcr.setExecutable(true, false); 
    command.add(dcr.getAbsolutePath()); 
    ProcessBuilder builder = new ProcessBuilder(command); 
    builder.redirectErrorStream(true); 
    final Process process = builder.start(); 
    try { 
     process.waitFor(); 
    } catch (InterruptedException ex) { 
     Logger.getLogger(WhatEver.class.getName()).log(Level.SEVERE, null, ex); 
     throw ex; 
    } 
    InputStream is = process.getErrorStream(); 
    InputStreamReader isr = new InputStreamReader(is); 
    BufferedReader br = new BufferedReader(isr); 
    String line; 
    while ((line = br.readLine()) != null) { 
     Logger.getLogger(Thumbnail.class.getName()).severe(line); 
    } 

其次,字體是不對的,因爲這會引發異常在

Font sFont = Font.createFont(Font.TRUETYPE_FONT, new File("DUGFB___.TTF"));,因此是不理想的字體。

也改變returnString == "It appears you're not updated."returnString.equals("It appears you're not updated.")