【问题标题】:Scroll not happening for my Jlists我的 Jlist 没有滚动
【发布时间】:2015-03-26 14:14:28
【问题描述】:

我使用 windowbuilder 创建了一个应该是联系人列表的 GUI。有两个列表:一个是联系人,另一个是号码。当您选择一个联系人时,他的号码将出现。 但是,当我添加很多联系人时,滚动条不会像我的朋友那样自动出现,所以我尝试添加一个 JScrollPane。还是不行。

原来是这样的:

    DefaultListModel contact = new DefaultListModel();  
    JList contacts = new JList(contact);
    contacts.setBounds(22, 64, 186, 135);

    contentPane.add(contacts);

这是我尝试过的:

    DefaultListModel contact = new DefaultListModel();  
    JList contacts = new JList(contact);
    contacts.setBounds(22, 64, 186, 135);
    JScrollPane scrollPane1 = new JScrollPane(contacts);


    contentPane.add(contacts);
    contentPane.add(scrollPane1, BorderLayout.WEST);

然后我也尝试将边界添加到滚动面板:

    DefaultListModel contact = new DefaultListModel();  
    JList contacts = new JList(contact);
    contacts.setBounds(22, 64, 186, 135);
    JScrollPane scrollPane1 = new JScrollPane(contacts);
    scrollPane1.setBounds(22, 64, 186, 135);


    contentPane.add(contacts);
    contentPane.add(scrollPane1, BorderLayout.WEST);

当我删除 'contacts.setBounds(22, 64, 186, 135);' 时,列表停止工作。

我也试过没有最后一行,我尝试只有最后一行而不是倒数第二行,我尝试添加“scrollPane1.setViewportView(contacts);”,我尝试删除“BorderLayout.WEST”所有其他尝试的论点,所以我基本上尝试了我可以在互联网上找到的所有“解决方案”组合

我不知道发生了什么,也不知道如何解决它。我只想通过滚动查看我的所有联系人。

编辑,已解决:

问题是我的面板被声明为 contentPane.setLayout(null);因此“BorderLayout.WEST”是不必要的。此外,边界应该应用于滚动窗格,而不是列表。最后,我不应该在面板中使用 add(contacts)。解决方案是:

    DefaultListModel contact = new DefaultListModel();  
    JList contacts = new JList(contact);        
    JScrollPane scrollPaneContact = new JScrollPane(contacts);
    scrollPaneContact.setBounds(22, 64, 186, 135);
    contentPane.add(scrollPaneContact);

我正在更新以防有人遇到类似问题。

【问题讨论】:

  • 尝试设置此属性 scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 并且在添加 ScrollPane 时也无需添加联系人列表
  • I removed everything that was not interesting for the question,按钮与问题无关。标签与问题无关。你没有听过给出的建议:1)你不需要使用“scrollbar_always”,2)你不应该使用 setBounds(),3)你应该使用布局管理器。修复这些问题,然后在论坛中发布代码,而不是在 Dropbox 上。您第一次可以发布代码,所以第二次再弄明白。
  • 感谢您的帮助,请您不要那么粗鲁。我没有时间进行您建议的更改,Yoda 询问了我发布的完整代码,并且“不感兴趣”是指向其他类的所有链接,因为所有功能/按钮都已实现。现在是凌晨 3 点 AU,所以我不会在这里度过余下的夜晚,为每条线路添加 4 个空格,这样它就可以工作了。如果我在帮助某人,我不介意点击禁止下载链接。因此,再次感谢您的建议,我会在醒来后尽快实施,但请不要对这个社区无礼。
  • 我的评论更有力,因为您显然忽略了我在回答中提出的每一个建议。当有人提出建议时,您应该花时间阅读和理解这些建议,而不是忽略它们。作为论坛的新手,从您获得的建议中学习并花更多时间修复代码,而不是发布不必要的 cmets。我给你的建议是社区的指导方针。顺便说一句,你所在的时间无关紧要。如果您希望我们阅读代码,那么代码应该具有正确的格式和可读性,就像在您的计算机上一样。
  • @LauraMartins 作为社区成员,您应该“接受”有助于解决问题的答案(通过单击答案旁边的复选标记),以便社区的其他成员知道问题所在已解决。我注意到您也没有“接受”您其他问题的答案。

标签: java swing jscrollpane jlist windowbuilder


【解决方案1】:

您需要使用适当的构造函数为JScrollPane 设置策略。

JScrollPane(组件视图,int vsbPolicy,int hsbPolicy) 创建一个 JScrollPane,在视口中显示视图组件,其视图位置可以通过一对滚动条进行控制。

例如:

   new JScrollPane(COMPONENT, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

编辑:

 DefaultListModel model = new DefaultListModel();  
    JList contactsList = new JList(model);
    JScrollPane scrollPane1 = new JScrollPane(contactsList, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

【讨论】:

  • 按照您的建议尝试了,不幸的是它也没有用。但是感谢您的尝试 =)
  • 正是我所做的。我觉得奇怪的是,当我删除列表的 bouds 时停止工作/显示,所以我认为错误可能与此有关。
  • 您不需要指定策略。默认是根据需要显示滚动条。只要您使用布局管理器,滚动条就会按预期工作。
【解决方案2】:
JScrollPane scrollPane1 = new JScrollPane(contacts);
//contentPane.add(contacts); // get rid of this
contentPane.add(scrollPane1, BorderLayout.WEST);

首先将联系人 JList 添加到滚动窗格的视口中,这是正确的。

但是你直接将联系人添加到框架中,这是错误的。一个组件只能有一个父级。通过将联系人 JList 添加到框架中,您可以将其从滚动窗格中删除。

另外,不要使用空布局,也不要使用 setBounds(...)。 Swing 旨在与Layout Managers 一起使用。

如果您需要更多帮助,请发布正确的SSCCE 来说明问题。每个问题都应包含SSCCE

【讨论】:

  • 我通过添加don't use a null layout 使我的答案更加清晰。当我说don't use setBounds()Swing was designed to be used with Layout Managers 时,这是暗示的。滚动条仅适用于布局管理器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多