import javax.swing.JFrame; import javax.swing.SwingUtilities; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JPanel; import java.awt.Dimension; import java.awt.Component; import java.awt.GridLayout; class Test{ JFrame jframe; JLabel jlabel1; JLabel jlabel2; JLabel jlabel3; JLabel jlabel4; JScrollPane jscrollpane; JPanel jpanel; Dimension size; Test(){ jframe=new JFrame(); jpanel=new JPanel(new GridLayout(4,1)); jlabel1=new JLabel("label1"); jlabel2=new JLabel("label2"); jlabel3=new JLabel("label3"); jlabel4=new JLabel("label4"); jpanel.add(jlabel1); jpanel.add(jlabel2); jpanel.add(jlabel3); jpanel.add(jlabel4); jpanel.setPreferredSize(new Dimension(200,200)); jscrollpane=new JScrollPane(jpanel); jscrollpane.setSize(100,100); jframe.add(jscrollpane); jframe.setSize(new Dimension(300,300)); jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jframe.setVisible(true); jframe.setLayout(null); } public static void main(String arr[]){ SwingUtilities.invokeLater(new Runnable(){public void run(){new Test();}}); } }
JPanel的size比jscrollpane还要大,为什么没出现滚动条?
把setVisible(true)放到最后,genius,不然setLayout(null)是不起作用的,在setLayout(null)(空布局器)的情况下,你可以随意用setSize规定组件的大小,如果有布局管理器的存在,setSize就不会总是起作用了,这时要用setPreferredSize(Dimension)。
回到主题,由于setVisible是在setLayout(null)之前,所以JFrame使用的是默认布局器,当然,如果把null换成FlowLayout或GridLayout之类则会起作用,setVisible在setLayout之前会不起作用只是针对null而言。因为JFrame的布局器是BorderLayout,JScrollPane的setSize无效,并且BorderLayout让JScrollPane的size与JFrame相等,这样JPanel的size大于JScrollPane的size就不成立了。