ここでの私の以前の投稿に続いて、親切なミスター。
自動補完を機能させるために、ここ@bunta
からコードを使用し、それを私のコードで使用することをお勧めします。
問題は、私がすでにスレッドを使用していることです。
これが部分的なコードです(かなり大きいので、重要なものだけを投稿します):
private javax.swing.JTextField boxOfCurrentPath;
// more code
boxOfCurrentPath.setToolTipText("");
boxOfCurrentPath.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
boxOfCurrentPathActionPerformed(evt);
}
});
しかし、別のスレッドを追加しようとすると、上記の自動補完の例と現在のコードでは何も起こりません。コードはオートコンプリートなしで実行されます:
boxOfCurrentPath.setToolTipText("");
boxOfCurrentPath.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
boxOfCurrentPathActionPerformed(evt);
}
class AutoSuggest2 extends JPanel
{
private final JTextField tf;
private final JComboBox combo = new JComboBox();
private final Vector<String> v = new Vector<String>();
public AutoSuggest2()
{
super(new BorderLayout());
combo.setEditable(true);
tf = (JTextField) combo.getEditor().getEditorComponent();
tf.addKeyListener(new KeyAdapter()
{
public void keyTyped(KeyEvent e)
{
EventQueue.invokeLater(new Runnable() {
public void run()
{
String text = tf.getText();
if(text.length()==0)
{
combo.hidePopup();
setModel(new DefaultComboBoxModel(v), "");
}
else
{
DefaultComboBoxModel m = getSuggestedModel(v, text);
if(m.getSize()==0 || hide_flag)
{
combo.hidePopup();
hide_flag = false;
}
else
{
setModel(m, text);
combo.showPopup();
}
} // end else
} // end run
});
} // end keyTyped
public void keyPressed(KeyEvent e)
{
String text = tf.getText();
int code = e.getKeyCode();
if(code==KeyEvent.VK_ENTER)
{
if(!v.contains(text))
{
v.addElement(text);
Collections.sort(v);
setModel(getSuggestedModel(v, text), text);
}
hide_flag = true;
}
else
if(code==KeyEvent.VK_ESCAPE)
{
hide_flag = true;
}
else
if(code==KeyEvent.VK_RIGHT)
{
for(int i=0;i<v.size();i++)
{
String str = v.elementAt(i);
if(str.startsWith(text))
{
combo.setSelectedIndex(-1);
tf.setText(str);
return;
}
}
}
} // end keyPressed
}); // end addKeyListener
String[] axesTypes =
{"child::", "attribute::", "descendant::", "descendant-or-self::",
"slef::", "parent::", "following-sibling::", "preceding-sibling::",
"ancestor-or-self::", "ancestor::", "following::", "preceding::" ,
"preceding::", "namespace::", "node()"};
for(int i=0;i<axesTypes.length;i++)
{
v.addElement(axesTypes[i]);
}
setModel(new DefaultComboBoxModel(v), "");
JPanel p = new JPanel(new BorderLayout());
p.setBorder(BorderFactory.createTitledBorder("AutoSuggestion Box"));
p.add(combo, BorderLayout.NORTH);
add(p);
setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
setPreferredSize(new Dimension(300, 150));
} // end AutoSuggest
private boolean hide_flag = false;
private DefaultComboBoxModel getSuggestedModel(java.util.List<String> list, String text)
{
DefaultComboBoxModel m = new DefaultComboBoxModel();
for(String s: list)
{
if(s.startsWith(text)) m.addElement(s);
}
return m;
}
private void setModel(DefaultComboBoxModel mdl, String str)
{
combo.setModel(mdl);
combo.setSelectedIndex(-1);
tf.setText(str);
}
} // end AutoSuggest2 extends
});
私は明らかに何か間違ったことをしていますが、その理由を理解できないようです.何かアイデアはありますか? ありがとう !