jPanel13 = new JPanel(new FlowLayout(FlowLayout.LEFT, 20, 20)) {
            @Override
            public Dimension getPreferredSize() {
                JViewport viewport = (JViewport) getParent();
               if (viewport != null) {
                    int wid = viewport.getWidth();
                    // int hei=viewport.getHeight(); //2008-04-18
                    setSize(wid, 671);
                    //setSize(wid,hei); //2008-04-18
                    doLayout();
                    FlowLayout layout = (FlowLayout) getLayout();
                    int hei = layout.getVgap();
                    // hei=layout.getVgap();  //2008-04-18
                    //int  hei=25;
                    for (int i = 0; i < getComponentCount(); i++) {
                        Component c = getComponent(i);
                        hei = Math.max(hei, c.getY() + c.getHeight()
                            + layout.getVgap());
                    }
                    return new Dimension(wid, hei);
                }
               return super.getPreferredSize();
            }
        };
要实现的是向JPanel中加入多个JLabel,JPanel放在JScrollPane上
如果这些JLabel不能在一行显示完整,换行显示.(也就是JScrollPane不出现横向滚动条)

解决方案 »

  1.   

    注意, 你使用的是public Dimension getPreferredSize() {
    这个方法, 呵呵, 当JPanel大小被改变, 或者重新显示等的时候, 这个函数是要被调用来取得JPanel的大小, 所以当然会一直被调用.
    你的设计方法理论上可以运行, 但实际上是不可取的.把"实现的是向JPanel中加入多个JLabel"的代码放到JPanel的构造函数里就可以了.
      

  2.   

    Inhibitory 谢谢!放到JPanel的构造函数???
    可是我要实现的JLabel动态加入.
    要对JLabel放在缩小,数量,大小是变化的.
      

  3.   

    放到JPanel的构造函数??? 
    可是我要实现的JLabel动态加入. 
    要对JLabel放大,缩小,数量,大小是变化的. 
      

  4.   

    那你可以把这段代码放到一个单独的函数中进行.
    要加的时候调用就行了.不过从你给出的信息中, 并不是很清楚你是怎么动态的加入JLabel, 所以不太明白.
    动态加入的动作, 决定了怎么解决, 可惜你的信息不完全.
      

  5.   

    你可以考虑自己定义一个属于你的JLabel,把要做的行为下放到你自己的JLabel里面
      

  6.   

      if (viewport != null) {
    if (viewport != null&&getComponentCount()>0) {