//当面板上没有控件的时候,好像总是在调用... 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();
            }
        };

解决方案 »

  1.   

    这个写可以啊,这就是你写了一个继承自JPanel的匿名内部类了
      

  2.   

    嗯,谢谢各位了!
    这个代码主要是为了实现:
    在jPanel13上显示的控件当超出边界大小时自动换行显示。
    放在initComponents()方法中,在构造方法中调用initComponents();
    可是在调试的过程中发现这总分代码总是在执行!
    各位有知道的吗?能帮我分析一下吗?
    搞了好久了!
    new JPanel(new FlowLayout(FlowLayout.LEFT, 20, 20)) {
        @Override
        public Dimension getPreferredSize() {
            JViewport viewport = (JViewport) getParent();
            if (viewport != null&&viewport.getComponentCount()>0) {
                int wid = viewport.getWidth();
                setSize(wid, 671);
                doLayout();
                FlowLayout layout = (FlowLayout) getLayout();
                int hei = layout.getVgap();
                for (int i = 0; i < getComponentCount(); i++) {
                    Component c = getComponent(i);
                    hei = Math.max(hei, c.getY() + c.getHeight()
                        + layout.getVgap());
                    c=null;
                }
                return new Dimension(wid, hei);
            }
            viewport=null;
            return super.getPreferredSize();
        }
    };jPanel13放在一个JScrollPane上!嗯,有谁知道自动换行显示的方法!请指导一下.谢谢!就是当jPanel13上一行只能显示3个JLabel,当我有6个时就分二行显示?
    当动态改变JLabel的大小时一行只能显示2个的话,就动态的分三行显示!自动换行!
      

  3.   

    可以自己写个布局管理器代替 FlowLayout,效率会比较高的。
      

  4.   

    代码没什么大问题,就是有个地方好像写成死循环了,把setSize去掉就好了import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.FlowLayout;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JViewport;public class ChangeLinePanel extends JPanel {
        public ChangeLinePanel() {
            this.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 20));
        }    @Override
        public Dimension getPreferredSize() {
            JViewport viewport = (JViewport) getParent();
            if (viewport != null && viewport.getComponentCount() > 0) {
                int wid = viewport.getWidth();
                doLayout();
                System.out.println("getPreferredSize: " + getComponentCount());
                FlowLayout layout = (FlowLayout) getLayout();
                int hei = layout.getVgap();
                for (int i = 0; i < getComponentCount(); i++) {
                    Component c = getComponent(i);
                    hei = Math.max(hei, c.getY() + c.getHeight() + layout.getVgap());
                    c = null;
                }
                return new Dimension(wid, hei);
            }
    //        viewport = null;
            return super.getPreferredSize();    }    /**
         * @param args
         */
        public static void main(String[] args) {
            ChangeLinePanel clp = new ChangeLinePanel();
            for (int i = 0; i < 20; i++) {
                JButton b = new JButton(Integer.valueOf(i).toString());
                clp.add(b);
            }
            JFrame f = new JFrame();
            f.getContentPane().add(new JScrollPane(clp));
            f.setVisible(true);
            f.setSize(200, 200);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }}
      

  5.   

    布局管理器应该是效率最高的做法,需要实现一个接口,文档如下 http://gceclub.sun.com.cn/Java_Docs/jdk6/docs/zh/api/java/awt/LayoutManager.html