2012-05-02 26 views
8

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?

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(); 
    } 
} 
+0

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

+0

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

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