2012-08-24 6 views
6

Ich habe eine JScrollPane, die eine JPanel enthält, die eine große Höhe hat, Diese große JPanel enthalten mehr Jpanels wie im Bild. Einige dieser Panels enthalten ein JLabel, mit dem ich Titel anzeigen konnte. Ganz oben befinden sich JLabels, deren Nummern den Titelnummern in den Titelbezeichnungen entsprechen. Was ich tun muss, ist, wenn ich auf ein Label aus der oberen Label-Liste klicke, sollte die JScrollBar zu der Position scrollen, wo dieses Label platziert wird.So scrollst du zu einer bestimmten Stelle in einem JScrollPane

Ich weiß nicht, ob das möglich ist oder nicht, aber wenn jemand weiß, wie man zu einer bestimmten Position in einem JScrollPane scrollt, bitte assistiere mir.

enter image description here

+1

ich eine Lösung gefunden haben und es funktioniert gut, was ich tue, ist habe ich die Y-Position des Kopf Etikett bekommen ich brauche, und rufen Sie dann follwing Methode des JScrollPane, JScrollPane. getViewport(). setViewPosition (neuer Punkt (0, [Y-Position des Header-Labels])); – Harsha

Antwort

9

Vorausgesetzt, dass Sie die ganze Platte wollen, dass das Etikett enthält als Titel sichtbar sein:

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

Es gibt keine Notwendigkeit, das enthält Ansichtsfenster/scrollPane außer für den Zugriff auf (es gibt immer außer ein, nicht ist es :-)

  • die Komponente der scrollRectToVisible auf aufgerufen wird, hat eine Implementierung kundenspezifische (wie fi Textkomponenten
  • i f die Standardposition mit dieser Methode erreicht ist nicht bis zu einer Vielzahl von Design

bearbeiten

ein Code-Snippet für @MadProgrammer :-) - aber zu faul, jede Spur von SwingX zu entfernen, so dass hier wir gehen:

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, ich sehe, auf jeden Fall Idiot auf der Außenseite. Ich nahm an, dass das Rechteck relativ zum Bildlauffenster war. - Ich füge das meinem kleinen schwarzen Trickbuch hinzu. Danke (jetzt möchte ich meine Antwort löschen: P) – MadProgrammer

+0

PS Ich weiß, du brauchst es nicht, aber +1 - Schande, ich kann nicht mehr wählen;) – MadProgrammer

6

Es ist machbar.

Sie benötigen einen Verweis auf die JLabel in der Kopfzeile und wo es in Ihrer Ansicht verknüpft (JPanel). Sobald Sie diesen Link haben, müssen Sie den Speicherort der JLabel innerhalb der 'JPanel' bestimmen.

Sie können die Methode JViewport.scrollRectToVisible(Rectangle) verwenden, um zu dieser Position zu scrollen.

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

oder ändern Rectangle direkt zu JLabels Grenzen – mKorbel

+0

@mKorbel Sie haben Recht ... Hatte es in meinem Kopf, dass die Möglichkeit haben könnte, das Ansichtsfenster zu verschieben, so dass die Beschriftung am unteren Rand des Bildlaufbereichs angezeigt würde ... aber offensichtlich ist das nur verrückt reden: P – MadProgrammer

+1

-1 für übermäßig kompliziert (tsss ... noch ein weiterer Fall eines extrem sticky Fehler;): label.scrollRectToVisible (label.getBounds()) ist alles was benötigt wird .. – kleopatra

1

scrollRectToVisible funktioniert nicht für mich. Aber, löste ich auf diese Weise:

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