我正在尝试创建一个 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/