我有兴趣在JFrame中提供自动完成框。触发机制将基于助记符(我认为),但我不确定将什么用于“自动完成框”(我希望在用户按下键时过滤结果)。
你会如何实现这个?某种JFrame,还是JPopupMenu?
我想知道这是如何实现的,所以请不要发布链接到可用的[J]组件。
答案 0 :(得分:13)
您可能想在SwingLabs上尝试免费的AutoComplete组件。
修改:此网站似乎已移动http://java.net/projects/swinglabs
有一个例子如何在以下位置实现此代码:
答案 1 :(得分:9)
有一个文本区域自动完成的示例 的 Sun's tutorials "Using Swing Components" 强>
它是以文字处理器的方式完成的(没有弹出窗口,但是 建议的文本在光标前输入。
向下滚动到“另一个例子:TextAreaDemo”
蚂蚁点击了启动按钮!
答案 2 :(得分:7)
Here是您提出的弹出窗口示例。您可以在页面底部启动此示例。
这是我的简化示例。可悲的是,你必须先点击文本字段, 在开始输入之前,或者你会得到例外。 如果有人能弄清楚原因,请告诉我/更新此答案。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class _Autocompleter {
private final static JPopupMenu textPopupMenu
= new JPopupMenu("MENU") {
{
add(new JMenuItem("item 1"));
add(new JMenuItem("item 2"));
setFocusable(false);
}
};
private final static KeyListener textInputListener
= new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
Point p = textInput.getCaret().getMagicCaretPosition();
if (textPopupMenu.isVisible()) {
SwingUtilities.convertPointToScreen(p, textInput);
textPopupMenu.setLocation(p.x, p.y + 20);
} else {
textPopupMenu.show(textInput, p.x, p.y + 20);
}
}
};
private final static JTextArea textInput
= new JTextArea("type something") {
{
addKeyListener(textInputListener);
setCaretPosition(getText().length());
}
};
private final static JFrame f = new JFrame("TEST") {
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(textInput);
setSize(400, 60);
setLocationRelativeTo(null);
setVisible(true);
}
};
public static void main(String[] args)
throws Exception {
// YES, IT'S EMPTY !!!
// It'll start anyway because of static initializers
}
}
答案 3 :(得分:3)
这篇文章使用了几个库:Adding Auto-Complete Support to Swing Comboboxes @ Java.net
答案 4 :(得分:3)
您可以使用此库: http://fifesoft.com/autocomplete/
答案 5 :(得分:1)
使用此
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Autocompleter2
{
//~ Methods ------------------------------------------------------------------------------------
public static void main(String[] args)
throws Exception
{
// YES, IT'S EMPTY !!!
// It'll start anyway because of static initializers
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
final JPopupMenu textPopupMenu = new JPopupMenu("MENU")
{
{
add(new JMenuItem("item 1"));
add(new JMenuItem("item 2"));
setFocusable(false);
}
};
final JTextArea textInput = new JTextArea("type something la")
{
{
setCaretPosition(getText().length());
}
};
KeyListener textInputListener = new KeyAdapter()
{
@Override
public void keyTyped(KeyEvent e)
{
Point p = textInput.getCaret().getMagicCaretPosition();
if (textPopupMenu.isVisible())
{
SwingUtilities.convertPointToScreen(p, textInput);
textPopupMenu.setLocation(p.x, p.y + 20);
}
else
{
textPopupMenu.show(textInput, p.x, p.y + 20);
}
}
};
textInput.addKeyListener(textInputListener);
new JFrame("TEST")
{
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(textInput);
setSize(400, 60);
setLocationRelativeTo(null);
setVisible(true);
}
};
}
;
});
}
}
答案 6 :(得分:1)
您可以使用JEdit's textarea内置完成功能&语法高亮框架。
更重要的解决方案(从长远来看是好的)是使用NetBeans Platform。
答案 7 :(得分:0)
我会添加一个actionListener,这样你就可以按下每个键。
然后你可以在后台进行搜索(另一个线程)