private void initialize() {
		gameFrame = new JFrame();
		gameFrame.setTitle("Hand and Foot");
		gameFrame.setBounds(0, 0, 800, 500);
		gameFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		gameFrame.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				exit();
			}
		});

		JMenuBar menuBar = new JMenuBar();
		gameFrame.setJMenuBar(menuBar);

		JMenu mnGame = new JMenu("Game");
		menuBar.add(mnGame);

		JMenuItem mntmConnect = new JMenuItem("Connect to IP Game");
		mntmConnect.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				InetAddress address;

				String ip = JOptionPane.showInputDialog(gameFrame, "IP: ",
						"Connect", JOptionPane.QUESTION_MESSAGE);
				try {
					address = InetAddress.getByName(ip);
				} catch (UnknownHostException ex) {
					JOptionPane.showMessageDialog(gameFrame,
							"That IP Address is not valid.");
					return;
				}

				connect(address);
			}
		});

		JMenuItem mntmConnectToLocal = new JMenuItem("Connect to Local Game");
		mntmConnectToLocal.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				new LocalGame(Main.this).setVisible(true);
			}
		});
		mnGame.add(mntmConnectToLocal);
		mnGame.add(mntmConnect);

		JMenuItem mntmOptions = new JMenuItem("Options");
		mntmOptions.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String[] values = new String[4];
				for (int i = 0; i < 4; i++) {
					values[Sorting.values()[i].order] = Sorting.values()[i].str;
				}
				OptionsDialog cs = new OptionsDialog(Main.this, values);
				cs.setVisible(true);
				cs.setLocationRelativeTo(gameFrame);
			}
		});

		JMenuItem mntmHostGame = new JMenuItem("Host Game");
		mntmHostGame.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				new NumPlayers(Main.this).setVisible(true);
			}
		});
		mnGame.add(mntmHostGame);
		mnGame.add(mntmOptions);
		mnGame.add(new JPopupMenu.Separator());

		JMenuItem mntmExit = new JMenuItem("Exit");
		mntmExit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				exit();
			}
		});
		mnGame.add(mntmExit);
		GridBagLayout gridBagLayout = new GridBagLayout();
		gridBagLayout.columnWidths = new int[] { 0, 0, 0 };
		gridBagLayout.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0 };
		gridBagLayout.columnWeights = new double[] { 0.0, 0.0, 0.0 };
		gameFrame.getContentPane().setLayout(gridBagLayout);

		btnDraw7Cards = new JButton("Draw 7 Cards from Discard");
		btnDraw7Cards.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				network.send(PacketCreator.draw7());
				hasDrawn = true;
				setButtons(false);
			}
		});
		GridBagConstraints gbc_btnDrawCards_1 = new GridBagConstraints();
		gbc_btnDrawCards_1.insets = new Insets(5, 0, 5, 0);
		gbc_btnDrawCards_1.anchor = GridBagConstraints.EAST;
		gbc_btnDrawCards_1.fill = GridBagConstraints.VERTICAL;
		gbc_btnDrawCards_1.gridx = 2;
		gbc_btnDrawCards_1.gridy = 0;
		gameFrame.getContentPane().add(btnDraw7Cards, gbc_btnDrawCards_1);
		btnDraw7Cards.setEnabled(false);

		btnDraw2Cards = new JButton("Draw 2 Cards");
		btnDraw2Cards.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				network.send(PacketCreator.draw());
				hasDrawn = true;
				setButtons(false);
			}
		});
		GridBagConstraints gbc_btnDrawCards = new GridBagConstraints();
		gbc_btnDrawCards.insets = new Insets(5, 0, 5, 5);
		gbc_btnDrawCards.anchor = GridBagConstraints.WEST;
		gbc_btnDrawCards.fill = GridBagConstraints.VERTICAL;
		gbc_btnDrawCards.gridx = 1;
		gbc_btnDrawCards.gridy = 0;
		gameFrame.getContentPane().add(btnDraw2Cards, gbc_btnDrawCards);
		btnDraw2Cards.setEnabled(false);

		JButton btnPlayGroup = new JButton("Play Group");
		btnPlayGroup.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (staging != null)
					network.send(PacketCreator.play(staging));
			}
		});
		GridBagConstraints gbc_btnPlayGroup = new GridBagConstraints();
		gbc_btnPlayGroup.fill = GridBagConstraints.HORIZONTAL;
		gbc_btnPlayGroup.weighty = 1.0;
		gbc_btnPlayGroup.anchor = GridBagConstraints.SOUTH;
		gbc_btnPlayGroup.insets = new Insets(0, 5, 5, 5);
		gbc_btnPlayGroup.gridx = 0;
		gbc_btnPlayGroup.gridy = 1;
		gameFrame.getContentPane().add(btnPlayGroup, gbc_btnPlayGroup);

		surface = new Surface(this);
		GridBagConstraints gbc_surface = new GridBagConstraints();
		gbc_surface.gridheight = 3;
		gbc_surface.weightx = 1.0;
		gbc_surface.weighty = 1.0;
		gbc_surface.gridwidth = 2;
		gbc_surface.fill = GridBagConstraints.BOTH;
		gbc_surface.gridx = 1;
		gbc_surface.gridy = 1;
		gameFrame.getContentPane().add(surface, gbc_surface);

		JButton btnRemoveGroup = new JButton("Remove Group");
		btnRemoveGroup.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (staging != null) {
					for (Card c : staging) {
						hand.add(c);
					}
					staging = null;
					redraw();
				}
			}
		});
		GridBagConstraints gbc_btnRemoveGroup = new GridBagConstraints();
		gbc_btnRemoveGroup.weighty = 1.0;
		gbc_btnRemoveGroup.anchor = GridBagConstraints.NORTH;
		gbc_btnRemoveGroup.insets = new Insets(0, 5, 5, 5);
		gbc_btnRemoveGroup.gridx = 0;
		gbc_btnRemoveGroup.gridy = 2;
		gameFrame.getContentPane().add(btnRemoveGroup, gbc_btnRemoveGroup);

		JButton btnSortHand = new JButton("Sort Hand");
		btnSortHand.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// Don't want sort to affect hand indexes while floating a card
				// or waiting on discard.
				// We use absolute index for those calculations
				if (!surface.isFloating() && toDiscard == -1) {
					Collections.sort(hand);
					redraw();
				}
			}
		});
		GridBagConstraints gbc_btnSortHand = new GridBagConstraints();
		gbc_btnSortHand.fill = GridBagConstraints.HORIZONTAL;
		gbc_btnSortHand.insets = new Insets(0, 5, 60, 5);
		gbc_btnSortHand.gridx = 0;
		gbc_btnSortHand.gridy = 3;
		gameFrame.getContentPane().add(btnSortHand, gbc_btnSortHand);
	}