在这篇博文中,笔者介绍JScrollPane类的使用,JScrollPane类可以为组件添加滚动条。在这里笔者不会详细介绍该类的方法有哪些,因为在API上已经写得一清二楚了。在这篇博文中,笔者重点介绍JScrollPane依据属性来添加滚动条的。
看下面这个案例:
JFrame frame=new JFrame("ScrollPanel测试"); JPanel panel=new JPanel();
System.out.println(panel.getPreferredSize().toString()); for(int i=0;i<6;i++){ panel.add(new JButton("按钮"+i));
System.out.println(panel.getPreferredSize().toString()); } frame.add(new JScrollPane(panel)); frame.setPreferredSize(new Dimension(400,400));//宽400,高400 frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true);
6个按钮的宽度超过了400,结果出现了滚动条。但是我们同时也会发现一个规律,就是preparedSize一直在扩大,直到超过了400才出现滚动条的。
再看接下来的案例:
static JTextArea area=null; public static void main(String[] args) { JFrame frame=new JFrame("ScrollPanel测试"); area=new JTextArea(); area.addKeyListener(new KeyListener() { @Override public void keyTyped(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { System.out.println(area.getPreferredSize().toString()); } @Override public void keyPressed(KeyEvent e) { } }); frame.add(new JScrollPane(area)); frame.setPreferredSize(new Dimension(400,400));//宽400,高400 frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }
通过这个案例也可以发现,每输入一个文字,preparedSize就在扩大,直到超过400,才出现滚动条的。
这样以来就是验证了JScrollPanel是按照容器的preparedSize来决定是否出现滚动条的。
例如:
public class JScrollPaneTest { public static void main(String[] args) { JFrame frame=new JFrame("ScrollPanel测试"); MyPanel panel=new MyPanel(); frame.add(new JScrollPane(panel)); frame.setPreferredSize(new Dimension(400,400));//宽400,高400 frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } class MyPanel extends JPanel{ @Override public void paint(Graphics g) { super.paint(g); g.drawString("hello", 500, 500);//在500,500处写入文字 } }
上面的程序为,主窗口的大小设置为高400,宽400。在主窗口中添加了MyPanel的实例,该实例类继承自JPanel,并且重写了paint方法,在坐标为(500,500)处写下文字。运行结果,并非你相信的那样会出现滚动条,然后我们再把MyPanel实例的preparedSize打印一下,会发现PreparedSize的宽为10,高为10。到现在我们就弄清楚了,原来MyPanel实例的大小比主窗口的大小要小,所以不会出现滚动条。因此这样修改MyPanel类就可以了:
class MyPanel extends JPanel{ @Override public void paint(Graphics g) { super.paint(g); g.drawString("hello", 500, 500);//在500,500处写入文字 } @Override public Dimension getPreferredSize() { return new Dimension(600,600); } }
然后就可以看到滚动条了。