Добрый день, сейчас я пытаюсь реализовать выпадающей список с возможными значениями | Код | public class FindMenuItemWindow extends JInternalFrame implements RefreshNeed{ private boolean isPerfomed=false; private JTextField jTextField3=null; public DefaultListModel cNazvModel=new DefaultListModel(); public Vector cNazv=new Vector(); public JTextField getJTextField3() { if (jTextField3 == null) { jTextField3 = new JTextField(); jTextField3.addFocusListener(new FocusAction(jTextField3,cNazvModel,cNazv,this)); jTextField3.addKeyListener(new KeyTypeAction(jTextField3,cNazvModel,cNazv,this )); }
public boolean isRefreshNeed() { return isPerfomed; }
public void setRefreshNeed(boolean i) { isPerfomed=i; } private JButton getJButton6() { if (jButton6 == null) { jButton6 = new JButton(); jButton6.addActionListener(new RezultAction(this)); } return jButton6; }
}
|
Эт основной класс. Я пропустил добавление на соответствующий панель и подобное | Код |
public class KeyTypeAction implements KeyListener { private DefaultListModel model; private JTextField owner; //private Vector addedValues; private Vector list; private String prevText; private RefreshNeed ref;
public KeyTypeAction(JTextField owner,DefaultListModel model, Vector list, RefreshNeed ref) { //addedValues=new Vector(); this.model=model; this.owner=owner; this.list=list; this.ref=ref; prevText=""; }
public void keyPressed(KeyEvent e) { }
private void init() { prevText=""; model.clear(); for (Iterator it=list.iterator();it.hasNext();) { String element = (String) it.next(); model.addElement(element); } } public void keyReleased(KeyEvent e) { System.out.println("keyrealised"+model.getSize()); if (e.getKeyCode()==KeyEvent.VK_BACK_SPACE || e.getKeyCode()==KeyEvent.VK_DELETE) { System.out.println("someone action"); String s=""; try{ s=owner.getDocument().getText(0,owner.getDocument().getLength()); } catch (Exception e1) { e1.printStackTrace(); } for(Iterator iter=list.iterator();iter.hasNext();) { String val=iter.next().toString(); if (val.startsWith(s)&& model.contains(val)) model.addElement(val); }//System.out.println("backspace: " +model.size()+" "+deletedValues.size()); } if (e.getKeyCode()==KeyEvent.VK_DOWN||e.getKeyCode()==KeyEvent.VK_KP_DOWN) System.out.println("down"); if (!Character.isLetterOrDigit(e.getKeyChar())) return; String s=""; Document doc=owner.getDocument(); if (doc.getLength()==0) {init(); return; }; try { s=doc.getText(0, doc.getLength()); } catch (BadLocationException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } if (prevText.startsWith(s)) { for (Iterator iter = list.iterator(); iter.hasNext();) { String val=iter.next().toString(); if (val.startsWith(s)&&!model.contains(val)) model.addElement(val); } //out(s); prevText=s; return; }; if (s.startsWith(prevText)||(ref.isRefreshNeed())) { for (Enumeration en=model.elements();en.hasMoreElements();) {//System.out.println(iter.hasNext()); String val=(String)en.nextElement(); if (!val.startsWith(s)) model.removeElement(val); } System.out.println(model); // out(s); prevText=s; return; }; init(); } private void out(String s ) {System.out.println(" get text: "+s+"prevText"+prevText);}; public void keyTyped(KeyEvent e) { }
}
|
Вот реализация экшена | Код | public class FocusAction implements FocusListener { private JTextField owner; private JList list; private Popup popup; private FindMenuItemWindow findMenuItemWindow; private Vector values; private DefaultListModel model; private RefreshNeed ref; public FocusAction(JTextField owner,DefaultListModel model, Vector values,RefreshNeed ref) { this.owner=owner; this.model=model; this.values=values; this.ref=ref; list=new JList(model); }
public void focusGained(FocusEvent arg0) { owner.setCaretPosition(owner.getDocument().getLength()); owner.moveCaretPosition(0); Point location=owner.getLocation(); SwingUtilities.convertPointToScreen(location, owner); location.y+=owner.getHeight(); if (ref.isRefreshNeed()) refresh(); if (model.size()==0) return; System.out.println(model); System.out.println(list.getComponentCount()); list.setPreferredSize(new Dimension(owner.getWidth(),list.getComponentCount()*20)); list.setBorder(BorderFactory.createEtchedBorder()); location.x-=owner.getX(); popup=PopupFactory.getSharedInstance().getPopup(owner,list, location.x, location.y); popup.show();
}
public void focusLost(FocusEvent evt) { if (!(model.size()==0))popup.hide();
} private void refresh() { model.clear(); System.out.println(values); for(Iterator iter=values.iterator();iter.hasNext();) { String val=iter.next().toString(); model.addElement(val); } } }
|
| Код | public class RezultAction implements Action {
public void actionPerformed(ActionEvent arg0) { findMenuItemWindow.setRefreshNeed(true); if (findMenuItemWindow.getJTextField3().getText().length() != 0) {String cSlovoInNazv = findMenuItemWindow.getJTextField3().getText(); findMenuItemWindow.cNazv.add(cSlovoInNazv); } }
|
Некоторые вещи я опустил (конструкторы и другие методы) Теперь вопрос, как сделать чтоб выпадающий список работал как надо ? =) ЗЫ прошу прощения за мой русский язык и пунктуацию Это сообщение отредактировал(а) magicfly - 18.5.2007, 15:15
|