2015-07-03 42 views
0

我有一個ScrollPane的JList。當我按下一個按鈕時,新的一行被添加到JList.But問題是它不會滾動到最後一個元素,而是倒數第二個元素。這是一部分使用的代碼:沒有錯誤。除此之外,一切都很好。JList與ScrollPane自動滾動錯誤

DefaultListModel<String> model = new DefaultListModel<String>(); 
JList<String> list = new JList<String>(model); 
JPanel panel = new JPanel(new GridLayout(0,1)); 
panel.add(list); 
scroll = new JScrollPane(panel); 
JPanel p = new JPanel(new BorderLayout()); 
p.add(scroll, BorderLayout.CENTER); 
p.add(buttonPanel, BorderLayout.SOUTH); // here are more button's including the one with the action described below 

public void actionPerformed(ActionEvent e) { 
     list.setFont(new Font("Times new Roman", Font.PLAIN, 30));  
     model.add(list.getModel().getSize(), "Some text randomly"+ i++);   
     panel.repaint();panel.revalidate();  
     scroll.getVerticalScrollBar().setValue(scroll.getVerticalScrollBar().getMaximum()); 
} 
+0

我覺得這個方法結束後的實際重繪發生。嘗試使用'SwingUtilities.invokeLater()'像這樣調用最後一行:'SwingUtilities.invokeLater(new Runnable(){public void run(){scroll.getVerticalScrollBar()。setValue(scroll.getVerticalScrollBar()。getMaximum()) ;}});'(在Java 8中,您可以使用Lambda表達式使此語句更小且更易讀) – gogognome

+0

它給出了此行上的標記語法錯誤:scroll.getVerticalScrollBar()。setValue(scroll.getVerticalScrollBar() .getMaximum()); – Axl

+0

您是否複製並粘貼了代碼?我確實在代碼中某處出現了無效的字符,只需手動輸入代碼,是的,括號內有一些無效的不可見字符'getMaximum'之後,如果你直接複製並粘貼代碼,不知道這些代碼是從哪裏來的,我只是複製並粘貼了代碼示例中的代碼。 – gogognome

回答

0

我認爲實際重新繪製發生在此方法結束後。嘗試調用使用SwingUtilities.invokeLater()這樣的最後一行:

SwingUtilities.invokeLater(new Runnable() { public void run() { 
     scroll.getVerticalScrollBar().setValue(scroll.getVerticalScrollBar().getMaximum(‌)); 
    } 
}); 

謹防而複製粘貼此到IDE中:有在未在Java允許的HTML隱藏字符(零寬不連字)碼。只需在getMaximum()之後刪除大括號之間的所有內容即可。

(在Java 8可以使用Lambda表達式,使這個說法更小,更好的可讀性。)