jcontactitemfield.java
来自「开源项目openfire的完整源程序」· Java 代码 · 共 299 行
JAVA
299 行
/** * $Revision$ * $Date$ * * Copyright (C) 1999-2005 Jive Software. All rights reserved. * This software is the proprietary information of Jive Software. Use is subject to license terms. */package org.jivesoftware.spark.component;import org.jivesoftware.resource.SparkRes;import org.jivesoftware.spark.ui.ContactItem;import org.jivesoftware.spark.util.ModelUtil;import javax.swing.DefaultListModel;import javax.swing.JLabel;import javax.swing.JList;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextField;import javax.swing.JWindow;import javax.swing.ListCellRenderer;import java.awt.BorderLayout;import java.awt.Component;import java.awt.Point;import java.awt.event.FocusEvent;import java.awt.event.FocusListener;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.util.ArrayList;import java.util.List;/** * Implementation of a popup field from a TextField. * * @author Derek DeMoro */public class JContactItemField extends JPanel { private JTextField textField = new JTextField(); private DefaultListModel model = new DefaultListModel(); private JList list; private JWindow popup; private List<ContactItem> items; public JContactItemField(List items) { setLayout(new BorderLayout()); list = new JList(model) { public String getToolTipText(MouseEvent e) { int row = locationToIndex(e.getPoint()); final ContactItem item = (ContactItem)getModel().getElementAt(row); if (item != null) { return item.getJID(); } return null; } }; this.items = items; add(textField, BorderLayout.CENTER); textField.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent keyEvent) { char ch = keyEvent.getKeyChar(); if (validateChar(ch)) { showPopupMenu(); } if (keyEvent.getKeyCode() == KeyEvent.VK_ENTER) { int index = list.getSelectedIndex(); if (index >= 0) { ContactItem selection = (ContactItem)list.getSelectedValue(); textField.setText(selection.getNickname()); popup.setVisible(false); } } if (keyEvent.getKeyCode() == KeyEvent.VK_ESCAPE) { popup.setVisible(false); } dispatchEvent(keyEvent); } public void keyPressed(KeyEvent e) { if (isArrowKey(e)) { list.dispatchEvent(e); } } }); textField.addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { } public void focusLost(FocusEvent e) { textField.requestFocusInWindow(); } }); popup = new JWindow(); popup.getContentPane().add(new JScrollPane(list)); popup.setAlwaysOnTop(true); list.setCellRenderer(new PopupRenderer()); list.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { int index = list.getSelectedIndex(); if (index >= 0) { ContactItem selection = (ContactItem)list.getSelectedValue(); textField.setText(selection.getNickname()); popup.setVisible(false); } } } }); } public void dispose() { popup.dispose(); } public void setItems(List list) { this.items = items; } public JList getList() { return list; } private void showPopupMenu() { model.removeAllElements(); String typedItem = textField.getText(); final List<ContactItem> validItems = new ArrayList<ContactItem>(); for (ContactItem contactItem : items) { String nickname = contactItem.getNickname().toLowerCase(); if (nickname.startsWith(typedItem.toLowerCase())) { validItems.add(contactItem); } } if (validItems.size() > 0) { for (final ContactItem label : validItems) { model.addElement(label); } } if (validItems.size() != 0 && !popup.isVisible()) { popup.pack(); popup.setSize(textField.getWidth(), 200); Point pt = textField.getLocationOnScreen(); pt.translate(0, textField.getHeight()); popup.setLocation(pt); popup.toFront(); popup.setVisible(true); } // set initial selection if (validItems.size() > 0) { list.setSelectedIndex(0); } } /** * Validate the given text - to pass it must contain letters, digits, '@', '-', '_', '.', ',' * or a space character. * * @param text the text to check * @return true if the given text is valid, false otherwise. */ public boolean validateChars(String text) { if (!ModelUtil.hasLength(text)) { return false; } for (int i = 0; i < text.length(); i++) { char ch = text.charAt(i); if (!Character.isLetterOrDigit(ch) && ch != '@' && ch != '-' && ch != '_' && ch != '.' && ch != ',' && ch != ' ') { return false; } } return true; } /** * Validate the given text - to pass it must contain letters, digits, '@', '-', '_', '.', ',' * or a space character. * * @param ch the character * @return true if the given text is valid, false otherwise. */ public boolean validateChar(char ch) { if (!Character.isLetterOrDigit(ch) && ch != '@' && ch != '-' && ch != '_' && ch != '.' && ch != ',' && ch != ' ' && ch != KeyEvent.VK_BACK_SPACE && ch != KeyEvent.CTRL_DOWN_MASK && ch != KeyEvent.CTRL_MASK) { return false; } return true; } public boolean isArrowKey(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_DOWN) { return true; } return false; } public String getText() { return textField.getText(); } public ContactItem getSelectedContactItem() { ContactItem selection = (ContactItem)list.getSelectedValue(); return selection; } public void setText(String text) { textField.setText(text); } public void focus() { textField.requestFocus(); } public JTextField getTextField() { return textField; } public JWindow getPopup() { return popup; } class PopupRenderer extends JLabel implements ListCellRenderer { /** * Construct Default JLabelIconRenderer. */ public PopupRenderer() { setOpaque(true); this.setHorizontalTextPosition(JLabel.RIGHT); this.setHorizontalAlignment(JLabel.LEFT); } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (isSelected) { setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground()); } else { setBackground(list.getBackground()); setForeground(list.getForeground()); } ContactItem contactItem = (ContactItem)value; setText(contactItem.getNickname()); if (contactItem.getIcon() == null) { setIcon(SparkRes.getImageIcon(SparkRes.CLEAR_BALL_ICON)); } else { setIcon(contactItem.getIcon()); } setFont(contactItem.getNicknameLabel().getFont()); setForeground(contactItem.getForeground()); return this; } } public boolean canClose() { return !textField.hasFocus(); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?