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); } }
from https://stackoverflow.com/questions/10873748/how-to-show-autocomplete-as-i-type-in-jtextarea
download show line numbers debug dex old transpilations
Travelled to 13 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
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 / 192 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 449 / 546 |
Referenced in: | [show references] |