Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

193
LINES

< > TinyBrain | #1008913 - JTextArea auto-complete test

JavaX source code [tags: use-pretranspiled] - run with: x30.jar - homepage

Libraryless. Click here for Pure Java version (1100L/8K/31K).

!7

p-awt {
  new Test().initUI();
}

sclass Test {
  class SuggestionPanel {
      private JList list;
      private JPopupMenu popupMenu;
      private String subWord;
      private final int insertionPosition;

      public SuggestionPanel(JTextArea textarea, int position, String subWord, Point location) {
          this.insertionPosition = position;
          this.subWord = subWord;
          popupMenu = new JPopupMenu();
          popupMenu.removeAll();
          popupMenu.setOpaque(false);
          popupMenu.setBorder(null);
          popupMenu.add(list = createSuggestionList(position, subWord), BorderLayout.CENTER);
          popupMenu.show(textarea, location.x, textarea.getBaseline(0, 0) + location.y);
      }

      public void hide() {
          popupMenu.setVisible(false);
          if (suggestion == this) {
              suggestion = null;
          }
      }

      private JList createSuggestionList(final int position, final String subWord) {
          Object[] data = new Object[10];
          for (int i = 0; i < data.length; i++) {
              data[i] = subWord + i;
          }
          JList list = new JList(data);
          list.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
          list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
          list.setSelectedIndex(0);
          list.addMouseListener(new MouseAdapter() {
              @Override
              public void mouseClicked(MouseEvent e) {
                  if (e.getClickCount() == 2) {
                      insertSelection();
                  }
              }
          });
          return list;
      }

      public boolean insertSelection() {
          if (list.getSelectedValue() != null) {
              try {
                  final String selectedSuggestion = ((String) list.getSelectedValue()).substring(subWord.length());
                  textarea.getDocument().insertString(insertionPosition, selectedSuggestion, null);
                  return true;
              } catch (BadLocationException e1) {
                  e1.printStackTrace();
              }
              hideSuggestion();
          }
          return false;
      }

      public void moveUp() {
          int index = Math.min(list.getSelectedIndex() - 1, 0);
          selectIndex(index);
      }

      public void moveDown() {
          int index = Math.min(list.getSelectedIndex() + 1, list.getModel().getSize() - 1);
          selectIndex(index);
      }

      private void selectIndex(int index) {
          final int position = textarea.getCaretPosition();
          list.setSelectedIndex(index);
          SwingUtilities.invokeLater(new Runnable() {
              @Override
              public void run() {
                  textarea.setCaretPosition(position);
              };
          });
      }
  }

  private SuggestionPanel suggestion;
  private JTextArea textarea;

  protected void showSuggestionLater() {
      SwingUtilities.invokeLater(new Runnable() {
          @Override
          public void run() {
              showSuggestion();
          }

      });
  }

  protected void showSuggestion() {
      hideSuggestion();
      final int position = textarea.getCaretPosition();
      Point location;
      try {
          location = textarea.modelToView(position).getLocation();
      } catch (BadLocationException e2) {
          e2.printStackTrace();
          return;
      }
      String text = textarea.getText();
      int start = Math.max(0, position - 1);
      while (start > 0) {
          if (!Character.isWhitespace(text.charAt(start))) {
              start--;
          } else {
              start++;
              break;
          }
      }
      if (start > position) {
          return;
      }
      final String subWord = text.substring(start, position);
      if (subWord.length() < 2) {
          return;
      }
      suggestion = new SuggestionPanel(textarea, position, subWord, location);
      awt { textarea.requestFocusInWindow(); }
  }

  private void hideSuggestion() {
      if (suggestion != null) {
          suggestion.hide();
      }
  }

  protected void initUI() {
      final JFrame frame = new JFrame();
      frame.setTitle("Test frame on two screens");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      JPanel panel = new JPanel(new BorderLayout());
      textarea = new JTextArea(24, 80);
      textarea.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
      textarea.addKeyListener(new KeyListener() {

          @Override
          public void keyTyped(KeyEvent e) {
              if (e.getKeyChar() == KeyEvent.VK_ENTER) {
                  if (suggestion != null) {
                      if (suggestion.insertSelection()) {
                          e.consume();
                          final int position = textarea.getCaretPosition();
                          SwingUtilities.invokeLater(new Runnable() {
                              @Override
                              public void run() {
                                  try {
                                      textarea.getDocument().remove(position - 1, 1);
                                  } catch (BadLocationException e) {
                                      e.printStackTrace();
                                  }
                              }
                          });
                      }
                  }
              }
          }

          @Override
          public void keyReleased(KeyEvent e) {
              if (e.getKeyCode() == KeyEvent.VK_DOWN && suggestion != null) {
                  suggestion.moveDown();
              } else if (e.getKeyCode() == KeyEvent.VK_UP && suggestion != null) {
                  suggestion.moveUp();
              } else if (Character.isLetterOrDigit(e.getKeyChar())) {
                  showSuggestionLater();
              } else if (Character.isWhitespace(e.getKeyChar())) {
                  hideSuggestion();
              }
          }

          @Override
          public void keyPressed(KeyEvent e) {

          }
      });
      panel.add(textarea, BorderLayout.CENTER);
      frame.add(panel);
      frame.pack();
      frame.setVisible(true);
  }
}

Author comment

from https://stackoverflow.com/questions/10873748/how-to-show-autocomplete-as-i-type-in-jtextarea

download  show line numbers  debug dex   

Travelled to 2 computer(s): cfunsshuasjs, tvejysmllsmz

No comments. add comment

Snippet ID: #1008913
Snippet name: JTextArea auto-complete test
Eternal ID of this version: #1008913/1
Text MD5: 6580653918ed28f5fd3b45cd35846273
Transpilation MD5: 6fd2efce8d1124deac6d5d5f6ca9ecd8
Author: stefan
Category: javax / gui
Type: JavaX source code
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2017-06-18 17:00:15
Source code size: 6398 bytes / 193 lines
Pitched / IR pitched: No / No
Views / Downloads: 32 / 38
Referenced in: [show]