0

更新のための複数の機能を備えたSwingGUIを作成しています。ユーザーが適切に更新されていない場合は、[ダウンロードしてインストール]ボタンが表示されます。それは問題なく動作しますが、ボタンを押しても何も起こりません。それはフリーズしません、それはただそこに座っているようなものです。それでも、「setup.exe」はかなり大きなファイル(〜600MB)ですが、何も表示されず、ファイルがC:\ディレクトリに表示され始めません。私はここで何が間違っているのですか?

protected static JButton aroundTheLake; 

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.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())) {
        try { 
                System.out.println("initiated");
                URL website = new URL("http://theneverhood.sourceforge.net/setup.exe");
                ReadableByteChannel rbc = Channels.newChannel(website.openStream());
                FileOutputStream fos = new FileOutputStream("setup.exe");
                fos.getChannel().transferFrom(rbc, 0, 1 << 24);
        } catch (IOException exc) { 
            System.out.println(exc);
        }
    } else {
        // man
    }
}

private static void showGUI() {
    JFrame 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();
        }
    });
}
4

3 に答える 3

3

コードには2つの主な問題があります。

  • アクションリスナーをボタンに登録していません。このようにしてください:

button.addActionListener(this);
  • actionPerformed()はGUIスレッド(EDT)で実行されるため、集中的な操作を実行しないでください。代わりにSwingWorkerを使用してください。SwingWorkerの仕組みをご覧ください。
于 2013-03-25T18:35:57.670 に答える
1

いくつかのこと:

1)Swingスレッドからネットワーク呼び出しを行わないでください。SwingWorkerを使用します。Swing EDTがブロックされると、すべてのUIアクションが停止します。詳細については、こちらをご覧ください。

2)実際にはJButtonをオーバーライドする必要はありません。代わりにActionListenerを追加するだけです。この方法では、コードの柔軟性が低下します。

3)実際にaddActionListener()を呼び出していることを確認してください。

于 2013-03-25T18:35:36.033 に答える
1

ダウンロードのためにイベントディスパッチスレッドをビジー状態に維持しているため、ユーザーインターフェイスがフリーズします。

イベントディスパッチスレッドは、UIを「アライブ」に維持するスレッドと同じです。イベントハンドラーで直接、知覚できるほど長い時間がかかることは絶対にしないでください。

代わりに、ファイルをダウンロードする別のスレッドを起動する必要があります。このユーザーフレンドリーにするために、進行状況モニターを使用して、ユーザーがプログラムの実行内容、理想的にはプログラムにかかる時間を確認できるようにすることができます。チュートリアルを実行して、それがどのように行われるかを確認することをお勧めします。

簡単な解決策は、新しいスレッドを起動することです。ただし、ユーザーからのフィードバックはまったくないため、これはあまりユーザーフレンドリーではありません。

public void actionPerformed(ActionEvent e) {
    if ("aroundthelake".equals(e.getActionCommand())) {
        new Thread() {
            public void run() {
                try { 
                    System.out.println("initiated");
                    URL website = new URL("http://theneverhood.sourceforge.net/setup.exe"); 
                    ReadableByteChannel rbc = Channels.newChannel(website.openStream());
                    FileOutputStream fos = new FileOutputStream("setup.exe");
                    fos.getChannel().transferFrom(rbc, 0, 1 << 24);
                } catch (IOException exc) { 
                    System.out.println(exc);
                }   
            }   
        }.start();

    } else {
        // man
    }   
}   
于 2013-03-25T18:35:48.140 に答える