2013-03-22 58 views
0

我正在編寫一個相當複雜的程序,因此我只會嘗試僅就問題出現的位置進行解釋。JScrollPane的問題 - 試圖在模型更改上更新它

在我看來,我創建一個JScrollPane顯示,一個學生註冊課程列表:

registeredPane = new JScrollPane(); registeredPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
registeredPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
c.gridx = 2; 
c.gridwidth = 1; 
c.gridheight = 2; 
c.weightx = 1; 
c.weighty = 1; 
c.fill = GridBagConstraints.BOTH; 
layout.setConstraints(registeredPane, c); 

然後我,在我的控制器,改變模型,以反映課程當前活躍的學生通過調用在我的模型這個函數註冊:

public void updateCurrentStudentCourses() { 
ArrayList<String> courseNames = new ArrayList<String>(); 

for (Course c: currentStudent.getRegCourses()) { 
courseNames.add("" + c.getDepartment().getId() + c.getCode()); 
} 

System.out.println(courseNames); 
} 

然後我,又在我的控制器,更新視圖,以反映添加 的ArrayList到JScrollPane的這些變化:

public void updateView() { 
view.getNameField().setText(model.getCurrentStudent().getName()); 

view.getRegisteredPane().removeAll(); 
view.getRegisteredPane().getViewport().add(model.getCurrentStudentCourses()); 
view.getRegisteredPane().repaint(); 
} 

滾動條消失,但就是這樣。列表項(我知道在ArrayList中)不顯示。我究竟做錯了什麼?

+0

要將'Swing'的哪個組件添加到'ArrayLists'的那些值? – 2013-03-22 18:41:46

+0

對於ArrayList,我添加了打印調用顯示爲[string1,string2等]的字符串(課程名稱)。這就是我知道ArrayList是好的。 – clappboard 2013-03-22 18:45:02

+0

'view.getNameField()'返回一個'JTextArea'對象。對?? – 2013-03-22 18:46:29

回答

4

編輯
如果model.getCurrentStudentCourses()是返回一個ArrayList,那麼你可以把ArrayList內容中JTextArea然後設置JScrollPaneviewport到是JTextArea。您可以進行如下操作: 你updateView()方法應該是這樣的:

JTextArea ta = new JTextArea(30,100); 
public void updateView() { 
    ta.setText(""); 
    for (String course : model.getCurrentStudentCourses()) 
    ta.append(course+"\n"); 
    view.getNameField().setText(model.getCurrentStudent().getName()); 
    view.getRegisteredPane().setViewportView(ta); 
} 
+0

此解決方案將學生名稱放入JScrollPane,而不是註冊課程列表......它的工作原理,但不是所需的結果。 – clappboard 2013-03-22 19:12:05

+0

'model.getCurrentStudentCourses()'這個方法返回什麼? – 2013-03-22 19:13:06

+1

+1爲了解這個問題。 @clappboard,然後修復代碼以做你想做的事。您已經獲得了一種方法,即創建一個組件來顯示要顯示的數據。然後,將該組件添加到視口的視圖中。你對這個問題的描述非常混亂,因此理解這個建議並且將它精確地調整到你的確切要求。我們不知道你的方法返回什麼樣的數據。 – camickr 2013-03-22 19:44:02

1

要設置滾動窗格的視圖中,使用setViewportView()。直接操作scrollpane的子組件會導致問題(例如,您也將刪除滾動條)。

Scrollpanes有自己的佈局管理器,它只知道由scrollpane(各種視口,滾動條,角落)創建的組件。因此,除非您手動設置其位置,否則不會顯示您添加的任何組件。

+0

這很好。我使用了錯誤的方法,但它仍然要求我提供一個'Component',而不是一個ArrayList。我想我會製作一個JLabels數組? – clappboard 2013-03-22 19:05:04

+0

我認爲這個建議已經使用JList或JTextArea。製作JLabel數組不做任何事情,因爲數組不是組件。 – camickr 2013-03-22 19:46:22