Take a look at GW

【Java】解析JScrollPane类的使用

在这篇博文中,笔者介绍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);
    }
}

然后就可以看到滚动条了。

 

posted @ 2018-02-25 19:13  HDWK  阅读(12345)  评论(0编辑  收藏  举报