java - varios - Aplicación de Windows con autocompletar usando la pestaña de archivos de máquina y directorios de Unix
ver el contenido de un archivo en linux (1)
En primer lugar, desea tener un campo de texto sin ciclos de enfoque y supresión de pestañas:
jTextField1.setFocusCycleRoot(true);
jTextField1.setFocusTraversalKeysEnabled(false);
Luego, un modelo de datos para los archivos (aquí el directorio local, pero SSH también):
private File dir = new File("C:/Work");
private String typedPrefix = null;
private List<String> filesWithPrefix = new ArrayList<>();
Luego, presionó una tecla para manejar la TAB:
- Consumir el evento.
- Obtenga el prefijo hasta el cursor para buscar nombres de archivos.
- Si simplemente necesita restringir los nombres de archivos ya encontrados, haga lo mismo, de lo contrario, búsquelos físicamente.
Busque el prefijo común más largo en los nombres de archivo. Muestra eso.
private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) { System.out.println("KeyPressed " + evt); if (evt.getKeyCode() == KeyEvent.VK_TAB) { evt.consume(); int caretPos = jTextField1.getCaretPosition(); try { final String newPrefix = jTextField1.getText(0, caretPos); System.out.println("newPrefix: " + newPrefix); if (!newPrefix.isEmpty()) { if (typedPrefix == null || !newPrefix.startsWith(typedPrefix)) { // Must physically reload possible values: String[] fileNames = dir.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.startsWith(newPrefix); } }); filesWithPrefix.clear(); Collections.addAll(filesWithPrefix, fileNames); typedPrefix = newPrefix; } else { // Can reduce prior selection: for (ListIterator<String> it = filesWithPrefix.listIterator(); it.hasNext(); ) { String fileName = it.next(); if (!fileName.startsWith(newPrefix)) { it.remove(); } } typedPrefix = newPrefix; } System.out.println("filesWithPrefix: " +filesWithPrefix); if (!filesWithPrefix.isEmpty()) { // Find longest common prefix: String longestCommonPrefix = null; for (String fileName : filesWithPrefix) { if (longestCommonPrefix == null) { longestCommonPrefix = fileName; } else { while (!fileName.startsWith(longestCommonPrefix)) { longestCommonPrefix = longestCommonPrefix.substring(0, longestCommonPrefix.length() - 1); } } } if (longestCommonPrefix.length() > typedPrefix.length()) { jTextField1.setText(longestCommonPrefix); jTextField1.setCaretPosition(longestCommonPrefix.length()); typedPrefix = longestCommonPrefix; } if (filesWithPrefix.size() > 1) { // Show popup: ;;; } else if (filesWithPrefix.size() == 1) { // File selected: System.beep(); } } } } catch (BadLocationException ex) { Logger.getLogger(TabsJFrame.class.getName()).log(Level.SEVERE, null, ex); } } }
Lo que falta es la visualización de los nombres de archivo ambiguos. El menú emergente estaría bien, ¿no?
Surgir:
// Show popup:
JPopupMenu popup = new JPopupMenu();
for (String fileName : filesWithPrefix) {
popup.add(new AbstractAction(fileName) {
@Override
public void actionPerformed(ActionEvent e) {
jTextField1.setText(e.getActionCommand());
}
});
}
Point pt = jTextField1.getCaret().getMagicCaretPosition();
popup.show(jTextField1, pt.x, pt.y + 5);
Unix / Linux admite el autocompletado de archivos y directorios al presionar "tab". Necesito crear esta habilidad en mi aplicación de Windows. Tengo un campo de texto para que el usuario ingrese el nombre del archivo, y quiero responder a una "pestaña" presionar como lo hará cuando estamos en una consola de Unix:
- Si hay una opción: Autocompletar.
- Algunas opciones: muestra una lista de las opciones.
- Sin opciones - nada.
Para mi conexión SSH a mi máquina Unix, uso la API ch.ethz.ssh.
¿Hay una manera de hacerlo?