当前位置:  开发笔记 > 编程语言 > 正文

我怎么能用Swing实现自动完成?

如何解决《我怎么能用Swing实现自动完成?》经验,为你挑选了3个好方法。

我有兴趣在JFrame中提供自动完成框.触发机制将基于助记符(我认为),但我不确定要使用什么用于"自动完成框"(我希望结果在用户按下键时进行过滤).

你会如何实现这个?某种JFrame,还是JPopupMenu?

我想知道这是如何实现的,所以请不要发布链接到可用的[J]组件.



1> Geekygecko..:

您可能想在SwingLabs上尝试免费的AutoComplete组件.

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


请注意,swinglabs网站现在显示为空.但是,有https://swinglabs.dev.java.net,它可以访问源代码.此外,该项目似乎可以通过maven获得,例如http://www.mvnbrowser.com/artifact-details.html?groupId=org.swinglabs&artifactId=swingx&version=0.9.5-2&tab=VERSIONS#tabs表示.

2> ivan_ivanovi..:


Sun的教程"使用Swing组件"中有一个文本区域自动完成的示例.

它是以文字处理器的方式完成的(没有弹出窗口,但
建议的文本在光标前面输入).

只需向下滚动到"另一个例子:TextAreaDemo"
蚂蚁点击启动按钮!



3> ivan_ivanovi..:

以下是您请求弹出窗口的示例.您可以在页面底部启动此示例.

这是我的简化示例.遗憾的是,在开始输入之前,您必须先单击文本字段,否则您将获得异常.如果有人能弄明白为什么,请让我知道/更新这个答案.

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
  }

}

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有