【问题标题】:JScrollPane does not update scrollbarJScrollPane 不更新滚动条
【发布时间】:2012-11-20 16:29:37
【问题描述】:

我正在尝试创建一个JScrollPane,其中包含一个高度会增加和减少的JPanel。当它变得大于JScrollPane 的大小时,它应该创建一个垂直滚动条,允许我滚动整个JPanel。但是,我很难做到这一点。是的,我知道我没有使用LayoutManagers。不,我不会使用它们,我需要一个不涉及它们使用的解决方案。

这是两个按钮的AbstractActions,它们对JPanel进行加减运算:

class AddACT extends AbstractAction
    {
      public void actionPerformed(ActionEvent e)
      {
        info.setSize(420,info.getHeight() + 40);
        info.add(new SubPanel); // Adds another JPanel into the main JPanel (for content input)
        gui.repaint();
        infoS.validate();
      }
    }

class RemoveACT extends AbstractAction
    {
      public void actionPerformed(ActionEvent e)
      {
        info.remove(subPanel()); // This would remove the last JPanel added to the main JPanel
        info.setSize(420,info.getHeight() - 40);
        gui.repaint();
        infoS.validate();
      }

这是主 JPanel 和 JScrollPane 的代码:

final JPanel info = new JPanel();
final JScrollPane infoS = new JScrollPane(info, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);  
info.setLayout(null);
info.setSize(420,600);
infoS.setLocation(10,80);
infoS.setSize(420,490);
gui.add(infoS); // gui is the frame's content pane (the overall JPanel)

这是我尝试通过实践学习 GUI 的第二个项目。我是 Swing 的完全新手,并且只是 Java 的中级。抱歉,如果我犯了一个非常明显的错误。

【问题讨论】:

  • -1 是的,我知道我没有使用布局管理器。不,我不会使用它们耸耸肩,你坚持要浪费时间;-)
  • 使用布局管理器是完全绝对必要的吗?我希望这不是必需的,并且就像 Java 中的大多数事情一样,还有其他方法可以做到这一点。
  • @Thrfoot : A quote from Java Docs "虽然可以不用布局管理器,但如果可能的话,你应该使用布局管理器。布局管理器让你更容易适应与外观和感觉相关的组件外观、不同的字体大小、容器不断变化的大小以及不同的语言环境。布局管理器也可以很容易地被其他容器以及其他程序重用。” .
  • 好吧,看来我别无选择。如果我要使用布局管理器(可能是 BoxLayout,用于制作垂直列表),我需要更改哪些内容(除了 setSizesetPreferredSize 这样的明显更改)?我真的不确定 JScrollPane 如何与布局管理器交互,并且之前从未真正使用过布局管理器。

标签: java swing user-interface jpanel jscrollpane


【解决方案1】:

1) 使用LayoutManagers(+1 给@kleopatra 和@GagandeepBali cmets)

没有LayoutManagers 只能保证你的 GUI 看起来很垃圾(尤其是在其他操作系统/版本上运行时),作为新手,你应该学习正确的方法而不是学习错误的方法并养成像这样的坏习惯打电话给setSize()

阅读这些链接以帮助您入门:

2) 请参阅this example 了解如何使用JScrollPane,它只需将带有按钮的JPanel 添加到JScrollPane,然后将其添加到JFrame

3) 另请参阅 this example 了解如何使 JScrollPane 仅可垂直滚动。

4) 有关JScrollPanes 的更多信息,请查看此处:How to Use Scroll Panes

5) 至于它如何与LayoutManager 交互,如果您没有通过setPreferredSize(Dimension d) 明确设置它的大小滚动窗格会根据其九个组件的首选大小(视口和,如果存在,两个滚动条、行和列标题以及四个角)

6) 关于您对validate()的使用:

  • validate() 用于将新的JComponents 添加到可见组件中

  • revalidate() 用于从可见组件中删除/添加JComponent

  • revalidate() 也覆盖了validate()

因此总是使用这个:

//add or remove component(s)
revalidate();
repaint();

参考资料:

【讨论】:

    【解决方案2】:

    LayoutManager 不是解决问题所必需的。 Thrfoot 示例中的问题在于以下几行:

    final JScrollPane infoS = new JScrollPane(info, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);  
    info.setLayout(null);
    info.setSize(420,600);
    

    程序似乎认识到需要滚动条(如果您的设置为VERTICAL_SCROLLBAR_AS_NEEDED,它将显示滚动条),但实际滚动不起作用(滚动条滑块不存在)。

    要解决此问题,首先设置info首选大小,然后构造infoS

    例子:

    info.setPreferredSize(420,600);
    final JScrollPane infoS = new JScrollPane(info, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    

    这个想法是设置info 面板的首选大小它用于滚动窗格。这与在添加到gui 之前设置infoS 的大小和位置的原因相同:

    infoS.setLocation(10,80);
    infoS.setSize(420,490);
    gui.add(infoS); // gui is the frame's content pane (the overall JPanel)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多