Как я могу реализовать автозаполнение с помощью Swing?
Я заинтересован в предоставлении окна автозаполнения в JFrame. Механизм запуска будет основан на мнемонике (я думаю), но я не совсем уверен, что использовать для "окна автозаполнения" (я хотел бы, чтобы результаты были отфильтрованы, когда пользователь нажимает клавиши).
Как бы вы это реализовали? Какой-то JFrame, или JPopupMenu?
Я хотел бы знать, как это реализовано, поэтому, пожалуйста, не публикуйте ссылки на доступные компоненты [J].
Ответы
Ответ 1
Существует пример автоматического завершения для текстовой области на
Учебники Sun "Использование компонентов Swing" .
Это делается в стиле текстовых процессоров (нет всплывающих окон, но
предлагаемый текст вводится впереди курсора).
Просто прокрутите вниз до "Еще один пример: TextAreaDemo"
ant нажмите кнопку запуска!
Ответ 2
Возможно, вы захотите попробовать бесплатный компонент AutoComplete в SwingLabs.
http://swinglabs.org
Изменить: этот сайт, похоже, переместил http://java.net/projects/swinglabs
Пример использования этого кода:
http://download.java.net/javadesktop/swinglabs/releases/0.8/docs/api/org/jdesktop/swingx/autocomplete/package-summary.html
Ответ 3
Здесь показан пример с всплывающим окном по вашему запросу. Вы можете запустить этот пример в нижней части страницы.
Вот мой упрощенный пример. К сожалению, сначала нужно щелкнуть по текстовому полю,
перед началом ввода, или вы получите исключения. Если кто-нибудь может понять, почему, пожалуйста, дайте мне знать/обновите этот ответ.
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 EMPTY !!!
// It'll start anyway because of static initializers
}
}
Ответ 4
Вот отличная статья, в которой используется несколько библиотек: Добавление автозаполненной поддержки Swing Comboboxes @Java.net
Ответ 5
Вы можете использовать эту библиотеку:
http://fifesoft.com/autocomplete/
Ответ 6
Используйте этот
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Autocompleter2
{
//~ Methods ------------------------------------------------------------------------------------
public static void main(String[] args)
throws Exception
{
// YES, IT 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);
}
};
}
;
});
}
}
Ответ 7
Вы можете использовать JEdit textarea со встроенной концепцией выделения и синтаксиса.
Более тяжеловесное решение (что хорошо в долгосрочной перспективе) - это использование Платформа NetBeans.
Ответ 8
Я бы добавил actionListener, чтобы вы могли получить каждую клавишу при нажатии.
Затем вы можете выполнить поиск в фоновом режиме (другой поток)