当我们为添加到JScrollPane的JPanel使用setPreferredSize时,为什么它向JScrollPane显示滚动条

时间:2012-02-01 07:16:24

标签: java swing jpanel jscrollpane

请参阅以下代码块

import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
public class test extends JFrame {
    public test(){

    this.setBounds(0,0,300,700);

    JPanel pnltemp= new JPanel();

    //pnltemp.setBounds(0,0,400,1000);
    pnltemp.setPreferredSize(new Dimension(400,1000));

    JScrollPane scrtemp= new JScrollPane();


    scrtemp.getViewport().add(pnltemp);
    this.getContentPane().add(scrtemp);

    this.getContentPane().add(scrtemp);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);

}

public static void main(String args[]){
    new test();

}
}
  1. 当我们通过评论“pnltemp.setBounds(0,0,400,1000);”运行上述代码时并将其替换为“pnltemp.setPreferredSize(new Dimension(400,1000));”该窗口显示水平和垂直滚动条。 但是当我们通过评论“pnltemp.setPreferredSize(new Dimension(400,1000))”运行相同的程序时,“并用“pnltemp.setBounds(0,0,400,1000)”替换它,窗口不显示水平和垂直滚动条。
  2. 为什么通过更改setBounds和setPreferredSize方法,同一程序的行为会有所不同;因为这两种方法在行为上看起来相同。

    或者是这样的,当我们使用JScrollPane来获取Scrollbar时,我们必须使用setPreferredSize();我们将在JScrollPane中添加的组件的方法。

    1. 我的第二个问题是当我们将pnltemp添加到scrtemp时,即JPanel直接添加到JScrollPane然后它不会给出错误意味着当我们说
    2. scrtemp.add(pnltemp);

      它没有给出任何错误,但它也没有显示scrtemp中的pnltemp和滚动条。 但是当我们输入 scrtemp.getViewPort.add(pnltemp);

      它没有给出任何错误,但它也显示了scrtemp中的pnltemp和滚动条。

      我通过为JPanel和JScrollPane分配背景颜色来检查这一点。

      任何人都能说明这个吗?

      谢谢!

1 个答案:

答案 0 :(得分:3)

来自JScrollPane JavaDocs。

  

默认情况下,JScrollPane使用ScrollPaneLayout来处理其子组件的布局。 ScrollPaneLayout以两种方式之一确定视口视图的大小:

     
      
  1. 如果视图实施Scrollable,则会使用getPreferredScrollableViewportSizegetScrollableTracksViewportWidthgetScrollableTracksViewportHeight的组合,否则
  2.   
  3. getPreferredSize被使用。
  4.