public JottoGUI() {
        rowNumber = 0;
        currentPuzzle = makeRandomNumber();
        guessTableColumnNames[0] = "guess";
        guessTableColumnNames[1] = "# characters in common";
        guessTableColumnNames[2] = "# characters in correct position";
        model = new JottoModel(new ArrayList<String>());

        newPuzzleButton = new JButton();
        newPuzzleButton.setName("newPuzzleButton");
        newPuzzleButton.setText("New Puzzle");
        newPuzzleNumber = new JTextField(20);
        newPuzzleNumber.setName("newPuzzleNumber");
        puzzleNumber = new JLabel();
        puzzleNumber.setName("puzzleNumber");
        puzzleNumber.setText("Puzzle #" + currentPuzzle.toString());
        guess = new JTextField(20);
        guess.setName("guess");
        guessLabel = new JLabel();
        guessLabel.setText("Type a guess here:");

        tableModel = new MyModel();
        guessTable = new JTable(tableModel);
        guessTable.setName("guessTable");
        tableModel.addColumn("guess");
        tableModel.addColumn("# characters in common");
        tableModel.addColumn("# characters in correct position");

        GroupLayout layout = new GroupLayout(getContentPane());
        getContentPane().setLayout(layout);

        layout.setAutoCreateGaps(true);
        layout.setAutoCreateContainerGaps(true);

        // Create the horizontal group
        layout.setHorizontalGroup(layout
                .createParallelGroup()
                .addComponent(guessTable.getTableHeader())
                .addComponent(guessTable)
                .addGroup(
                        layout.createSequentialGroup()
                                .addGroup(
                                        layout.createParallelGroup()
                                                .addComponent(puzzleNumber)
                                                .addComponent(guessLabel))
                                .addGroup(
                                        layout.createParallelGroup()
                                                .addComponent(guess)
                                                .addGroup(
                                                        layout.createSequentialGroup()
                                                                .addComponent(
                                                                        newPuzzleButton)
                                                                .addComponent(
                                                                        newPuzzleNumber)))));

        // Create the vertical group
        layout.setVerticalGroup(layout
                .createSequentialGroup()
                .addGroup(
                        layout.createParallelGroup().addComponent(puzzleNumber)
                                .addComponent(newPuzzleButton)
                                .addComponent(newPuzzleNumber))
                .addGroup(
                        layout.createParallelGroup().addComponent(guessLabel)
                                .addComponent(guess))
                .addComponent(guessTable.getTableHeader())
                .addComponent(guessTable));
        
        layout.linkSize(SwingConstants.HORIZONTAL, newPuzzleButton);

        // Adding Action Listener to newPuzzleButton
        // - calls newPuzzleReader() 
        newPuzzleButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                handleNewPuzzle();
            }
        });

        // Adding Action Listener to newPuzzleNumber
        // - if the enter button is hit, calls newPuzzleReader()
        newPuzzleNumber.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                handleNewPuzzle();
            }
        });

        // Adding Action Listener to guess TextField
        // - if the enter button is hit, calls makeGuess
        // This should send a guess to the Blocking Queue of the model and
        // create a new row in the table
        // When the response from the Model is received, it should be inputed
        // into the table in the correct row -
        // however the next guess should be entered already if there is one
        guess.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                String clientGuess = guess.getText();
                guess.setText("");
                clientGuess.replaceAll("\\s", "%20");
                addGuessFirst(clientGuess);
                model.addGuess(clientGuess);
                Thread t = new Thread(new Runnable() {
                    public void run(){
                        ArrayList<String> responses = model.handleGuesses(
                                currentPuzzle, new ArrayList<String>());
                        handleResponses(responses);
                    }
                });
                t.start();
            }
        });

        pack();

    }