Question

I got it where the exact issue is. Its when i call the method FileTransfer in the Steganography_Controller constructor, the window hangs. When i commented the method call the code worked fine.Here's a working code.

This is my Steganography_Controller class

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());

}*/

}

This is Login Class

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);
}

}

This is 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));
    }
 }
Was it helpful?

Solution

The reason it hangs is because you have the current thread listening to the incoming connections (done in Event Dispatching Thread), thereby blocking. It does not return immediately but waits for connections. The code for listening to connections therefore should be in its own thread:

instead of FileTransfer(); /* <----- Here's....*/

Run it in its own thread:

Thread fileTransferThread = new Thread(new Runnable(){
   public void run(){
        FileTransfer();
   }
});
fileTransferThread.start();
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top