0

我正在尝试创建一个JScrollPane包含JPanel高度增加和减少的高度。JScrollPane当它变得比JPanel. 但是,我很难做到这一点。是的,我知道我没有使用LayoutManagers。不,我不会使用它们,我需要一个不涉及它们使用的解决方案。

下面是两个 button 的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 的中级。对不起,如果我犯了一个明显的错误。

4

2 回答 2

6

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

没有LayoutManagers 只能保证你的 GUI 看起来很垃圾(尤其是在其他操作系统/构建上运行时),作为新手,你应该学习正确的方法而不是学习错误的方法并养成像调用setSize()等坏习惯。

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

2)请参阅此示例以了解如何使用 a JScrollPane,它只是将JPanel带有按钮的 a 添加到 aJScrollPane中,然后将其添加到JFrame.

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

4) 有关JScrollPanes 的更多信息,请查看:如何使用滚动窗格

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

6)关于您的使用validate()

  • validate()当 newJComponent被添加到可见组件时使用

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

  • revalidate()validate()也涵盖

因此总是使用这个:

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

参考:

于 2012-11-20T17:57:15.217 回答
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设置面板的首选大小。这与在添加到 之前设置大小和位置的原因相同:infoSgui

infoS.setLocation(10,80);
infoS.setSize(420,490);
gui.add(infoS); // gui is the frame's content pane (the overall JPanel)
于 2013-04-09T21:38:16.207 回答