如何在运行时将JPanel添加到具有垂直滚动窗格的另一个JPanel中?

时间:2013-06-03 10:43:54

标签: java swing jpanel jscrollpane flowlayout

每次按下按钮,我都会尝试在运行时将新面板插入另一个面板。我的问题是原始面板空间不足,我看不到我正在添加的新面板。

到目前为止我尝试过:

  • 使用滚动窗格进行垂直滚动但没有成功。
  • 使用flowlayout - 没有运气。尝试禁用水平滚动 - 继续将新面板推向右侧(因为没有滚动而无法访问它)。
  • 尝试使用borderlayout - 没有运气。

testpanel t = new testpanel();
t.setVisible(true);
this.jPanel15.add(t);   
this.jPanel15.validate();
this.jPanel15.repaint();

此代码假设将t面板插入jpanel15。 使用flowlayout,它会向我推送t面板,就像我想要的那样但没有垂直滚动。

PS:我正在使用netbeans来创建我的GUI。

2 个答案:

答案 0 :(得分:1)

  

我的问题是原始面板空间不足,我无法看到我正在添加的新面板。尝试使用scrollpane进行垂直滚动但没有成功。

FlowLayout水平添加组件,而不是垂直添加组件,因此您永远不会看到垂直滚动条。相反,您可以尝试Wrap Layout

创建滚动窗格的基本代码是:

JPanel main = new JPanel( new WrapLayout() );
JScrollPane scrollPane = new JScrollPane( main );
frame.add(scrollPane);

然后,当你动态地将组件添加到主面板时,你会这样做:

main.add(...);
main.revalidate();
main.repaint(); // sometimes needed

答案 1 :(得分:0)

  1. 使用JScrollPane代替(外部)JPanel
  2. BorderLayout JPanelJScrollPane BorderLayout.CENTER作为唯一控件。 JScrollPane视为常规JPanel

  3. 在任何情况下,您都会将控件添加到JScrollPane。假设您的JScrollPane变量为spn,您要添加的控件是ctrl:

    // Creation of the JScrollPane: Make the view a panel, having a BoxLayout manager for the Y-axis
    JPanel view = new JPanel( );
    view.setLayout( new BoxLayout( view, BoxLayout.Y_AXIS ) );
    JScrollPane spn = new JScrollPane( view );
    
    // The component you wish to add to the JScrollPane
    Component ctrl = ...;
    
    // Set the alignment (there's also RIGHT_ALIGNMENT and CENTER_ALIGNMENT)
    ctrl.setAlignmentX( Component.LEFT_ALIGNMENT );
    
    // Adding the component to the JScrollPane
    JPanel pnl = (JPanel) spn.getViewport( ).getView( );
    pnl.add( ctrl );
    pnl.revalidate( );
    pnl.repaint( );
    spn.revalidate( );