configurar - scroll pane en java
Haciendo un JScrollPane se desplaza automáticamente hacia abajo (7)
Estoy tratando de implementar un JScrollPane con un JTextArea. Se adjunta JTextArea, y quiero que JScrollPane continúe desplazándose hacia abajo a medida que se agrega más texto. ¿Cómo se puede lograr esto?
Aquí está la solución.
JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);`
Encontré la respuesta aquí: JScrollPane y JList auto scroll
scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
e.getAdjustable().setValue(e.getAdjustable().getMaximum());
}
});
Es posible solucionar el problema: puede declarar a ese oyente como una clase y luego instanciarlo en el evento donde sea necesario. Después de lo cual puede eliminar la clase después de forzar un repintado de la pantalla. Funciona de maravilla.
La solución aceptada funciona bien, pero solo cuando el área de texto es editable, es decir, sin jTextArea.setEditable(false)
. La solución sugerida por es más general, pero tiene el problema como se pregunta aquí. Desplazamiento automático de JScrollPane y JList . Usando las respuestas de esa pregunta, puede obtener una solución general, por ejemplo:
JScrollPane scrollPane = new JScrollPane(jTextArea);
verticalScrollBarMaximumValue = scrollPane.getVerticalScrollBar().getMaximum();
scrollPane.getVerticalScrollBar().addAdjustmentListener(
e -> {
if ((verticalScrollBarMaximumValue - e.getAdjustable().getMaximum()) == 0)
return;
e.getAdjustable().setValue(e.getAdjustable().getMaximum());
verticalScrollBarMaximumValue = scrollPane.getVerticalScrollBar().getMaximum();
});
El panel se desplaza hacia abajo solo cuando la barra de desplazamiento vertical se está expandiendo, en respuesta a las líneas de texto adjuntas.
Admito que se podría encontrar un método para filtrar eventos sin variables adicionales, y agradecería que alguien lo publicara.
(PS: Editar para SCREEN SHOOT)
import javax.swing.*;
import javax.swing.text.DefaultCaret;
public class NewClass {
public static void main(String[] args) {
JFrame win = new JFrame("test");
win.setSize(800, 500);
win.setResizable(false);
win.setLayout(null);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.setLocationRelativeTo(null);
JTextArea txtListNum = new JTextArea();
JScrollPane barList = new JScrollPane(txtListNum);
DefaultCaret crList = (DefaultCaret) txtListNum.getCaret();
crList.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
barList.setLocation(10, 10); // Scrollbar Position
barList.setSize(180, 450); // Scrollbar Dimession
win.add(barList); // Scrolbar add to Frame
win.setVisible(true);
}
}
Para (lo que creo que es) una respuesta más simple echa un vistazo: desplazamiento del área de texto
Antes de JDK5, tendría que cambiar manualmente la posición del cursor después de cada anexo. Ahora puedes dar este comportamiento por defecto de esta manera:
JTextArea textArea = new JTextArea(); DefaultCaret caret = (DefaultCaret)textArea.getCaret(); caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
¡La ventaja de esto es que no necesita usar este fragmento más de una vez en su código!
Si está constantemente escribiendo datos en él, podría usar:
textArea.setCaretPosition(textArea.getDocument().getLength());
justo después de agregar los nuevos datos.
Esto se desplazaría automáticamente a lo largo del JScorllPane.