import javax.swing.*;
import java.awt.Dimension;
import java.awt.FlowLayout;public class LayoutTest extends JFrame {

public LayoutTest() {
setSize(300, 300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} public static void main(String[] args) {
LayoutTest test = new LayoutTest();
JPanel panel = new JPanel(new FlowLayout());
JScrollPane scroll = new JScrollPane(panel);
panel.setPreferredSize(new Dimension(200, 200));

for(int i = 0; i < 1000; i++) {
panel.add(new JLabel("标签 " + i));
}

panel.validate();
panel.repaint();
test.add(scroll);
}
}这里如果我注释掉panel.setPreferredSize(new Dimension(200, 200));的话,滚动条可以出现,不过所有的label都在一行显示,可是我想要label在面板初始大小进行换行,这样的话设定上固定大小,滚动条又不能出现,会导致面板显示区域外的所有内容都不可见。这个问题需要怎么解决,急!!!!!!

解决方案 »

  1.   

    你这例子对吗
    test.add(scroll);
    这句为什么报错? 你把这句
    JScrollPane scroll = new JScrollPane(panel);
    放到 test.add(scroll);上面试下
      

  2.   

    setPreferredSize如果你设置了这个,你的滚动条只有当界面小于你设的值时才显示,label换行的问题,你设置的FlowLayout就是如果界面大小允许就是一行,如果到头了才换行,要是达到你说的要求换一种layout吧
      

  3.   

    给你的panel把FlowLayout布局去掉就好了
      

  4.   

    去掉没有作用呀,JPanel的默认布局不就是FlowLayout么。
      

  5.   

    你要的不就是有滚动条  并且自动换行吗  我刚才已经调试过了   没问题 只要去了FlowLayout布局 就会出现
    麻烦再问一下你刚运行程序的时候是不是窗体里什么都没有啊
      

  6.   

    改变layout,为什么非要用flowlayout呢。。
      

  7.   

    a1s2d3f4g5h6j7k8 你好你的意思是JPanel panel = new JPanel(new FlowLayout());将 new FlowLayout() 去掉是么,
    我试了,不可以呀。如果可以的话麻烦你贴下代码。谢谢
      

  8.   

    去掉后还是label还是显示在一排,没有换行
      

  9.   

    怎么会 我只是把你的panel里的布局去掉 并且把panel.setPreferredSize(new Dimension(200, 200));  大小改了 (400,400)就出来你要的效果了  你原来的大小 不加布局 只会换行 没有滚动条
      

  10.   

    呵呵,这个panel.setPreferredSize(new Dimension(200, 200));改成(400, 400)肯定会出来的,这样的话也就固定到(400, 400)了,这样也不对,面板只能显示(400,400)的区域,其他的还是看不到。 
      

  11.   

    给你看一下我改动的 也没什么东西  但是确实是实现了滚动条加换行import javax.swing.*;
    import java.awt.Dimension;
    import java.awt.FlowLayout;public class LayoutTest extends JFrame {
        
        public LayoutTest() {
            setSize(300, 300);
            setVisible(true);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }    public static void main(String[] args) {
            LayoutTest test = new LayoutTest();
            JPanel panel = new JPanel();
            JScrollPane scroll = new JScrollPane(panel);
            panel.setPreferredSize(new Dimension(400, 400));
            
            for(int i = 0; i < 1000; i++) {
                panel.add(new JLabel("标签 " + i));
            }
            
            panel.validate();
            panel.repaint();
            test.add(scroll);
        }
    }
      

  12.   

    这样改是可以,不过你没发现标签只能显示到130多么, 我一共循环的了1000次,最后一个label应该是999
      

  13.   

    可不可以自己写个布局继承FlowLayout,重写它的什么方法达到我想要的目的呢?
      

  14.   

    最困难的地方就在这里,程序中需要使用FlowLayout,更换布局我之前也考虑过,不过不行。
      

  15.   

    噢原来这样,滚动条可以设置界面多大时出现滚动,你看下api我忘了是那个方法了,另外考虑下界面打开默认大小
      

  16.   

    你是说setVerticalScrollBarPolicy这个方法么,我这里就是设置成初始就显示滚动条,可是不可以出现的,原因在于panel的大小被我固定了。
    而如果不固定大小,则所有的label又显示回去了。哪么又回到开始的问题上去了。很苦恼啊
      

  17.   

    如果不设置preferredsize呢?出现什么问题
      

  18.   

    不设置preferredsize的话,所有的label都显示在一行里,不换行
      

  19.   

    为啥非要用FlowLayout呢,换一个布局管理器不行么?
    可以不设置初始大小,直接panel.pack()。
      

  20.   

    不设置的话1000个标签都可以显示在同一行。不能换layout, 还有 JPanel貌似没有pack这个方法,pack这个方法只有几种container才有