Estoy tratando de implícitamente smart autoscroll en un JScrollPane que contiene un JTextPane. El JTextPane se usa para registrar mi aplicación en color. Sin embargo, estoy corriendo hacia una pared tratando de hacer autoscrols inteligentes. Por desplazamiento automático inteligente no me refiero ciegamente al desplazamiento automático cada vez que algo cambia, me refiero a verificar si se desplazó hacia abajo, y luego autodesplazamiento. Sin embargo, no importa lo que haga que sea siempre autoscrolls o no lo hace en absolutoSmart JScrollPane autoscrolling
Como un script de prueba, aquí está la configuración (JFrame se ha quedado fuera)
final JTextPane textPane = new JTextPane();
textPane.setEditable(false);
final JScrollPane contentPane = new JScrollPane(textPane);
contentPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
y aquí está la fea Autoañadir prueba lazo
while (true)
try {
Thread.sleep(1000);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
JScrollBar scrollBar = scroll;
boolean preCheck = ((scrollBar.getVisibleAmount() != scrollBar.getMaximum()) && (scrollBar.getValue() + scrollBar.getVisibleAmount() == scrollBar.getMaximum()));
System.out.println("Value: " + scroll.getValue()
+ " | Visible: " + scrollBar.getVisibleAmount()
+ " | Maximum: " + scrollBar.getMaximum()
+ " | Combined: " + (scrollBar.getValue() + scrollBar.getVisibleAmount())
+ " | Vis!=Max : " + (scrollBar.getVisibleAmount() != scrollBar.getMaximum())
+ " | Comb=Max: " + (scrollBar.getValue() + scrollBar.getVisibleAmount() == scrollBar.getMaximum())
+ " | Eval: " + preCheck);
StyledDocument doc = textPane.getStyledDocument();
doc.insertString(doc.getLength(), "FAGAHSIDFNJASDKFJSD\n", doc.getStyle(""));
if (!preCheck)
textPane.setCaretPosition(doc.getLength());
} catch (BadLocationException ex) {
ex.printStackTrace();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
No es bonito, pero hace el trabajo bien.
Aquí es cuando el cheque correspondiente
boolean preCheck = ((scrollBar.getVisibleAmount() != scrollBar.getMaximum()) && (scrollBar.getValue() + scrollBar.getVisibleAmount() == scrollBar.getMaximum()));
if (preCheck)
textPane.setCaretPosition(doc.getLength());
esa es la parte eso me ha estado dando problemas. Primero hay que verificar si la barra está visible pero no se puede usar (no hay suficiente texto, haciendo que la barra tenga la longitud completa), y luego si la parte inferior de la barra es igual al máximo. En teoría, eso debería funcionar. Sin embargo, nada, incluido mover el cheque, ha obtenido los resultados que me gustaría.
¿Alguna sugerencia?
NO es un DUPLICADO de this o this, ya que quieren que siempre se desplace, no solo algunas veces.
¿resolviste esto? Tengo exactamente la misma tarea y, realmente, todavía no puedo encontrar la solución. –