public ServerFinder(JFrame parent) {
		super(parent, I18n.getInstance().getString("sfTitle"));
		setLayout(new BorderLayout());

		table = new JTable();
		table.setCellSelectionEnabled(false);
		table.setColumnSelectionAllowed(false);
		table.setRowSelectionAllowed(true);
		table.setModel(new ServerTableModel(new Vector<ServerEntry>()));
		table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

			@Override
			public void valueChanged(ListSelectionEvent e) {
				if (e.getFirstIndex() > -1)
					connectBtn.setEnabled(true);
				else
					connectBtn.setEnabled(false);
			}
		});

		this.setModalityType(ModalityType.APPLICATION_MODAL);
		this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

		JScrollPane scrollPane = new JScrollPane(table);
		scrollPane.setPreferredSize(new Dimension(320, 240));

		getContentPane().add(scrollPane, BorderLayout.NORTH);

		JPanel loginPane = new JPanel();
		loginPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 5));
		loginPane.setLayout(new GridLayout(2, 2));
		loginPane.add(new JLabel("Username"));
		userName = new JTextField();
		loginPane.add(userName);
		loginPane.add(new JLabel("Password"));
		password = new JPasswordField();
		loginPane.add(password);
		getContentPane().add(loginPane, BorderLayout.CENTER);

		JPanel buttonPane = new JPanel();
		buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS));
		buttonPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 5));
		refreshBtn = new JButton(I18n.getInstance().getString("refresh"));
		refreshBtn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				connectBtn.setEnabled(false);
				refreshBtn.setEnabled(false);
				table.clearSelection();
				updateEntries();
				refreshBtn.setEnabled(true);
			}
		});
		buttonPane.add(refreshBtn);
		buttonPane.add(Box.createHorizontalGlue());
		connectBtn = new JButton(I18n.getInstance().getString("connect"));
		connectBtn.setEnabled(false);
		connectBtn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				int index = table.getSelectedRow();
				if (index > -1) {
					ServerEntry entry = ((ServerTableModel) table.getModel()).getEntry(index);
					System.out.println(entry);

					String host = entry.getRemoteAddress();
					String sport = entry.getPort();
					String user = userName.getText();
					String pass = String.valueOf(password.getPassword());
					int port = 0;
					try {
						port = Integer.valueOf(sport);
					} catch (NumberFormatException ne) {
						port = 12345;
					}

					if (user.equals("") || pass.equals("")) {
						JOptionPane.showMessageDialog(ServerFinder.this, I18n.getInstance()
								.getString("inputFail"));
						return;
					}

					try {
						Client.getInstance().connect(host, port, user, pass);
					} catch (Exception ee) {
						JOptionPane.showMessageDialog(ServerFinder.this, I18n.getInstance()
								.getString("connectFail"));
						return;
					}
					dispose();
				}
			}
		});
		buttonPane.add(connectBtn);
		buttonPane.add(Box.createRigidArea(new Dimension(10, 0)));
		JButton cancelBtn = new JButton(I18n.getInstance().getString("cancel"));
		cancelBtn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				ServerFinder.this.dispose();
			}
		});
		buttonPane.add(cancelBtn);

		getContentPane().add(buttonPane, BorderLayout.SOUTH);
		this.pack();

		this.setResizable(false);
		this.setAlwaysOnTop(true);
		this.setLocationRelativeTo(this.getParent());

		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				updateEntries();
			}
		});

		this.setVisible(true);
	}