ftp站点未连接时,GUI被冻结



这是我的主类:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.UIManager.LookAndFeelInfo;
import java.io.*;
import java.lang.Process.*;
public class FTP {

  public static void main (String []args)
  {
    Runnable runner = new Runnable(){

      public void run()
      {
        LookAndFeel nimbusLook = new LookAndFeel();
        nimbusLook.NimbusLookAndFeel();
        JFrame frame = new JFrame("BNA FTP Diagnose");
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setSize(540, 420);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocation(150, 150);

        JMenuBar menuBar = new JMenuBar();
        frame.setJMenuBar(menuBar);
        JMenu fileMenu = new JMenu("File");
        menuBar.add(fileMenu);
        final JMenuItem exitMenuItem = new JMenuItem("Exit");
        fileMenu.add(exitMenuItem);

        JMenu helpMenu = new JMenu("Help");
        menuBar.add(new JPanel());
        menuBar.add(helpMenu);
        final JMenuItem aboutMenuItem = new JMenuItem("About");
        helpMenu.add(aboutMenuItem);

        JPanel titlePanel = new JPanel(new BorderLayout());
        frame.add(titlePanel, BorderLayout.NORTH);
        JLabel titleLabel = new JLabel("FTP Diagnose", JLabel.CENTER);
        titleLabel.setFont(new Font(null, Font.BOLD, 14));
        titleLabel.setForeground(Color.BLUE);
        titlePanel.add(titleLabel);
        JPanel gridPanel = new JPanel(new GridLayout(1, 1));
        frame.add(gridPanel);
        JPanel vendorPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        gridPanel.add(vendorPanel);
        final String vendor [] = {"LLesiant" ,"WK-CCH", "Proquest", "Notes", "Research Institute of America", "Thomson", 
          "BNAI PDF Processing", " TM Portfolios to Indexing", "Postscript to PRODLOGIN1", "www.firstdoor.net", "psp.bna.com", "WEST", "LexisNexis", "McArdle Printing Company", 
          "Breaking News Email", "Ex Libris", "Pandora", "Bloomberg Law", "Acquire Media Site 1", "Acquire Media Site 2", "Quicksite", "QA Quicksite"};
        final JComboBox vendorList = new JComboBox(vendor);
        vendorPanel.add(vendorList);
        JPanel diagnoseButtonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        gridPanel.add(diagnoseButtonPanel);
        final JButton diagnoseButton = new JButton("Diagnose");
        diagnoseButtonPanel.add(diagnoseButton);

        JPanel centerPanel = new JPanel(new BorderLayout());
        frame.add(centerPanel, BorderLayout.SOUTH);
        JPanel commandPanel = new JPanel(new GridLayout(1, 0));
        centerPanel.add(commandPanel);

        final JTextArea commandResultArea = new JTextArea(7, 0);
        JScrollPane scroll = new JScrollPane(commandResultArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        commandPanel.add(scroll);
        commandResultArea.setEditable(false);


        ActionListener buttonListener = new ActionListener(){
          public void actionPerformed(ActionEvent ae)
          {
            int selectedIndex = vendorList.getSelectedIndex();
            String llesiant = "ftp.llesiant.com";
            String wkCCH = "FTP1.cch.com";
            String proquest = "ftp.proquest.com";
            String notes = "notes5.bna.com";

            //String lineThree = null;
            CommandClass readCommand = new CommandClass();
            if (selectedIndex == 0)
            {
              commandResultArea.setText(readCommand.getCommand(llesiant)); //these return strings
            }
            else if (selectedIndex == 1)
            {
              commandResultArea.setText(readCommand.getCommand(wkCCH));
            }
            else if (selectedIndex == 2)
            {
              commandResultArea.setText(readCommand.getCommand(proquest));
            }
            else if (selectedIndex == 3)
            {
              commandResultArea.setText(readCommand.getCommand(notes));
            }
          }
        };
        diagnoseButton.addActionListener(buttonListener);
        ActionListener exitListener = new ActionListener (){
          public void actionPerformed(ActionEvent el)
          {
            if (el.getSource()== exitMenuItem)
            {
              JOptionPane.showMessageDialog(null, "FTP Program will exit now!");
              System.exit(0);
            }
          }
        };
        exitMenuItem.addActionListener(exitListener);
        ActionListener aboutListener = new ActionListener()
        {
          public void actionPerformed(ActionEvent al)
          {
            if (al.getSource()== aboutMenuItem)
            {
              JOptionPane.showMessageDialog(null, "This Software was made for Editors to. nDiagnose BNA Bloomberg client FTP site.");
            }
          }
        };
        aboutMenuItem.addActionListener(aboutListener);             
      }
    };
    EventQueue.invokeLater(runner);
  }
}
Here is my Look and feel class: 
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
public class LookAndFeel {

    public void NimbusLookAndFeel()
    {
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception e) {
            // If Nimbus is not available, you can set the GUI to another look and feel.
        }

    }


}

Here is my CommandClass: 
import java.io.IOException;
import java.io.InputStreamReader;
import javax.swing.JOptionPane;

public class CommandClass {

    public String getCommand(String ftpSite){
        String command = "ftp ";
        StringBuffer output = new StringBuffer();
        try{
             Process p = Runtime.getRuntime().exec(command +ftpSite);
            InputStreamReader ir = new InputStreamReader (p.getInputStream());
            int outputChar = 0;
            while((outputChar = ir.read()) != -1){
                output.append((char)outputChar);
            if(!ir.ready()){ // If the next read is not guarenteed, come out of loop.
                break;
            }
                }
              ir.close();
             JOptionPane.showMessageDialog(null, "FTP is connected");
        }catch (IOException e){
            e.printStackTrace();
        }
        return output.toString();
    }

}

我有这个FTP GUI,假设连接到FTP站点并返回状态。如果已连接,则显示连接提示符。

当FTP连接建立时,我得到了JTextArea来显示消息,但是当它没有连接到FTP站点时,例如我的第4个FTP站点是notes5.bna.com,它冻结了程序。还有一个小问题是,如果你有程序FTP到这样的网站"shlfsdklaflkhasdlhhas"。只有当JOptionPane显示ftp连接成功后,才返回ftp站点未找到。我不确定它有什么问题。

notes5.bna.com冻结的原因是站点没有响应FTP的连接请求。由于您只是使用Runtime#exec来建立连接,因此这将无限期地阻止响应。考虑使用一个3rd方FTP客户端,比如Apache FTPClient,它允许你指定一个连接超时

一个相关的问题是,一些网站正在请求用户名&访问密码。同样,FTPClient允许您提供登录详细信息。

最后,不要让重量级的非ui任务冻结您的Swing应用程序。Swing有一些机制来处理这些问题,比如SwingWorker对象。

  • 相关Swingworker网络示例

相关内容

  • 没有找到相关文章

最新更新