public SetGUI(Client c) {
		client = c;
		setResizable(false); //cannot expand game to keep background image looking spiffy 
		
		/*
		 * Standard setup for contentPane, notice that it is a layered pane
		 * so we are able to have a good-looking background
		 */
		getContentPane().setLayout(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(contentPaneX, contentPaneY, contentPaneWidth, contentPaneHeight);		
		contentPane = new JLayeredPane();
		contentPane.setBorder(new EmptyBorder(border, border, border, border));
		setContentPane(contentPane);
		contentPane.setLayout(null);

		/*
		 * Background inspired from LoZ Majora's Mask, covers entire content pane, but displayed on a layer
		 * underneath everything else
		 */
		lblBackground = new JLabel();
		lblBackground.setBounds(contentPaneX, contentPaneY, contentPaneWidth, contentPaneHeight);
		contentPane.add(lblBackground);
		contentPane.setLayer(lblBackground, -1); //-1 means it is the most "background" layer
		lblBackground.setIcon(new ImageIcon(SetGUI.class.getResource("/lab5/client/mediumcards/backgroundrescaled.png")));

		/*
		 * Fancy title text
		 */
		lblTitle = new JLabel("Set");
		lblTitle.setForeground(Color.LIGHT_GRAY);
		lblTitle.setFont(new Font("Mistral", Font.PLAIN, 60));
		lblTitle.setHorizontalAlignment(SwingConstants.CENTER);
		lblTitle.setBounds(titleX, titleY, titleWidth, titleHeight);
		contentPane.add(lblTitle);
		contentPane.setLayer(lblTitle, 0); //For all future cases, and including this one,
		//layer 0 is the standard above the background image

		/*
		 * Pane which allows selection of number of players
		 */
		startGamePane = new JScrollPane();
		startGamePane.setBounds(startNumPlayerX, startNumPlayerY, startNumPlayerWidth,
				startNumPlayerHeight);
		contentPane.add(startGamePane);
		contentPane.setLayer(startGamePane, 0);
		//model allows for modification of list information
		listModelStartPlayers = new DefaultListModel();
		listStartPlayers = new JList(listModelStartPlayers);
		listStartPlayers.setBorder(new TitledBorder(null, "Number of Players",
				TitledBorder.LEADING, TitledBorder.TOP, null, null));
		startGamePane.setViewportView(listStartPlayers);
		//Fills list with 1-4 players
		for (byte i = 1; i <= 4; i++) {
			listModelStartPlayers.addElement(i);
		}

		/*
		 * Input text field for choosing player's name
		 */
		nameField = new JTextField();
		nameField.setToolTipText("Type your name here");
		nameField.setText("Type your name in this box");
		nameField.setBounds(nameFieldX, nameFieldY, nameFieldWidth, nameFieldHeight);
		contentPane.add(nameField);
		contentPane.setLayer(nameField, 0);
		nameField.setColumns(border*2);

		/*
		 * Standard button, lets player start after number of players
		 * is chosen
		 */
		start = new JButton();
		start.setToolTipText("Select number of players and enter your name and press to start.");
		start.setText("Start Game");
		start.setBounds(startButtonX, startButtonY, startButtonWidth,
				startButtonHeight);
		contentPane.add(start);
		contentPane.setLayer(start, 0);

		/*
		 * Upon press, checks to make sure a number of players are chosen, and that
		 * the user has typed in a valid name. Will attempt to connect to server, using client's hello method 
		 */
		start.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				if (listStartPlayers.getSelectedValue() != null) {
					if(nameField.getText()!= "" && !nameField.getText().equals("Type your name in this box") && !nameField.getText().equals("Need to type your name first")){
						if(client.connect()){
							start.setText("Waiting For Players");
							start.setEnabled(false);
							String nameToSend = nameField.getText().replaceAll("%", "");//makes sure the name doesn't have a % in it
							if(nameToSend.length()>36)nameToSend=nameToSend.substring(0, 36);//makes sure the name isn't too long
							client.sayHello(nameToSend, ((Byte) (listStartPlayers.getSelectedValue())).byteValue());
						}
					}else{
						nameField.setText("Need to type your name first");
					}
				} else {
					nameField.setText("Need to select the number of players");
				}

			}

		});

		/*
		 * Set Button that allows player to pick cards 
		 * after pressing in order to attempt a set
		 */
		setButton = new JButton("Call Set");
		setButton.setToolTipText("Press this button before selecting cards to send them as a set. If another player is selecting cards, you have to wait until they finish");
		setButton.setBounds(setButtonX, setButtonY, setButtonWidth, setButtonHeight);
		contentPane.add(setButton);
		contentPane.setLayer(setButton, 0);
		
		//Button changes state of setPressed to true, allowing players to attempt
		//a set
		setButton.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				if (!setPressed) {
					client.playerCallSet(); //sends message to attempt to call set
					setPressed = true;
				}
			}
		});

		/*
		 * Counter section for number of cards left in deck.
		 */
		numberOfCardsInDeck = new JTextArea();
		numberOfCardsInDeck.setToolTipText("Number of cards left in deck.");
		numberOfCardsInDeck.setEditable(false);
		numberOfCardsInDeck.setBounds(cardsNumAreaX, cardsNumAreaY, cardsNumAreaWidth, cardsNumAreaHeight);
		contentPane.add(numberOfCardsInDeck);
		contentPane.setLayer(numberOfCardsInDeck, 0);

		/*
		 * Label to indicate what the counter is keeping track of
		 */
		lblNumberOfCards = new JLabel("Cards left in deck");
		lblNumberOfCards.setForeground(Color.LIGHT_GRAY);
		lblNumberOfCards.setBounds(numCardsLblX, numCardsLblY, numCardsLblWidth, numCardsLblHeight);
		lblNumberOfCards.setHorizontalAlignment(SwingConstants.RIGHT);
		contentPane.add(lblNumberOfCards);
		contentPane.setLayer(numberOfCardsInDeck, 0);

		/*
		 * Pane which keeps track of players in the game
		 */
		playersPane = new JScrollPane();
		playersPane.setBounds(playerPaneX, playerPaneY, playerPaneWidth, playerPaneHeight);
		contentPane.add(playersPane);
		contentPane.setLayer(playersPane, 0);
		//list model allows for easy modification
		listModelPlayers = new DefaultListModel();
		listPlayers = new JList(listModelPlayers);
		listPlayers.setBorder(new TitledBorder(null, "Players", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		playersPane.setViewportView(listPlayers);
		/*
		 * Pane which keeps track of score
		 */
		playersPointsPane = new JScrollPane();
		playersPointsPane.setBounds(pointPaneX, pointPaneY, pointPaneWidth, pointPaneHeight);
		contentPane.add(playersPointsPane);
		contentPane.setLayer(playersPointsPane, 0);
		//list model allows for easy change
		listModelScores = new DefaultListModel();
		listPlayersPoints = new JList(listModelScores);
		playersPointsPane.setViewportView(listPlayersPoints);
		listPlayersPoints.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Scores", TitledBorder.LEADING, TitledBorder.TOP, null, null));

		/*
		 * Button which can be pressed to ask for a column addition, or call to end game
		 */
		addCardsButton = new JButton("Add Cards");
		addCardsButton.setToolTipText("Ask for a new column of cards(Needs majority vote). Call if you can't find any sets");
		addCardsButton.setBounds(addCardsButtonX, addCardsButtonY, addCardsButtonWidth, addCardsButtonHeight);
		contentPane.add(addCardsButton);
		contentPane.setLayer(addCardsButton, 0);	
		//Upon press, sends message through client to request for a row addition, or if not enough cards, end the game
		addCardsButton.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				client.askForCards();
				addCardsButton.setEnabled(false);
			}
		});

		//
		//All of the game components are set invisible until the set button is pressed
		//
		setButton.setVisible(false);
		lblNumberOfCards.setVisible(false);
		numberOfCardsInDeck.setVisible(false);
		playersPointsPane.setVisible(false);
		playersPane.setVisible(false);
		addCardsButton.setVisible(false);
		//cards are generated (invisible as well)
		generateCards();
	}