2015-03-02 85 views
1
JPanel panel = new JPanel(new GridLayout(0,1)); 
JScrollPane contentpane = new JScrollPane(panel); 
JButton add = new JButton("ADD"); 
add.actionListener(new ActionListener() { 
    public void actionPerformed(){ 
      MyPanel newpanel = new MyPanel("title","Button"); //MyPanel is a class which extends JPanel and contains constructor MyPanel(String TitleToSet ,String ButtonTitleTOAdd) 
      panel.add(newpanel); 
      panel.repaint(); 
    }) ; 
我已经使用这个代码,并认为这将MyPanel动态地添加到网格布局,如果添加了更多的“MyPanel”的“面板”将滚动

。然而,情况并非如此,第一个“MyPanel”填充了整个“面板”并增加了第二个“MyPanel”(通过单击按钮“Add”),第一个“MyPanel”被缩小以为第二个添加空间。 。在添加更多内容时,所有“MyPanel”都适合在视口中,而不是使“面板”可滚动。如何动态添加这些“MyPanel”,并在添加更多内容时使“面板”可滚动。任何帮助,将不胜感激。动态添加固定高度的面板以一个JScrollPane

回答

1

http://docs.oracle.com/javase/7/docs/api/javax/swing/JScrollPane.html

默认情况下,JScrollPane的使用ScrollPaneLayout使用处理的 其子组件的布局。 ScrollPaneLayout使用确定大小,以使在两种方式之一的 口的视图:

  1. [...]
  2. 的getPreferredSize被使用。

你应该行

panel.setPreferredSize(new Dimension(0, panel.getComponents().size() * SUB_PANEL_HEIGHT)); 

添加到您的ActionListener。

完整的示例:

package main; 

import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.Panel; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.Timer; 

class Test { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setPreferredSize(new Dimension(400, 400)); 
     frame.setSize(400, 400); 

     JPanel panel = new JPanel(new GridLayout(0, 1)); 
     panel.add(new JLabel("BOO")); 
     panel.add(new JButton("BBBB")); 

     JScrollPane contentpane = new JScrollPane(panel); 
     frame.add(contentpane); 

     new Timer(1000, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       JPanel newpanel = new JPanel(); 
       newpanel.add(new JLabel("LOL")); 
       panel.add(newpanel); 
       System.out.println(100 * panel.getComponents().length); 
       panel.setPreferredSize(new Dimension(0, 100 * panel.getComponents().length)); 
       contentpane.validate(); 
      } 
     }).start(); 

     frame.setVisible(true); 
    } 
} 
+0

谢谢,它的工作完美,,我甚至使用绝对布局尝试。但是,我不明白的部分,当你设置首选大小,为什么你设置面板的宽度0? [panel.setPreferredSize(new Dimension(0,100 * panel.getComponents()。length));] – 2015-03-03 05:04:23

+0

JScrollPane将视图宽度设置为max(view.getPreferredSize()。getWidth(),scrollPane.getWidth())。通过将视图的首选宽度设置为0,我确保滚动只发生在垂直方向。 – 2015-03-03 08:24:39