这段程序本意是想点击按钮,让panel变大,然后出现滚动条
public class MyFrame extends JFrame {    private static final long serialVersionUID = 1L;
    
    private JPanel panel;
    private JButton button;
    
    public MyFrame()
    {
        setSize(new Dimension(400,300));
        setLayout(new BorderLayout());
        panel=new JPanel();
        JScrollPane js=new JScrollPane(panel);
        panel.setBackground(Color.RED);
        getContentPane().add(js,BorderLayout.NORTH);
        button=new JButton("点击变大");
        button.setSize(100, 50);
        add(button,BorderLayout.SOUTH);
        button.addActionListener(new ActionListener(){            public void actionPerformed(ActionEvent arg0) {
                int x=MyFrame.this.getPanel().getWidth();
                int y=MyFrame.this.getPanel().getHeight()+20;
                MyFrame.this.getPanel().setSize(x, y);
                MyFrame.this.repaint();
            }
            
        });
        getContentPane().add(button,BorderLayout.SOUTH);
        setVisible(true);
    }
    
    public JPanel getPanel()
    {
        return this.panel;
    }
    
    public static void main(String[] args)
    {
        new MyFrame();
    }
}

解决方案 »

  1.   

    加个JScrollPane,把JPanel放进去
      

  2.   

    用setPreferredSize(Dimension preferredSize)
      

  3.   

    没有用。。
    请看下面代码public class MyFrame extends JFrame {    private static final long serialVersionUID = 1L;
        
        private JPanel panel;
        private JButton button;
        
        public MyFrame()
        {
            setSize(new Dimension(400,300));
            setLayout(new BorderLayout());
            panel=new JPanel();
            JScrollPane js=new JScrollPane(panel);
            panel.setBackground(Color.RED);
          //  js.setPreferredSize(new Dimension(100,80));
            getContentPane().add(js,BorderLayout.NORTH);
            button=new JButton("点击变大");
            add(button,BorderLayout.SOUTH);
            button.addActionListener(new ActionListener(){            public void actionPerformed(ActionEvent arg0) {
                    int x=MyFrame.this.getPanel().getWidth();
                    int y=MyFrame.this.getPanel().getHeight()+20;
                    MyFrame.this.getPanel().setPreferredSize(new Dimension(x, y));
                    MyFrame.this.repaint();
                }
                
            });
            getContentPane().add(button,BorderLayout.SOUTH);
            setVisible(true);
        }
        
        public JPanel getPanel()
        {
            return this.panel;
        }
        
        public static void main(String[] args)
        {
            new MyFrame();
        }
    }
      

  4.   

    试试这个,应该好了:
    public class MyFrame extends JFrame {    private static final long serialVersionUID = 1L;
        
        private JPanel panel;
        private JButton button;
        
        public MyFrame()
        {
            setSize(new Dimension(400,300));
            setLayout(new BorderLayout());
            panel=new JPanel();
            JScrollPane js=new JScrollPane(panel);
            panel.setBackground(Color.RED);
          //  js.setPreferredSize(new Dimension(100,80));
            getContentPane().add(js,BorderLayout.CENTER);
            button=new JButton("Zoom in");
            add(button,BorderLayout.SOUTH);
            button.addActionListener(new ActionListener(){            public void actionPerformed(ActionEvent arg0) {
                    int x=MyFrame.this.getPanel().getWidth();
                    int y=MyFrame.this.getPanel().getHeight()+20;
                    getPanel().setPreferredSize(new Dimension(x, y));
                    getPanel().setSize(getPanel().getPreferredSize());
                    //MyFrame.this.repaint();
                }
                
            });
            getContentPane().add(button,BorderLayout.SOUTH);
            setVisible(true);
        }
        
        public JPanel getPanel()
        {
            return this.panel;
        }
        
        public static void main(String[] args)
        {
            new MyFrame();
        }
    }
      

  5.   

    2个问题:一个是布局格式的问题:BorderLayout跟随布局大小的变化而变化,总是平铺界面,你可以试试随便改setSize(new Dimension(400,300));他总是全部显示的。因此就算你的BUTTON事件执行,也不会出现你想要的结果。
                    二是你程序中的BUTTON事件执行的结果,X跟Y的取值有问题,你可以自己去测试,比实际的大小貌似小所以:你把布局改下,然后x跟Y取值弄正确就OK了
      

  6.   

    就像5楼说的,设置下PreferredSize,即组件的首选大小即可。import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    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.ScrollPaneConstants;
    public class MyFrame extends JFrame {    private static final long serialVersionUID = 1L;
        
        private JLabel label;
        private JPanel panel;
        private JButton button;
        private JScrollPane js;
        
        public MyFrame()
        {
            setSize(new Dimension(400,300));
            setLayout(new BorderLayout());
            label=new JLabel("变大的面板");
            panel=new JPanel();
            panel.setSize(new Dimension(370,50));
            panel.add(label);
            js=new JScrollPane();
            js.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
            panel.setBackground(Color.RED);
            js.setViewportView(panel);
            getContentPane().add(js,BorderLayout.CENTER);
            button=new JButton("点击变大");
            button.setSize(100, 50);
            add(button,BorderLayout.SOUTH);
            button.addActionListener(new ActionListener(){            public void actionPerformed(ActionEvent arg0) {
                 System.out.println("增加面板大小");
                    int x=MyFrame.this.getPanel().getWidth();
                    int y=MyFrame.this.getPanel().getHeight()+50;
                    MyFrame.this.getPanel().setSize(new Dimension(x, y));
                    MyFrame.this.getPanel().setPreferredSize(new Dimension(x,y));
                    MyFrame.this.repaint();
                }
                
            });
            getContentPane().add(button,BorderLayout.SOUTH);
            setVisible(true);
        }
        
        public JPanel getPanel()
        {
            return this.panel;
        }
        
        public static void main(String[] args)
        {
            new MyFrame();
        }
        public JScrollPane getJS()
        {
         return this.js;
        }
    }
      

  7.   

    你距离真相很接近了,可是20%的时间往往需要耗费80%的时间。呵呵。MyFrame.this.repaint();
    你知道,repaint方法是做什么用的吗?它是如何实现的?
    第一要说的,你应该知道这样的概念:你在界面上已经展示了一些东西。这时通过代码来改变一些内容,必须通知其刷新。repaint会触发panel重新执行paint方法。这个方法主要分为三个部分:paintComponent,
    paintBorder, paintChildren。这几个方法只是绘制,跟大小完全无关,如果要使新设置的尺寸生效,将
    MyFrame.this.repaint();换为:
    MyFrame.this.getPanel().revalidate();
    如果比如你将界面上一个component移除而add另外一个component。这个时候,调用repaint。
    切记!!不可乱用。
    多说了几句,免得你继续无谓的等待,这样的细节是容易被忽视掉的。
      

  8.   

    还有,记的区别setSize和setPreferredSize。
    这里要使用setPreferredSize。 不多说了,请自己去看一下源代码。这些细节的区别文档给出的不多。
      

  9.   

    为什么这两句都要写呢。。
     getPanel().setPreferredSize(new Dimension(x, y));
      getPanel().setSize(getPanel().getPreferredSize());
      

  10.   

    那也是validate(),我还真不知道可以MyFrame.this.revalidate()这样写,不知道你用的哪个版本的JDK。
      

  11.   

    还有,别夸夸其谈,这个代码你都没执行就在这里说距离真相很近。 你执行过没?没有吧,要不然你不会连JFrame里面没有revalidate方法都不知道。