usar como agregar java swing jscrollpane jtextarea

como - scroll java swing



Desplazamiento de JScrollPane con las teclas de flecha (4)

Tengo un componente JTextArea dentro de JScrollPane y el área de texto no es editable. Me gustaría habilitar el desplazamiento del área de texto con las teclas de flecha hacia arriba y hacia abajo (es decir, al presionar las teclas de flecha se desplazará el área de texto por una línea). ¿Alguna idea de cómo lograr esto?


Debe agregar KeyListener a su JScrollPane.


Si el JTextArea no es editable y no se puede enfocar, no responderá a las teclas de flecha. No estoy seguro de si hay una forma canónica de evitar esto, pero una forma de hacerlo responder es establecer su enlace de clave para responder a las teclas hacia arriba y hacia abajo cuando JTextArea se encuentra en la ventana enfocable. Un ejemplo de esto es el siguiente:

import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import javax.swing.*; import javax.swing.text.JTextComponent; @SuppressWarnings("serial") public class TestScrollingArea extends JPanel { private static final String UP = "Up"; private static final String DOWN = "Down"; private JTextArea area = new JTextArea(20, 40); private JScrollPane scrollPane = new JScrollPane(area); public TestScrollingArea() { // make textarea non-editable and non-focusable area.setEditable(false); area.setFocusable(false); area.setWrapStyleWord(true); area.setLineWrap(true); add(scrollPane); // fill area with letters for (int i = 0; i < 10; i++) { for (int j = 0; j < 100; j++) { area.append("abcdefg "); } } // have JTextArea tell us how tall a line of text is. int scrollableIncrement = area.getScrollableUnitIncrement(scrollPane.getVisibleRect(), SwingConstants.VERTICAL, 1); // add key bindings to the JTextArea int condition = JTextComponent.WHEN_IN_FOCUSED_WINDOW; InputMap inMap = area.getInputMap(condition); ActionMap actMap = area.getActionMap(); inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), UP); inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), DOWN); actMap.put(UP, new UpDownAction(UP, scrollPane.getVerticalScrollBar().getModel(), scrollableIncrement)); actMap.put(DOWN, new UpDownAction(DOWN, scrollPane.getVerticalScrollBar().getModel(), scrollableIncrement)); } // Action for our key binding to perform when bound event occurs private class UpDownAction extends AbstractAction { private BoundedRangeModel vScrollBarModel; private int scrollableIncrement; public UpDownAction(String name, BoundedRangeModel model, int scrollableIncrement) { super(name); this.vScrollBarModel = model; this.scrollableIncrement = scrollableIncrement; } @Override public void actionPerformed(ActionEvent ae) { String name = getValue(AbstractAction.NAME).toString(); int value = vScrollBarModel.getValue(); if (name.equals(UP)) { value -= scrollableIncrement; vScrollBarModel.setValue(value); } else if (name.equals(DOWN)) { value += scrollableIncrement; vScrollBarModel.setValue(value); } } } private static void createAndShowUI() { JFrame frame = new JFrame("TestScrollingArea"); frame.getContentPane().add(new TestScrollingArea()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { createAndShowUI(); } }); } }


Sí Key Bindings es el camino a seguir, pero no siempre es necesario crear sus propias acciones. Los componentes Swing vienen con acciones predeterminadas que a menudo puede reutilizar.

Consulte Enlaces clave para obtener una lista completa de estas acciones.

Ahora que conoce el nombre de la Acción, puede vincularlo a una pulsación de tecla:

JScrollBar vertical = scrollPane.getVerticalScrollBar(); InputMap im = vertical.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); im.put(KeyStroke.getKeyStroke("DOWN"), "positiveUnitIncrement"); im.put(KeyStroke.getKeyStroke("UP"), "negativeUnitIncrement");


Acabo de enterarme de este problema y, si bien las respuestas fueron útiles para conducirme en la dirección correcta, algunas partes de la solución pueden haber cambiado desde entonces. Me funcionó con los siguientes cambios: - era el InputMap de la instancia de JScrollPane el que tuvo que cambiarse - actionMapKeys tenía que ser: "unitScrollX" y / o "scrollX" (X = Abajo, Arriba, Izquierda, Derecha). Ellos residen en BasicScrollPaneUI.