상황에는 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);
}
}
}
afair, 기본 동작은 맨 아래로 스크롤하지 않으므로 코드에서 무언가가 기본값에서 벗어납니다. 그것을 추적하려면 설명하는 행동을 SSCCE에게 보여주십시오. – kleopatra
은 a.m. 의견에 동의하며 더 나은 도움을 위해 곧 [SSCCE] (http://sscce.org/), short, runnable을 게시하십시오. ('JPanels' == 하드 코드'PreferredSize')와 함께''JFrame'에 대해 컴파일 할 수 있습니다. – mKorbel
Id는 SSCCE를 만들었습니다. (그것이 무엇을 의미하는지 모르겠지만, 여러분이 말하고있는 것 같습니다. 효과를 증명하기 위해 간단한 예제 프로그램에 대해) 그리고 나는 이것으로 끝까지 자동 스크롤이 없음을 확인할 수 있습니다. 나는 그것으로 더 많이보아야하고, outcomming으로 되돌아 갈 것이다. 고맙습니다! – Hotkey