2014-03-12 45 views
0

我明白了問題所在。當我在Steganography_Controller構造函數中調用FileTransfer方法時,窗口會掛起。當我評論該方法調用的代碼工作正常。這裏是一個工作代碼。如何打開按鈕上的框架點擊

這是我Steganography_Controller類

public class Steganography_Controller { 
// Program Variables 
private Steganography_View view; 

// Panel Displays 
private JPanel decode_panel; 
private JPanel encode_panel; 

// Panel Variables 
private JTextArea input; 
private JButton encodeButton, decodeButton; 
private JLabel image_input; 

// Menu Variables 
private JMenuItem encode; 
private JMenuItem decode; 
private JMenuItem sendfile; 
private JMenuItem calculatepsnr; 
private JMenuItem exit; 

// action event classes 
private Encode enc; 
private Decode dec; 
/*private SendFile send; 
private CalculatePSNR psnr;*/ 
private EncodeButton encButton; 
private DecodeButton decButton; 

// decode variable 
private String stat_path = ""; 
private String stat_name = ""; 

// encode variable 
private String stegan = ""; 
private String path = ""; 

/* 
* Constructor to initialize view, model and environment variables 
* 
* @param aView A GUI class, to be saved as view 
* 
* @param aModel A model class, to be saved as model 
*/ 


public Steganography_Controller(Steganography_View aView) { 

    // program variables 
    view = aView; 
    //model = aModel; 

    // assign View Variables 
    // 2 views 
    encode_panel = view.getTextPanel(); 
    decode_panel = view.getImagePanel(); 

    // 2 data options 
    input = view.getText(); 
    image_input = view.getImageInput(); 

    // 2 buttons 
    encodeButton = view.getEButton(); 
    decodeButton = view.getDButton(); 

    // menu 
    encode = view.getEncode(); 
    decode = view.getDecode(); 
    sendfile = view.getSendFile(); 
    calculatepsnr = view.getPSNR(); 
    exit = view.getExit(); 

    // assign action events 
    enc = new Encode(); 
    encode.addActionListener(enc); 
    dec = new Decode(); 
    decode.addActionListener(dec); 
    /*send = new SendFile(); 
    sendfile.addActionListener(send); 
    psnr = new CalculatePSNR(); 
    calculatepsnr.addActionListener(psnr);*/ 
    exit.addActionListener(new Exit()); 
    encButton = new EncodeButton(); 
    encodeButton.addActionListener(encButton); 
    decButton = new DecodeButton(); 
    decodeButton.addActionListener(decButton); 

    // encode view as default 
    encode_view(); 

    FileTransfer(); /* <----- Here's what hangs the code.Maybe because i am using socket connection but would like to know the exact problem and solutions if any.*/ 
} 


/* 
* Updates the single panel to display the Encode View. 
*/ 
private void encode_view() { 
    update(); 
    view.setContentPane(encode_panel); 
    view.setVisible(true); 
} 


/* 
* Updates the single panel to display the Decode View. 
*/ 
private void decode_view() { 
    update(); 
    view.setContentPane(decode_panel); 
    view.setVisible(true); 
} 


/* 
* Encode Class - handles the Encode menu item 
*/ 
private class Encode implements ActionListener { 
    /* 
    * handles the click event 
    * 
    * @param e The ActionEvent Object 
    */ 
    public void actionPerformed(ActionEvent e) { 
     encode_view(); // show the encode view 
    } 
} 


/* 
* Decode Class - handles the Decode menu item 
*/ 
private class Decode implements ActionListener { 
    /* 
    * handles the click event 
    * 
    * @param e The ActionEvent Object 
    */ 
    public void actionPerformed(ActionEvent e) { 
     decode_view(); // show the decode view 

     // start path of displayed File Chooser 


    } 
} 


/* 
* Exit Class - handles the Exit menu item 
*/ 
private class Exit implements ActionListener { 
    /* 
    * handles the click event 
    * 
    * @param e The ActionEvent Object 
    */ 
    public void actionPerformed(ActionEvent e) { 
     System.exit(0); // exit the program 
    } 
} 


/* 
* Encode Button Class - handles the Encode Button item 
*/ 
private class EncodeButton implements ActionListener { 
    /* 
    * handles the click event 
    * 
    * @param e The ActionEvent Object 
    */ 
    public void actionPerformed(ActionEvent e) { 


    } 

} 


/* 
* Decode Button Class - handles the Decode Button item 
*/ 
private class DecodeButton implements ActionListener { 
    /* 
    * handles the click event 
    * 
    * @param e The ActionEvent Object 
    */ 
    public void actionPerformed(ActionEvent e) { 


    } 
} 

/* 
* Listens to incoming socket connections and receives file 
*/ 
public void FileTransfer() { 

    try { 
     System.out.println("Server running..."); 

     /* Listen on port 1111 */ 

     ServerSocket server = new ServerSocket(1111); 

     /* Accept the sk */ 

     while (true) { 

      Socket sk = server.accept(); 
      System.out.println("Server accepted client"); 

      InputStream input = sk.getInputStream(); 

      BufferedReader inBuf = new BufferedReader(
        new InputStreamReader(sk.getInputStream())); 
      BufferedWriter outBuf = new BufferedWriter(
        new OutputStreamWriter(sk.getOutputStream())); 

      /* Read the filename */ 

      String filename = inBuf.readLine(); 

      if (!filename.equals("")) { 
       /* Reply back to client with READY status */ 
       outBuf.write("READY\n"); 
       outBuf.flush(); 
      } 
      // System.out.println("\nfilename:"+filename); 
      /* Create a new file in the tmp directory using the filename */ 
      String workingDir = System.getProperty("user.dir"); 
      // System.out.println("Working Dir:"+workingDir); 
      String path = workingDir + "\\images\\" + filename; 
      System.out.println("serverpath:" + path); 


      int filesize = 2022386; 
      int bytesRead; 
      int currentTot = 0; 

      byte[] bytearray = new byte[filesize]; 
      FileOutputStream fos = new FileOutputStream(new File(path)); 
      BufferedOutputStream bos = new BufferedOutputStream(fos); 
      bytesRead = input.read(bytearray, 0, bytearray.length); 
      currentTot = bytesRead; 

      do { 
       bytesRead = input.read(bytearray, currentTot, 
         (bytearray.length - currentTot)); 
       if (bytesRead >= 0) 
        currentTot += bytesRead; 
      } while (bytesRead > -1); 

      bos.write(bytearray, 0, currentTot); 

      // System.out.println("BYteRECEive:"+bytesReceived); 
      input.close(); 
      fos.close(); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public void update() { 
    input.setText(""); // clear textarea 
    image_input.setIcon(null); // clear image 
    stat_path = ""; // clear path 
    stat_name = ""; // clear name 
} 

/* 
* Main Method for testing 
*/ 
/*public static void main(String args[]) { 
    new Steganography_Controller(new Steganography_View("Steganography"), 
      new Steganography()); 

}*/ 

} 

這是登錄類

public class Login extends JDialog { 
private JTextField tfUsername; 
private JPasswordField tfPassword; 
private JLabel lbUsername; 
private JLabel lbPassword; 
private JButton btnLogin; 
private JButton btnCancel; 
private JButton btnRegister; 
private boolean succeeded; 
// Steganography_Controller controller; 
final static JFrame frame = new JFrame("JDialog Demo"); 

public Login(Frame parent) { 
    super(parent, "Login", true); 

    JDialog dialog = new JDialog(); 

    JPanel panel = new JPanel(new GridBagLayout()); 
    GridBagConstraints cs = new GridBagConstraints(); 

    cs.fill = GridBagConstraints.HORIZONTAL; 

    lbUsername = new JLabel("Username: "); 
    cs.gridx = 0; 
    cs.gridy = 0; 
    cs.gridwidth = 1; 
    panel.add(lbUsername, cs); 

    tfUsername = new JTextField(20); 
    cs.gridx = 1; 
    cs.gridy = 0; 
    cs.gridwidth = 2; 
    panel.add(tfUsername, cs); 

    lbPassword = new JLabel("Password: "); 
    cs.gridx = 0; 
    cs.gridy = 1; 
    cs.gridwidth = 1; 
    panel.add(lbPassword, cs); 

    tfPassword = new JPasswordField(20); 
    cs.gridx = 1; 
    cs.gridy = 1; 
    cs.gridwidth = 2; 
    panel.add(tfPassword, cs); 
    panel.setBorder(new LineBorder(Color.GRAY)); 

    btnLogin = new JButton("Login"); 
    btnLogin.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 


        JOptionPane.showMessageDialog(Login.this, 
          "Hi ! You have successfully logged in.", 
          "Login", JOptionPane.INFORMATION_MESSAGE); 


        dispose(); 

        //Here i need to open my new frame 


        new Steganography_Controller(new 
        Steganography_View("Steganography") 
        ); 


     } 
    }); 



    JPanel bp = new JPanel(); 
    bp.add(btnLogin); 


    getContentPane().add(panel, BorderLayout.CENTER); 
    getContentPane().add(bp, BorderLayout.PAGE_END); 

    pack(); 
    setResizable(false); 
    setLocationRelativeTo(parent); 

    dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 

    // setDefaultCloseOperation(JDialog.EXIT_ON_CLOSE); 
} 

public String getUsername() { 
    return tfUsername.getText().trim(); 
} 

public String getPassword() { 
    return new String(tfPassword.getPassword()); 
} 

public boolean isSucceeded() { 
    return succeeded; 
} 

public static void main(String args[]) { 

    Login l = new Login(frame); 
    l.setVisible(true); 
} 

} 

這是Steganography_View

public class Steganography_View extends JFrame 
{ 
//size variables for window 
private static int WIDTH = 500; 
private static int HEIGHT = 400; 

//elements for JPanel 
private JTextArea input; 
//private JScrollBar scroll,scroll2; 
private JButton  encodeButton,decodeButton; 
private JLabel  image_input; 

//elements for Menu 
private JMenu  file; 
private JMenuItem encode; 
private JMenuItem decode; 
private JMenuItem sendfile; 
private JMenuItem calculatepsnr; 
private JMenuItem exit; 


/* 
*Constructor for Steganography_View class 
*@param name Used to set the title on the JFrame 
*/ 
public Steganography_View(String name) 
{ 
    //set the title of the JFrame 
    super(name); 



    //Menubar 
    JMenuBar menu = new JMenuBar(); 

    file = new JMenu("File"); file.setMnemonic('F'); 
    encode = new JMenuItem("Encode"); encode.setMnemonic('E'); file.add(encode); 
    decode = new JMenuItem("Decode"); decode.setMnemonic('D'); file.add(decode); 
    sendfile = new JMenuItem("Send File"); sendfile.setMnemonic('S'); file.add(sendfile); 
    calculatepsnr = new JMenuItem("Calculate PSNR"); calculatepsnr.setMnemonic('P'); file.add(calculatepsnr); 
    file.addSeparator(); 
    exit = new JMenuItem("Exit"); exit.setMnemonic('x'); file.add(exit); 

    menu.add(file); 
    setJMenuBar(menu); 

    // display rules 
    setResizable(true);      //allow window to be resized: true?false 
    setBackground(Color.lightGray);   //background color of window: Color(int,int,int) or Color.name 
setLocation(100,100);     //location on the screen to display window 
    setDefaultCloseOperation(EXIT_ON_CLOSE);//what to do on close operation: exit, do_nothing, etc 
    setSize(WIDTH,HEIGHT);     //set the size of the window 
    setVisible(true);      //show the window: true?false 
System.out.println("inside steganography_view"); 

} 

/* 
*@return The menu item 'Encode' 
*/ 
public JMenuItem getEncode()  { return encode;   } 
/* 
*@return The menu item 'Send File' 
*/ 
public JMenuItem getSendFile()  { return sendfile;   } 

/* 
*@return The menu item 'Decode' 
*/ 
public JMenuItem getDecode()  { return decode;   } 

/* 
*@return The menu item 'Calculate PSNR' 
*/ 
public JMenuItem getPSNR()  { return calculatepsnr;   } 
/* 
*@return The menu item 'Exit' 
*/ 
public JMenuItem getExit()  { return exit;    } 
/* 
*@return The TextArea containing the text to encode 
*/ 
public JTextArea getText()  { return input;    } 
/* 
*@return The JLabel containing the image to decode text from 
*/ 
public JLabel  getImageInput() { return image_input;  } 
/* 
*@return The JPanel displaying the Encode View 
*/ 
public JPanel  getTextPanel() { return new Text_Panel(); } 
/* 
*@return The JPanel displaying the Decode View 
*/ 
public JPanel  getImagePanel() { return new Image_Panel(); } 
/* 
*@return The Encode button 
*/ 
public JButton  getEButton() { return encodeButton;  } 
/* 
*@return The Decode button 
*/ 
public JButton  getDButton() { return decodeButton;  } 

private class Text_Panel extends JPanel 
{ 
    /* 
    *Constructor to enter text to be encoded 
    */ 
    public Text_Panel() 
    { 
     //setup GridBagLayout 
     GridBagLayout layout = new GridBagLayout(); 
     GridBagConstraints layoutConstraints = new GridBagConstraints(); 
     setLayout(layout); 

     input = new JTextArea(); 
     layoutConstraints.gridx  = 0; layoutConstraints.gridy = 0; 
     layoutConstraints.gridwidth = 1; layoutConstraints.gridheight = 1; 
     layoutConstraints.fill  = GridBagConstraints.BOTH; 
     layoutConstraints.insets = new Insets(0,0,0,0); 
     layoutConstraints.anchor = GridBagConstraints.CENTER; 
     layoutConstraints.weightx = 1.0; layoutConstraints.weighty = 50.0; 
     JScrollPane scroll = new JScrollPane(input,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
     JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     layout.setConstraints(scroll,layoutConstraints); 
     scroll.setBorder(BorderFactory.createLineBorder(Color.BLACK,1)); 
     add(scroll); 

     encodeButton = new JButton("Encode Now"); 
     layoutConstraints.gridx  = 0; layoutConstraints.gridy = 1; 
     layoutConstraints.gridwidth = 1; layoutConstraints.gridheight = 1; 
     layoutConstraints.fill  = GridBagConstraints.BOTH; 
     layoutConstraints.insets = new Insets(0,-5,-5,-5); 
     layoutConstraints.anchor = GridBagConstraints.CENTER; 
     layoutConstraints.weightx = 1.0; layoutConstraints.weighty = 1.0; 
     layout.setConstraints(encodeButton,layoutConstraints); 
     add(encodeButton); 

     //set basic display 
     setBackground(Color.lightGray); 
     setBorder(BorderFactory.createLineBorder(Color.BLACK,1)); 
    } 
} 

/* 
*Class Image_Panel 
*/ 
private class Image_Panel extends JPanel 
{ 
    /* 
    *Constructor for displaying an image to be decoded 
    */ 
    public Image_Panel() 
    { 
     //setup GridBagLayout 
     GridBagLayout layout = new GridBagLayout(); 
     GridBagConstraints layoutConstraints = new GridBagConstraints(); 
     setLayout(layout); 

     image_input = new JLabel(); 
     layoutConstraints.gridx  = 0; layoutConstraints.gridy = 0; 
     layoutConstraints.gridwidth = 1; layoutConstraints.gridheight = 1; 
     layoutConstraints.fill  = GridBagConstraints.BOTH; 
     layoutConstraints.insets = new Insets(0,0,0,0); 
     layoutConstraints.anchor = GridBagConstraints.CENTER; 
     layoutConstraints.weightx = 1.0; layoutConstraints.weighty = 50.0; 
     JScrollPane scroll2 = new JScrollPane(image_input,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
     JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     layout.setConstraints(scroll2,layoutConstraints); 
     scroll2.setBorder(BorderFactory.createLineBorder(Color.BLACK,1)); 
     image_input.setHorizontalAlignment(JLabel.CENTER); 
     add(scroll2); 

     decodeButton = new JButton("Decode Now"); 
     layoutConstraints.gridx  = 0; layoutConstraints.gridy = 1; 
     layoutConstraints.gridwidth = 1; layoutConstraints.gridheight = 1; 
     layoutConstraints.fill  = GridBagConstraints.BOTH; 
     layoutConstraints.insets = new Insets(0,-5,-5,-5); 
     layoutConstraints.anchor = GridBagConstraints.CENTER; 
     layoutConstraints.weightx = 1.0; layoutConstraints.weighty = 1.0; 
     layout.setConstraints(decodeButton,layoutConstraints); 
     add(decodeButton); 

     //set basic display 
     setBackground(Color.lightGray); 
     setBorder(BorderFactory.createLineBorder(Color.BLACK,1)); 
    } 
} 
+0

是什麼'encode_view'和'FileTransfer'嗎? – MadProgrammer

+0

encode_view將我的編碼面板可見,因爲要顯示的起始畫面.. 這是什麼做的.. 私人無效encode_view(){ \t \t更新(); \t \t view.setContentPane(encode_panel); \t \t view.setVisible(true); \t} 和FileTransfer包含代碼發送圖像文件到另一臺計算機的IP地址的幫助。 –

+0

創建一個更簡單,完整的可行示例,可以在本地運行和測試。 – 2014-03-12 07:09:05

回答

2

它掛起的原因是因爲你當前線程聽傳入的連接(在Event Dispatching Thread中完成),從而阻止NG。它不會立即返回,而是等待連接。因此,對於聽連接的代碼應該是在自己的線程:

,而不是FileTransfer(); /* <----- Here's....*/

運行在其自己的線程:

Thread fileTransferThread = new Thread(new Runnable(){ 
    public void run(){ 
     FileTransfer(); 
    } 
}); 
fileTransferThread.start(); 
+0

我剛剛做的是 - 我使FileTransfer方法爲靜態,並在Login類的主要方法中調用它。這使我的代碼正常工作。你能幫我解釋一下它是如何工作的嗎? –

+0

它工作,因爲現在你的'FileTransfer'正在執行不在事件處理代碼。在你嘗試執行它之前,由於事件(按鈕單擊)。 – 2014-03-12 08:30:08

+0

哦yess ..和thanx爲你提供幫助.. :)嗯,我自己找到了解決方案..但是你的答案也可以工作..並指出真正的問題.. thanx再次..無論如何接受你的答案,因爲有幫助.. :) –