0

我正在编写一个相当复杂的程序,所以我将尝试仅根据问题发生的位置来解释它。

在我看来,我创建了一个 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 中)。我究竟做错了什么?

4

2 回答 2

4

编辑
如果model.getCurrentStudentCourses()返回 anArrayList那么您可以将 inside 的ArrayList内容JTextArea设置viewportJScrollPanethat 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);
}
于 2013-03-22T18:45:47.683 回答
1

要设置滚动窗格的视图,请使用setViewportView()。直接操作滚动窗格的子组件会导致问题(例如,您还要移除滚动条)。

滚动窗格有自己的布局管理器,它只知道滚动窗格创建的组件(各种视口、滚动条、角)。因此,除非您手动设置其位置,否则您添加的任何组件都不会出现。

于 2013-03-22T18:57:58.007 回答