我正在编写一个相当复杂的程序,因此我将尝试仅根据问题发生的位置来解释它。
在我看来,我创建一个 JScrollPane 来显示学生注册的类(class)列表:
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);
然后,我在 Controller 中通过调用模型中的此函数来更改模型以反射(reflect)当前活跃学生注册的类(class):
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);
}
然后,我再次在 Controller 中通过添加以下内容来更新 View 以反射(reflect)这些更改 ArrayList 到 JScrollPane:
public void updateView() {
view.getNameField().setText(model.getCurrentStudent().getName());
view.getRegisteredPane().removeAll();
view.getRegisteredPane().getViewport().add(model.getCurrentStudentCourses());
view.getRegisteredPane().repaint();
}
滚动条消失了,但仅此而已。列表项(我知道在 ArrayList 中)不会显示。我做错了什么?
最佳答案
编辑
如果 model.getCurrentStudentCourses()
返回一个 ArrayList
那么您可以将 ArrayList
的内容放入 JTextArea
中,然后将 JScrollPane
的 viewport
设置为 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);
}
关于java - JScrollPane 的问题——尝试在模型更改时更新它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15577560/