java - JScrollPane 不更新滚动条

标签 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 方面只是中级。抱歉,如果我犯了一个非常明显的错误。

最佳答案

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

缺少 LayoutManager 只会保证您的 GUI 看起来非常垃圾(尤其是在其他操作系统/版本上运行时),并且作为新手,您应该学习正确的方法而不是学习错误的方法,养成坏习惯,例如调用 setSize() 等。

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

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

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

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

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

6) 关于 validate() 的使用:

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

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

  • revalidate() 也涵盖了 validate()

因此请始终使用此:

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

引用文献:

关于java - JScrollPane 不更新滚动条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13477645/

相关文章:

css - 背景颜色不会出现在列表项后面

jquery - 导航子菜单悬停在触摸屏上

java - JPA getResultList() 为 MySQL 返回 BigInteger 但为 Microsoft SQL Server 返回 Integer

java - 了解适配器设计模式的实用性

java - 添加在 @PrepareForTest 中编写 Junit 的类可以使 Sonar 覆盖率为零

java - 如何通过不同的类访问对象方法?

java - 如何在 java spinner 中将 1000 显示为 1.000

一旦按下按钮,Java 键事件就不会执行

c++ - 类 git 界面的最佳方法

java - 显示 NatTable 上下文菜单