2012-08-24 48 views
6

我有一個JScrollPane,其中包含一個JPanel,它具有很大的高度,這個大的JPanel包含更多的Jpanels,就像在圖像中一樣。其中一些面板包含我用來顯示標題的JLabel。在頂部,有JLabel的標題標籤中的標題編號與數字匹配。我需要做的是,當我從頂部標籤列表中單擊標籤時,JScrollBar應該滾動到放置標籤的位置。如何滾動到JScrollPane中的特定位置

我不知道這是否可行,但如果有人知道如何滾動到JScrollPane中的特定位置,請協助我。

enter image description here

+1

我已經找到了解決方案,它運作良好,我所做的是,我得到的標題標籤,我需要的Y位置,然後調用follwing JScrollPane的,JScrollPane中的方法。 getViewport()。setViewPosition(new Point(0,[標頭標籤的Y位置])); – Harsha

回答

9

假設你想要包含的標題是可見的標籤,整個面板:

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

有沒有需要訪問含有視/滾動窗格除了(總有一個不同之處,不它:-)

  • 下,scrollRectToVisible是在調用的組件都有一個自定義實現(如網絡文本組件
  • 我˚F通過該方法達到的默認位置是達不到自己的喜好

編輯

一個代碼片段@MadProgrammer :-) - 但懶得刪除SwingX的一切痕跡,所以這裏我們去:

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

啊,我知道,絕對白癡在外面。我假設矩形是相對於滾動窗格。 <弓箭手> - 我將其添加到我的小黑皮書中。謝謝(現在我想刪除我的答案:P) – MadProgrammer

+0

ps我知道你不需要它,但+1 - 恥辱我不能投票更多;) – MadProgrammer

6

這是可行的。

您需要在標題中指向JLabel並在您的視圖中鏈接到的位置(JPanel)。一旦你有這個鏈接,你可能需要確定'JPanel'中JLabel的位置。

您可以使用JViewport.scrollRectToVisible(Rectangle)方法滾動到該位置。

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

或直接更改矩形 到JLabels界限 – mKorbel

+0

@mKorbel您是對的......如果在我的腦海中可能有移動視口的可能性,以便標籤出現在滾動窗格的底部......但顯然這只是一個瘋狂的話題:P – MadProgrammer

+1

-1表示過於複雜(tsss ...另一個極其粘性的錯誤;):label.scrollRectToVisible(label.getBounds())就是需要的。 – kleopatra

1

scrollRectToVisible dont't爲我工作。 但是,我解決了這個辦法:

AbstractNode a = pkmap.get(0); 
scroll.getVerticalScrollBar().setValue(a.getY()); 
scroll.getHorizontalScrollBar().setValue(a.getX()); 
相關問題