【问题标题】:Problems with JScrollPane -- Trying to Update it on Model ChangesJScrollPane 的问题——尝试在模型更改时更新它
【发布时间】:2013-03-12 17:39:24
【问题描述】:

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

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

【问题讨论】:

  • 您要将ArrayLists 的这些值添加到Swing 的哪个组件??
  • 向 ArrayList 添加字符串(课程名称),打印调用正确显示为 [string1、string2 等]。这就是我知道 ArrayList 没问题的方式。
  • view.getNameField() 正在返回一个 JTextArea 对象。对吗??
  • JTextField。那部分是无关的。
  • view.getNameField()这个方法返回什么?

标签: java swing arraylist jscrollpane


【解决方案1】:

编辑
如果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);
}

【讨论】:

  • 此解决方案将学生姓名放入 JScrollPane,而不是已注册课程的列表中......它有效,但不是预期的结果。
  • model.getCurrentStudentCourses() 这个方法返回什么?
  • +1 试图理解这个问题。 @clappboard,然后修复代码以执行您想要的操作。您已经获得了一种方法,即创建一个组件来显示您想要显示的数据。然后将该组件添加到视口的视图中。您对问题的描述非常令人困惑,因此请理解该建议并将其微调到您的确切要求。我们不知道您的方法返回什么样的数据。
  • 我很抱歉给我带来了麻烦。我一直在急于让代码运行,并且在此过程中我已经对其进行了相当多的更改。如果我的回答简短或粗鲁,那只是快速的必要性。我非常感谢我得到的所有答案和帮助。将此标记为解决方案,因为它解决了问题并且运行良好。编辑:我同意。 +1 @VishalK。我原来的帖子是分散的。当我有时间帮助别人时,我会编辑它。
  • @clappboard: 因为这是你在这个网站上的第一个帖子(问题)..所以我能理解你的急切和匆忙......总是建议在问卷中发布小,短,编译并运行可理解的代码..让我们清楚地了解您的问题并为您提供相关且有用的答案..
【解决方案2】:

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

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

【讨论】:

  • 这很好。我使用了错误的方法,但它仍然要求我提供Component,而不是 ArrayList。我想我会做一个 JLabels 数组?
  • 我认为建议已经使用 JList 或 JTextArea。制作一个 JLabels 数组没有任何作用,因为数组不是组件。
猜你喜欢
  • 2020-09-10
  • 2016-11-10
  • 2021-07-05
  • 2021-07-16
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多