JScrollPane不更新滚动条

时间:2012-11-20 16:29:38

标签: java swing user-interface jpanel jscrollpane

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

以下是AbstractAction添加和减去的两个按钮的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的中间人。对不起,如果我犯了一个非常明显的错误。

2 个答案:

答案 0 :(得分:6)

1)使用LayoutManager s(+1来@kleopatra和@GagandeepBali评论)

缺少LayoutManager只能保证你的GUI看起来很垃圾(尤其是在其他操作系统/构建版上运行时)并且作为新手你应该学习正确的方法,而不是学习错误的方法并陷入困境调用setSize()等习惯

阅读这些链接以便开始使用:

2)有关如何使用JScrollPane的信息,请参阅this example,只需将JPanel添加按钮JScrollPane,然后将JFrame添加到JScrollPane 1}}。

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

4)有关LayoutManager的详情,请查看此处:How to Use Scroll Panes

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

6)关于validate()

的使用情况
    将新JComponent添加到可见组件时使用
  • revalidate()

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

  • validate()也涵盖//add or remove component(s) revalidate(); repaint();

因此总是使用这个:

{{1}}

<强>参考文献:

答案 1 :(得分:1)

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面板的首选大小,然后将其用于滚动窗格。这与在添加infoS之前设置gui的尺寸和位置的原因相同:

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