Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Реализовать T9


Автор: Akonkagva 23.1.2010, 20:29
Мне надо реализовать поддержку T9(как в мобильнике, подсказывание текста, возможен вариант работа как в Eclipse) в своей программе, как я могу это сделать ?
Поддержку лутше всего организовать в поле типа JTextArea.
Если поддержку нельзя создать в JTextArea, то подскажите на какой тип мне поменять данную JTextArea.
Если кто-то делал нечто подобное обьясните пожалуйста как это сделать, можно даже примерно.
Заранее спасибо.

Автор: GZep 23.1.2010, 22:31
если честно, я бы рапотрашил какую-нибудь прогу где это реализованно и посмотрел бы принцип работы.
(например, в опера мини такое есть, в последних версиях)

Автор: dorogoyIV 24.1.2010, 03:20
Цитата(Akonkagva @  23.1.2010,  20:29 Найти цитируемый пост)
реализовать поддержку T9

Цитата(GZep @  23.1.2010,  22:31 Найти цитируемый пост)
прогу где это реализованно

там файлик текстовый небольшой со словами
есть еще файлик с окончаниями для слов

Автор: Akonkagva 24.1.2010, 21:37
Угум, я до этого тоже допёр, а поточнее ?

Автор: dorogoyIV 25.1.2010, 15:07
Цитата(Akonkagva @  24.1.2010,  21:37 Найти цитируемый пост)
а поточнее ?

ну как то так наверное?
Код

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
import java.util.*;

public class Test extends JFrame
{
 JTextArea jta = new JTextArea("аба");

 public Test()
 {
  add(new JScrollPane(jta));
  jta.addKeyListener(new AreaListener(jta));
 }

 public static void main(String [] args)
 {
  JFrame f = new Test();
  f.setBounds(100, 100, 400, 300);
  f.setDefaultCloseOperation(3);
  f.setVisible(true);
 }
}

class AreaListener implements KeyListener, ActionListener
{
 JTextArea jta;
 JPopupMenu jpm = new JPopupMenu();
 String [] s = {"абажур", "абакан", "аврора"};
 String lastWord = "";
 boolean show = true;

 AreaListener(JTextArea jta)
 {
  this.jta = jta;
 }

 public void keyPressed(KeyEvent e){}
 public void keyTyped(KeyEvent e){}

 public void keyReleased(KeyEvent e)
 {
  int pos = jta.getCaretPosition();

  if(e.getKeyCode() != KeyEvent.VK_ESCAPE &&
     e.getKeyCode() != KeyEvent.VK_SPACE &&
     jta.getText().length() > 2 && pos == jta.getText().length())
  {
   findWords(jta.getText());
   show = true;
  }
 }

 private String getLastWord(String text)
 {
  String [] str = text.split(" ");
  return str [str.length - 1];
 }

 private void findWords(String text)
 {
  lastWord = getLastWord(text);

  if(lastWord.length() > 2)
  {
   Vector <String> v = new Vector <String>();

   for(int i = 0; i < s.length; i++)
    if(s [i].startsWith(lastWord))
     v.add(s [i]);

   if(v.size() > 0 && show)
    showPopup(v);
  }
 }

 private void showPopup(Vector <String> v)
 {
  jpm.removeAll();

  for(int i = 0; i < v.size(); i++)
  {
   JMenuItem item = new JMenuItem(v.get(i));
   jpm.add(item);
   item.addActionListener(this);
  }

  Point p = getCursorPosition();
  jpm.show(jta, p.x, p.y);
 }

 public void actionPerformed(ActionEvent e)
 {
  String word = e.getActionCommand();
  String text = jta.getText();
  int index = text.length() - lastWord.length();
  String newText = text.substring(0, index) + word + " ";
  jta.setText(newText);
  show = false;
 }

 private Point getCursorPosition()
 {
  Caret caret = jta.getCaret();
  Point p = caret.getMagicCaretPosition();
  return p;
 }
}

Автор: Akonkagva 25.1.2010, 16:36
Супер, Большое спасибо !!!!

Автор: dorogoyIV 29.1.2010, 20:23
что то скучно было, думаю - дай попишу...  smile 
потести

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)