2012-08-24 21 views
6

Tengo un JScrollPane que contiene un JPanel que tiene una gran altura, Este gran JPanel contiene más Jpanels como en la imagen. Algunos de esos paneles contienen un JLabel que solía mostrar títulos. En la parte superior, hay JLabels que tienen números que coinciden con los números de título en las etiquetas de título. Lo que tengo que hacer es que cuando hago clic en una etiqueta de la lista de etiquetas superior, JScrollBar debe desplazarse a la posición donde se coloca esa etiqueta.Cómo desplazarse a una ubicación específica en un JScrollPane

No sé si esto es posible o no, pero si alguien sabe cómo desplazarse a una posición específica en un JScrollPane, por favor, ayúdeme.

enter image description here

+1

He encontrado una solución y funciona bien lo que hice es, tengo la posición Y de la etiqueta de cabecera que necesito y luego llamar al método de la JScrollPane, JScrollPane siguientes aparatos. getViewport(). setViewPosition (punto nuevo (0, [posición Y de la etiqueta del encabezado])); – Harsha

Respuesta

9

Suponiendo que desea todo el panel que contiene la etiqueta como el título sea visible:

Container parent = titleLabel.getParent(); 
parent.scrollRectToVisible(parent.getBounds()); 

No hay necesidad de acceder a la ventana gráfica que contiene/scrollPane excepción (siempre hay una excepción, ¿no él :-)

  • el componente de la scrollRectToVisible se invoca en cuenta una implementación personalizada (como componentes de texto fi
  • i f la ubicación predeterminada alcanzado por este método no es a su gusto

Editar

un fragmento de código para @MadProgrammer :-) - pero demasiado perezoso para eliminar todo rastro de SwingX, asi que aquí vamos:

final JLabel last = new JLabel("I'm the last"); 

int maxRow = 20; 
int maxColumn = 10; 

JComponent content = new JPanel(new GridLayout(maxRow, maxColumn)); 
for (int row = 0; row < maxRow; row++) { 
    for (int column = 0; column < maxColumn; column++) { 
     JComponent parent = new JPanel(); 
     JLabel label = new JLabel("i'm in " + row + "/" + column); 
     if (row == (maxRow - 1) && column == (maxColumn - 1)) { 
      label = last; 
      last.setBorder(BorderFactory.createLineBorder(Color.RED)); 
     } 
     parent.add(label); 
     content.add(parent); 
    } 
} 
JXFrame frame = wrapWithScrollingInFrame(content, "scroll"); 
Action action = new AbstractAction("scrollLastVisible") { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     last.scrollRectToVisible(last.getBounds()); 
    } 
}; 
addAction(frame, action); 
show(frame, frame.getPreferredSize().width/2, frame.getPreferredSize().height/2); 
+0

Ahh, ya sé, definitivamente idiota por fuera. Suponía que el rectángulo era relativo al panel de desplazamiento. - Añadiré eso a mi pequeño libro negro de trucos. Gracias (ahora tengo ganas de borrar mi respuesta: P) – MadProgrammer

+0

ps Sé que no lo necesitas pero +1 - lástima que no puedo votar por más;) – MadProgrammer

6

Es factible.

Necesitará una referencia al JLabel en el encabezado y al que enlaza en su vista (JPanel). Una vez que tenga este enlace, puede necesitar determinar la ubicación del JLabel dentro del 'JPanel'.

Puede utilizar el método JViewport.scrollRectToVisible(Rectangle) para desplazarse a esa ubicación.

JLabel labelInPane = //... reference lookup 
Rectangle bounds = labelInPane.getBounds(); 
// You may need to convert the point to meet the requirements of the parent container... 
// bounds.setLocation(SwingUtilities.convertPoint(labelInPane, bounds.getPoint(), topLevelParentPaneInScrollPane)); 

scrollPane.getViewport().scrollRectToVisible(bounds); 
+1

o cambie Rectángulo directamente a JLabels bounds – mKorbel

+0

@mKorbel Tienes razón ... Tenía en la cabeza que podría tener la posibilidad de mover la ventana gráfica para que la etiqueta apareciera en la parte inferior del panel de desplazamiento ... pero obviamente eso es solo una locura: P – MadProgrammer

+1

-1 por demasiado complicado (tsss ... otro caso más de un error extremadamente pegajoso;): label.scrollRectToVisible (label.getBounds()) es todo lo que se necesita. – kleopatra

1

scrollRectToVisible no funciona para mí. Pero, he resuelto de esta manera:

AbstractNode a = pkmap.get(0); 
scroll.getVerticalScrollBar().setValue(a.getY()); 
scroll.getHorizontalScrollBar().setValue(a.getX()); 
Cuestiones relacionadas