2013-03-22 55 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