Обходной путь с использованием политик:
interface INumericPolicy
{
T Zero();
T Add(T a, T b);
// add more functions here, such as multiplication etc.
}
struct NumericPolicies:
INumericPolicy,
INumericPolicy
// add more INumericPolicy<> for different numeric types.
{
int INumericPolicy.Zero() { return 0; }
long INumericPolicy.Zero() { return 0; }
int INumericPolicy.Add(int a, int b) { return a + b; }
long INumericPolicy.Add(long a, long b) { return a + b; }
// implement all functions from INumericPolicy<> interfaces.
public static NumericPolicies Instance = new NumericPolicies();
}
Алгоритмы:
static class Algorithms
{
public static T Sum(this P p, params T[] a)
where P: INumericPolicy
{
var r = p.Zero();
foreach(var i in a)
{
r = p.Add(r, i);
}
return r;
}
}
Использование:
int i = NumericPolicies.Instance.Sum(1, 2, 3, 4, 5);
long l = NumericPolicies.Instance.Sum(1L, 2, 3, 4, 5);
NumericPolicies.Instance.Sum("www", "") // compile-time error.
Решение безопасно для компиляции. CityLizard Framework предоставляет скомпилированную версию для .NET 4.0. Файл lib / NETFramework4.0 / CityLizard.Policy.dll.
Он также доступен в Nuget: https://www.nuget.org/packages/CityLizard/ . См. Структуру CityLizard.Policy.I.
Есть пример автозаполнения для текстовой области в
Учебники Sun «Использование компонентов Swing» .
Это сделано в стиле текстовых процессоров (без всплывающих окон, но
Предлагаемый текст набирается перед курсором).
Просто прокрутите вниз до «Другой пример: TextAreaDemo»
и нажмите кнопку «Запуск»!
Вы могли бы хотеть попробовать свободный компонент AutoComplete в SwingLabs.
Редактирование: Этот сайт, кажется, переместился http://java.net/projects/swinglabs
существует пример, как реализовать этот код в:
Я добавил бы actionListener, таким образом, можно получить каждый ключ, поскольку он нажимается.
Вы банка может затем сделать поиск в фоновом режиме (другой поток)
Вот пример со всплывающим окном по вашему запросу. Вы можете запустить этот пример внизу страницы.
Вот мой упрощенный пример. К сожалению, сначала нужно щелкнуть текстовое поле, прежде чем начать вводить текст, иначе будут исключения. Если кто-нибудь может понять, почему, дайте мне знать / обновить этот ответ.
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
}
}
Используйте это
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);
}
};
}
;
});
}
}
Вы можете использовать JEdit textarea со встроенной структурой завершения и подсветки синтаксиса.
Более тяжелым решением (которое хорошо в долгосрочной перспективе) является использование NetBeans Platform.
Вот отличная статья, в которой используется несколько библиотек: Добавление поддержки автозаполнения в поля со списком Swing @Java.net