Java 如何组合两个线程以实现自动完成(intelliSense)
在我之前的帖子之后,@bunta先生建议使用 并与我的代码一起使用,以使自动完成工作 问题是我已经在使用线程了 下面是部分代码,它相当大,然后我只发布重要的内容:Java 如何组合两个线程以实现自动完成(intelliSense),java,swing,autocomplete,awt,intellisense,Java,Swing,Autocomplete,Awt,Intellisense,在我之前的帖子之后,@bunta先生建议使用 并与我的代码一起使用,以使自动完成工作 问题是我已经在使用线程了 下面是部分代码,它相当大,然后我只发布重要的内容: private javax.swing.JTextField boxOfCurrentPath; // more code boxOfCurrentPath.setToolTipText(""); boxOfCurrentPath.addActionListener(new java.awt.event.ActionListen
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
});
我显然做错了什么,但似乎不明白为什么。有什么想法吗?谢谢 您可能希望首先进行一些调试,以尝试隔离问题的来源。那么你就可以发布更多合理数量的相关代码了。@HovercraftFullOfEels:相信我,问题不在于示例代码,而在于我的代码。调试没有多大帮助,但我会再试一次。好吧,如果你很快得到一个好的答案,那就不用麻烦了,但我在这里的经验表明,我们在帮助解决孤立的问题方面做得更好,而在解决你还不清楚问题是什么的问题方面做得更好。没有人可以编译或运行您发布的代码,也没有人有时间检查您的整个程序,所以不幸的是,您和我们都陷入了困境。顺便说一下,您可能不想使用KeyListener,而是DocumentFilter。您所说的“另一个线程”是什么?我在你发布的代码中没有看到它,它基本上是RoseIndia网站的副本,我尽量避免使用它。