Java 如何使用Swing实现自动完成?
我感兴趣的是在JFrame中提供一个自动完成框。触发机制将基于助记符(我认为),但我不确定“自动完成框”使用什么(我希望在用户按键时过滤结果) 您将如何实现这一点?某种JFrame或JPOppMenuJava 如何使用Swing实现自动完成?,java,swing,autocomplete,Java,Swing,Autocomplete,我感兴趣的是在JFrame中提供一个自动完成框。触发机制将基于助记符(我认为),但我不确定“自动完成框”使用什么(我希望在用户按键时过滤结果) 您将如何实现这一点?某种JFrame或JPOppMenu 我想知道这是如何实现的,所以请不要发布指向可用[J]组件的链接。我会添加一个actionListener,这样您可以在按下每个键时获得它 然后你可以在后台进行搜索(另一个线程)你可能想在SwingLabs上试用免费的自动完成组件 编辑:此网站似乎已移动 下面是如何在以下位置实现此代码的示例: 在
我想知道这是如何实现的,所以请不要发布指向可用[J]组件的链接。我会添加一个actionListener,这样您可以在按下每个键时获得它
然后你可以在后台进行搜索(另一个线程)你可能想在SwingLabs上试用免费的自动完成组件 编辑:此网站似乎已移动 下面是如何在以下位置实现此代码的示例:
在
它是以文字处理器的方式完成的(没有弹出窗口,但是
建议的文本在光标前面键入) 只需向下滚动到“另一个示例:TextAreaDemo”
蚂蚁按下发射按钮 是一个根据您的要求弹出的示例。您可以在页面底部启动此示例 下面是我的简化示例。遗憾的是,您必须先单击文本字段, 在开始键入之前,否则会出现异常。如果有人能找出原因,请告诉我/更新此答案 用这个
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);
}
};
}
;
});
}
}
您可以与内置的补全和语法突出显示框架一起使用
一个更重的解决方案(从长远来看是好的)是使用。这里有一篇很棒的文章,它使用了几个库:@Java.net您可以使用这个库:
但是,您会将ActionListener添加到哪个组件?您将提供自动完成功能的组件。
DocumentListener
是自动完成JTextField
的更好选项。请在获得解决方案后发布。另请参阅类似答案!我知道怎么回事了!1) 当文本字段为空时,忽略插入符号位置!2) 使用诸如UndoableEditListener之类的内容代替KeyListener。请注意,swinglabs站点现在显示为空。但是,有一个可以访问源的。此外,该项目似乎可以通过maven获得,如图所示。它也可以在maven Central上获得。到今天为止,链接已断开。链接再次工作。我认为甲骨文推翻了从sun.com URL中断转发的决定。链接被中断了!
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);
}
};
}
;
});
}
}