📄 searchform.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 + -