⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 searchform.java

📁 一个仿qq的程序源码 一个用纯java开发的
💻 JAVA
字号:
package qianqian.p2pchat.gui;

import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

import javax.swing.table.AbstractTableModel;

import qianqian.p2pchat.constant.Const;
import qianqian.p2pchat.control.*;
import qianqian.p2pchat.message.UserMessage;

public class SearchForm extends javax.swing.JDialog {
	private static final long serialVersionUID = 1L;

	private static int count = 0;
	private static SearchForm searchForm;
	private javax.swing.JButton btSearch;
	private javax.swing.JButton btAddCancel;
	private javax.swing.JTextField tbUserId;
	private javax.swing.JLabel lbUserId;
	private javax.swing.JLabel lbNickname;
	private javax.swing.JLabel lbTitle;
	private javax.swing.JTextField tbNickname;
	private javax.swing.JProgressBar progressBar;
	private javax.swing.Timer timer;
	private javax.swing.border.MatteBorder border;
	private javax.swing.JTable table;
	private javax.swing.JScrollPane tableScrl;
	private javax.swing.table.DefaultTableCellRenderer renderer;
	private UserModel model;
	private java.awt.Image icon;
	private java.awt.Color backgColor;
	private java.awt.Color borderColor;
	private static final Class<?>[] columnClasses = { String.class, String.class,
		String.class, String.class };
	private static final String[] columnNames = { "账号", "昵称", "性别", "状态" };

	public static synchronized SearchForm getInstance(RoomForm form) {
		if (searchForm == null)
			searchForm = new SearchForm(form);
		return searchForm;
	}

	private SearchForm(RoomForm form) {
		super(form, "查找用户");
		initComponents();
		startProgress();
		addListener();
		setBounds(362, 200, 300, 230);
		setAlwaysOnTop(true);
		setResizable(false);
		setIconImage(icon);
	}

	private void initComponents() {
		btSearch = new javax.swing.JButton("查\0找");
		btAddCancel = new javax.swing.JButton("取\0消");
		tbUserId = new javax.swing.JTextField();
		lbUserId = new javax.swing.JLabel("QianQian账号:");
		tbNickname = new javax.swing.JTextField();
		lbNickname = new javax.swing.JLabel("QianQian昵称:");
		lbTitle = new javax.swing.JLabel(new javax.swing.ImageIcon(
				"icons/title.gif"));
		model = new UserModel();
		table = new javax.swing.JTable(model);
		progressBar = new javax.swing.JProgressBar();
		tableScrl = new javax.swing.JScrollPane();
		renderer = new javax.swing.table.DefaultTableCellRenderer();
		backgColor = new java.awt.Color(235, 245, 255);
		borderColor = new java.awt.Color(115, 185, 255);
		border = new javax.swing.border.MatteBorder(new java.awt.Insets(1, 1,
				1, 1), borderColor);
		icon = new javax.swing.ImageIcon("icons/QianQian.gif").getImage();
		java.awt.Container contentPane = getContentPane();
		contentPane.setLayout(null);
		contentPane.setBackground(backgColor);

		contentPane.add(lbTitle);
		lbTitle.setBorder(border);
		lbTitle.setBounds(-1, -1, 302, 44);

		table.setDefaultRenderer(String.class, renderer);
		table.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
		table.setSelectionBackground(backgColor);
		table.setBorder(border);

		tableScrl.setViewportView(table);
		tableScrl.setAutoscrolls(true);
		tableScrl.setBorder(border);
		contentPane.add(tableScrl);
		tableScrl.setBounds(10, 45, 270, 50);

		contentPane.add(lbUserId);
		lbUserId.setBounds(35, 100, 85, 25);

		contentPane.add(tbUserId);
		tbUserId.setBorder(border);
		tbUserId.setBounds(120, 100, 120, 25);

		contentPane.add(lbNickname);
		lbNickname.setBounds(35, 130, 85, 25);

		contentPane.add(tbNickname);
		tbNickname.setBorder(border);
		tbNickname.setBounds(120, 130, 120, 25);

		contentPane.add(btSearch);
		btSearch.setBorder(border);
		btSearch.setBounds(60, 162, 65, 25);

		contentPane.add(btAddCancel);
		btAddCancel.setBorder(border);
		btAddCancel.setBounds(170, 162, 65, 25);

		contentPane.add(progressBar);
		progressBar.setForeground(borderColor);
		progressBar.setBackground(backgColor);
		progressBar.setBorder(javax.swing.BorderFactory.createEmptyBorder());
		progressBar.setBounds(-2, 192, 302, 3);

		pack();
	}

	private void startProgress() {
		int delay = 50;
		java.awt.event.ActionListener task = new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent ae) {
				if (count <= 100)
					progressBar.setValue(++count);
			}
		};
		timer = new javax.swing.Timer(delay, task);
	}

	private void addListener() {
		setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
		// 查找
		btSearch.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				new Thread(new Runnable() {
					public void run() {
						if (!timer.isRunning()) {
							btSearchPerformed();
						}
					}
				}).start();
			}
		});
		// 取消或添加好友
		btAddCancel.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(final java.awt.event.ActionEvent evt) {
				new Thread(new Runnable() {
					public void run() {
						if (!timer.isRunning()) {
							javax.swing.JButton btn = (javax.swing.JButton) evt
									.getSource();
							btAddCancel(btn);
						}
					}
				}).start();
			}
		});
		// 选择好友
		table.getSelectionModel().addListSelectionListener(
				new javax.swing.event.ListSelectionListener() {
					public void valueChanged(
							javax.swing.event.ListSelectionEvent e) {
						btAddCancel.setText("加为好友");
					}
				});

		java.awt.event.KeyAdapter keyAdapter = new java.awt.event.KeyAdapter() {
			public void keyTyped(java.awt.event.KeyEvent evt) {
				if (evt.getKeyChar() == '\n') {
					new Thread(new Runnable() {
						public void run() {
							if (!timer.isRunning()) {
								btSearchPerformed();
							}
						}
					}).start();
					return;
				}
				if (evt.getSource() instanceof javax.swing.JTextField) {
					javax.swing.JTextField text = (javax.swing.JTextField) evt
							.getSource();
					if (text.getText().length() >= 16)
						text.setText(text.getText().substring(0, 15));
				}
			}
		};
		tbNickname.addKeyListener(keyAdapter);
		tbUserId.addKeyListener(keyAdapter);
	}

	private void btSearchPerformed() {
		timer.start();
		String id = tbUserId.getText();
		String nick = tbNickname.getText();

		if (id.isEmpty() && nick.isEmpty()) {
			resetProgress();
			javax.swing.JOptionPane.showMessageDialog(this, "请输入要查找的账号或昵称!",
					"提示", javax.swing.JOptionPane.INFORMATION_MESSAGE);
			return;
		}

		if (!id.matches("^[0-9]*$")) {
			resetProgress();
			javax.swing.JOptionPane.showMessageDialog(this, "账号只能为数字!", "提示",
					javax.swing.JOptionPane.INFORMATION_MESSAGE);
			return;
		}
		reset();
		UserMessage msg = new UserMessage(Const.CODE_SEARCH_FRIEND, new Peer(
				id, nick));
		Controller.getInstance().getUdpDispatcher().dispatchToServer(msg,
				Const.UdpIp);
		try {
			synchronized (Const.waitForSearchAck) {
				Const.waitForSearchAck.wait(2 * Const.WaitTimeOut);
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		resetProgress();
		javax.swing.JOptionPane.showMessageDialog(this, "查找完毕,共找到["
				+ model.getRowCount() + "]个匹配账号!", "提示",
				javax.swing.JOptionPane.INFORMATION_MESSAGE);
	}

	private void btAddCancel(javax.swing.JButton btn) {
		if (btn.getText().equals("取\0消")) {
			dispose();
		} else {
			Peer frnd = model.getPeer(table.getSelectedRow());
			Peer me = Controller.getInstance().getMe();
			String id = frnd.getUserId();
			if (id.equals(me.getUserId())) {
				javax.swing.JOptionPane.showMessageDialog(this, "不能添加自己为好友!",
						"提示", javax.swing.JOptionPane.INFORMATION_MESSAGE);
				return;
			}
			java.util.Iterator<Peer> iter = me.getFriends().iterator();
			Peer peer = null;
			while (iter.hasNext()) {
				peer = iter.next();
				if (peer.getUserId().equals(id)) {
					javax.swing.JOptionPane.showMessageDialog(this, "已经添加该好友!",
							"提示", javax.swing.JOptionPane.INFORMATION_MESSAGE);
					return;
				}
			}
			UserMessage msg = new UserMessage(Const.CODE_ADD_FRIEND, me, id);
			Controller.getInstance().getUdpDispatcher().dispatchToServer(msg,
					Const.UdpIp);
		}
	}

	private void reset() {
		model.clearPeer(model.getRowCount());
		table.updateUI();
		tbNickname.setText("");
		tbUserId.setText("");
		btAddCancel.setText("取\0消");
	}

	private void resetProgress() {
		count = 0;
		progressBar.setValue(0);
		timer.stop();
	}

	public void setVisible(boolean isVisible) {
		if (isVisible) {
			super.setVisible(true);
			tbUserId.requestFocusInWindow();
		} else {
			dispose();
		}
	}

	public void dispose() {
		searchForm = null;
		super.dispose();
	}

	public void addResult(java.util.LinkedList<Peer> result) {
		model.clearPeer(model.getRowCount());
		java.util.Iterator<Peer> iter = result.iterator();
		while (iter.hasNext()) {
			model.addPeer(iter.next());
		}
	}

	public void setSearchText(String text) {
		for (int i = 0; i < text.length(); i++) {
			if (!Character.isDigit(text.charAt(i))) {
				tbNickname.setText(text);
				return;
			}
		}
		tbUserId.setText(text);
	}
	
	private class UserModel extends AbstractTableModel implements Observer {
		static final long serialVersionUID = 1;

		private ArrayList<Peer> frndList = new ArrayList<Peer>();

		public void addPeer(Peer peer) {
			frndList.add(peer);
			fireTableRowsInserted(getRowCount() - 1, getRowCount() - 1);
		}

		public Peer getPeer(int row) {
			return (Peer) frndList.get(row);
		}

		public void clearPeer(int lRow) {
			frndList.removeAll(frndList);
			if(lRow > 0) {
				lRow -= 1;
			}
			fireTableRowsDeleted(0, lRow);
		}

		public int getColumnCount() {
			return columnNames.length;
		}

		public String getColumnName(int column) {
			return columnNames[column];
		}

		public Class<?> getColumnClass(int column) {
			return columnClasses[column];
		}

		public int getRowCount() {
			return frndList.size();
		}

		public Object getValueAt(int row, int column) {
			Peer peer = (Peer) frndList.get(row);
			switch (column) {
			case 0:
				return peer.getUserId();
			case 1:
				return peer.getName();
			case 2:
				return peer.getGender();
			case 3:
				return (peer.getStatus() == Const.STATUS_AUTH ? "在\0线" : "离\0线");
			}
			return "";
		}

		public void update(Observable ob1, Object ob2) {
			int indexFile = frndList.indexOf(ob1);
			fireTableRowsUpdated(indexFile, indexFile);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -