Как я мог реализовать автозавершение с помощью Swing?

Обходной путь с использованием политик:

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.

29
задан Michael Myers 1 June 2009 в 08:08
поделиться

7 ответов

Есть пример автозаполнения для текстовой области в
Учебники Sun «Использование компонентов Swing» .

Это сделано в стиле текстовых процессоров (без всплывающих окон, но
Предлагаемый текст набирается перед курсором).

Просто прокрутите вниз до «Другой пример: TextAreaDemo»
и нажмите кнопку «Запуск»!

10
ответ дан 28 November 2019 в 01:54
поделиться

Вы могли бы хотеть попробовать свободный компонент 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

13
ответ дан Geekygecko 20 November 2019 в 01:21
поделиться

Я добавил бы actionListener, таким образом, можно получить каждый ключ, поскольку он нажимается.

Вы банка может затем сделать поиск в фоновом режиме (другой поток)

0
ответ дан Peter Lawrey 20 November 2019 в 01:21
поделиться

Вот пример со всплывающим окном по вашему запросу. Вы можете запустить этот пример внизу страницы.

Вот мой упрощенный пример. К сожалению, сначала нужно щелкнуть текстовое поле, прежде чем начать вводить текст, иначе будут исключения. Если кто-нибудь может понять, почему, дайте мне знать / обновить этот ответ.

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
  }

}
7
ответ дан 28 November 2019 в 01:54
поделиться

Используйте это

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);
                            }
                        };
                }
                ;
            });
    }
}
0
ответ дан 28 November 2019 в 01:54
поделиться

Вы можете использовать JEdit textarea со встроенной структурой завершения и подсветки синтаксиса.

Более тяжелым решением (которое хорошо в долгосрочной перспективе) является использование NetBeans Platform.

1
ответ дан 28 November 2019 в 01:54
поделиться

Вот отличная статья, в которой используется несколько библиотек: Добавление поддержки автозаполнения в поля со списком Swing @Java.net

3
ответ дан 28 November 2019 в 01:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: