Tengo JScrollPane que contiene algunas imágenes en una fila horizontal. Si la fila de imágenes es demasiado larga para el puerto de visualización, JScrollPane muestra una barra de desplazamiento, reduciendo la altura del puerto de visualización. Me gustaría cambiar el tamaño de las imágenes para que quepan en el puerto de visualización. ¿Cómo puedo detectar que el puerto de visualización cambió su tamaño? Desafortunadamente, el registro de controladores de eventos de cambio no parece funcionar.¿Cómo puedo detectar si la barra de desplazamiento de un JScrollPane cambia la visibilidad?
8
A
Respuesta
12
Usar el detector de cambios en el ViewPort parece funcionar para mí. He aquí una pequeña demostración de que:
import java.awt.BorderLayout;
import java.io.UnsupportedEncodingException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingWorker;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class Main {
public static void main(String[] args) throws UnsupportedEncodingException {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new BorderLayout());
final JPanel buttons = new JPanel();
final JScrollPane pane = new JScrollPane(buttons);
pane.getViewport().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
System.err.println("Change in " + e.getSource());
System.err.println("Vertical visible? " + pane.getVerticalScrollBar().isVisible());
System.err.println("Horizontal visible? " + pane.getHorizontalScrollBar().isVisible());
}
});
panel.add(pane);
frame.setContentPane(panel);
frame.setSize(300, 200);
frame.setVisible(true);
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
for (int i = 0; i < 10; i++) {
Thread.sleep(800);
buttons.add(new JButton("Hello " + i));
buttons.revalidate();
}
return null;
}
};
worker.execute();
}
}
1
he utilizado la HierarchyBoundsListener
para detectar cambios en el tamaño de la JScrollPane:
onAncestorResized(scroll, evt -> resizeYourImages());
He aquí un método de conveniencia para fijar el oyente:
static void onAncestorResized(JComponent component, Consumer<HierarchyEvent> callback) {
component.addHierarchyBoundsListener(new HierarchyBoundsAdapter() {
@Override
public void ancestorResized(HierarchyEvent e) {
callback.accept(e);
}
});
}
Cuestiones relacionadas
- 1. JScrollPane con barra de desplazamiento a la izquierda
- 2. ¿Cómo aumentar la velocidad de desplazamiento lento en un JScrollPane?
- 3. Establecer grosor de la barra de desplazamiento
- 4. ¿Cómo detectar cuándo cambia la altura de su página?
- 5. Barra horizontal en JScrollPane
- 6. detectar si el DIV han barra de desplazamiento o no
- 7. Javascript detectar barra de desplazamiento en textarea
- 8. ¿Cómo puedo acelerar la velocidad de desplazamiento en un JScrollPane cuando uso la rueda del mouse?
- 9. Disparar en la visibilidad de la barra de desplazamiento de ScrollViewer (WPF)
- 10. ¿Cómo puedo detectar una presencia en la barra de desplazamiento (usando Javascript) en HTML iFrame?
- 11. Cómo detectar doble clic en la vista de la lista barra de desplazamiento?
- 12. Cómo mostrar siempre la barra de desplazamiento
- 13. JScrollPane y JList desplazamiento automático
- 14. Javascript para detectar si el usuario cambia la pestaña
- 15. deshabilitar desplazamiento horizontal en jscrollpane
- 16. Cómo detectar la barra de desplazamiento vertical en un control DataGridView
- 17. jScrollPane desplazamiento en elemento arrastrar
- 18. Hacer visualización barras de desplazamiento cuando JScrollPane JList interior se cambia
- 19. Cómo deshabilito la barra de desplazamiento horizontal en un Panel
- 20. ¿Cambiar la posición de la barra de desplazamiento en TextBox?
- 21. Desplazamiento de la barra de desplazamiento del navegador
- 22. ¿Cómo hacer un menú emergente con la barra de desplazamiento?
- 23. Cómo detectar toques en la barra de estado
- 24. Para saber si un div tiene una barra de desplazamiento
- 25. WPF ¿Animación de activación cuando se cambia la visibilidad?
- 26. Deshabilitar la barra de desplazamiento del navegador
- 27. Tamaño JScrollPane que contiene JPanel cuando aparecen barras de desplazamiento
- 28. ¿Cómo puedo comprobar si la vista de desplazamiento está rebotando?
- 29. ¿Cómo determino la visibilidad de un control?
- 30. estilo de la barra de desplazamiento CSS3 en un div
Vale , extraño. Gracias por la rápida respuesta. Intenté eso y funciona, de hecho. Por desgracia, dentro de mi aplicación, agregar un detector de cambios no funciona. Trabajaré desde aquí. – xmjx
Por alguna extraña razón, los resultados de stdout y stderr no se muestran en el oyente. Así que básicamente era un problema de depuración. Gracias de nuevo. – xmjx