2013-01-11 2 views
1

상황에는 setViewportView를 호출 한 후 : 여러 개의 JPanel의 "itemPanels"데이터베이스에서 읽어 서로 (정보를 원하시면 아래 하나를 포함하는 JPanel "mainPanel"를 포함하는 JScrollPane "스크롤"가 그에 따라 생성 된 객체). 사용자는 기존 항목들 사이에 새로운 항목을 삽입 할 수 있습니다. 이 경우 새 항목이 데이터베이스에 추가되고 모든 구성 요소 ("itemPanels")가 다시 생성되어 새 "mainPanel"에 추가됩니다. 결국 "mainPanel"은 setViewPortView를 사용하여 scrollPane으로 설정됩니다. 어떻게됩니까피 JScrollPane의

Vector<JPanel> itemPanels = generateMyPanelsFromDB(); 
JPanel mainPanel = new JPanel(new GridBagLayout()); 
//.. layout stuff 
for(JPanel itemPanel: itemPanels) mainPanel.add(itemPanel,<gridbagconstraintsvar>); 
scrollPane.setViewportView(mainPanel); 

는 새로운 구성 요소가 올바르게 추가되고 있으며, 스크롤이 자동으로 끝까지 스크롤 것입니다.

어떻게하면 스크롤 막대가 끝까지 스크롤되는지 (이전의 위치는 그대로 유지됨) 피할 수 있습니까? 내가 뭘하려 :이 아무것도 (스크롤이 여전히 끝으로 스크롤보다 아무 일도 발생하지 않음)하지 않는

int currentPos = scrollPane.getVerticalScrollBar().getValue(); 
//.. to the setViewPortView stuff 
scrollPane.getVerticalScrollBar().setValue(value); 

:와 위의 작업을 둘러싸고 있습니다. 가 난 단지 다음과 같은 중첩 invokeLater로 다시 rescroll 관리, 그러나 이것은 올바른 방법이 될 수 없으며 또한 아래로 스크롤 방지하고 백업하지 않습니다 (= 상처 눈) 2012

final int value = scrollPane.getVerticalScrollBar().getValue(); 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      scrollPane.setViewportView(mainPanel); 
      Thread t = new Thread() { 
       public void run() { 
        try { 
         Thread.sleep(1); 
        } 
        catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
        javax.swing.SwingUtilities.invokeLater(new Runnable() { 
          public void run() { 
           scrollPane.getVerticalScrollBar().setValue(value); 
          } 
         }); 
       } 
      }; 
      t.start(); 
     } 
    }); 

추가 -01-14 :

public class DebugImportCommandEditPanel extends JPanel { 
private static final long serialVersionUID = 1L; 

private JScrollPane commandScrollPane; 

public DebugImportCommandEditPanel() { 
    this.setLayout(new BorderLayout()); 
    this.commandScrollPane = new JScrollPane(this.getMainPanel()); 
    this.add(this.commandScrollPane, BorderLayout.CENTER); 
} 

private JPanel getMainPanel() { 
    Vector<InnerPanel> innerPanels = new Vector<InnerPanel>(); 
    for(int i=0;i<12;i++) innerPanels.add(new InnerPanel((i+1)+ ".")); 

    JPanel mainPanel = new JPanel(new GridBagLayout()); 
    GridBagConstraints c = new GridBagConstraints(); 
    c.gridx=0;c.gridy=0;c.weightx=1;c.weighty=1;c.fill = GridBagConstraints.BOTH; 
    for(InnerPanel panel: innerPanels) { 
     mainPanel.add(panel,c); 
     c.gridy++; 
    } 
    return mainPanel; 
} 

class InnerPanel extends JPanel { 
    private static final long serialVersionUID = 1L; 

    protected InnerPanel(String number) { 
     this.setLayout(new BorderLayout()); 
     this.setBorder(BorderFactory.createTitledBorder("Inner Panel No. "+number)); 
     JTextPane textPane = new JTextPane(); 
     textPane.setText("Lorem ipsum dolor sit amet consectetuer tellus sociis sapien porttitor "+ 
         "Suspendisse. Mattis morbi eu In non ante convallis\n "+ 
         "tempus risus venenatis urna. Sed ipsum et parturient volutpat\n "+ 
         "adipiscing dolor quis adipiscing Donec odio.\n "+ 
         "Neque adipiscing pretium lacus Phasellus neque a vel sed wisi alique\n"+ 
         "t. Condimentum Sed pretium libero vitae facilisi pretium sit consequat a "+ 
         "tincidunt. Pharetra ac Aliquam."); 
     this.add(textPane,BorderLayout.CENTER); 
    } 
} 

}

+4

afair, 기본 동작은 맨 아래로 스크롤하지 않으므로 코드에서 무언가가 기본값에서 벗어납니다. 그것을 추적하려면 설명하는 행동을 SSCCE에게 보여주십시오. – kleopatra

+3

은 a.m. 의견에 동의하며 더 나은 도움을 위해 곧 [SSCCE] (http://sscce.org/), short, runnable을 게시하십시오. ('JPanels' == 하드 코드'PreferredSize')와 함께''JFrame'에 대해 컴파일 할 수 있습니다. – mKorbel

+0

Id는 SSCCE를 만들었습니다. (그것이 무엇을 의미하는지 모르겠지만, 여러분이 말하고있는 것 같습니다. 효과를 증명하기 위해 간단한 예제 프로그램에 대해) 그리고 나는 이것으로 끝까지 자동 스크롤이 없음을 확인할 수 있습니다. 나는 그것으로 더 많이보아야하고, outcomming으로 되돌아 갈 것이다. 고맙습니다! – Hotkey

답변

1

당신의 편집을보고 :이 중첩 된 JTextPane가 될 수있다 - 예기치 않게 (나에게, 적어도 :-), 그것은 affect the overall scrolling 행동도하지 않을 경우 직접 아이에게 보인다 뷰포트의 텍스트를 설정 전에 정책 을 설정해야

JTextPane tp = new JTextPane(); 
DefaultCaret caret = (DefaultCaret) tp.getCaret(); 
caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE); 
textPane.setText("Lorem ipsum dolor sit amet consectetuer tellus sociis sapien porttitor "+ 
    .... 

참고 :

방법 아웃 텍스트 설정에 업데이트하지 캐럿 정책을 구성하는 것입니다.

+0

고마워요! 그 트릭을 했어! – Hotkey