JScrollPane不更新滚动条

Thr*_*oot 0 java user-interface swing jpanel jscrollpane

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

这是两个按钮的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();
      }
Run Code Online (Sandbox Code Playgroud)

以下是主要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)
Run Code Online (Sandbox Code Playgroud)

这是我一直在努力学习GUI的第二个项目.我是Swing的一个完整的新手,我只是Java的中间人.对不起,如果我犯了一个明显的错误.

Dav*_*amp 6

1)使用LayoutManagers(+1到@kleopatra和@GagandeepBali评论)

LayoutManagers 的缺失只能保证你的GUI看起来很垃圾(特别是在其他操作系统/构建版本上运行时)并且作为一个新手,你应该学习正确的方法,而不是学习错误的方法并养成诸如调用之类的坏习惯setSize().

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

2)请参阅此示例了解如何使用a JScrollPane,它只需添加一个JPanel带按钮,JScrollPane然后将其添加到JFrame.

3)另请参阅此示例,了解如何JScrollPane 仅使垂直滚动.

4)有关详细信息,请JScrollPane查看此处:如何使用滚动窗格.

5)至于它如何与之交互LayoutManager,如果你没有通过滚动窗格显式设置它的大小,setPreferredSize(Dimension d) 则根据它的九个组件(视口,如果存在,两个滚动条,行和列)的首选大小计算它标题和四个角)

6)关于你的用法validate():

  • validate()将新JComponents添加到可见组件时使用

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

  • revalidate()也涵盖validate()

因此总是使用这个:

//add or remove component(s)
revalidate();
repaint();
Run Code Online (Sandbox Code Playgroud)

参考文献: