package test;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.HierarchyBoundsListener;
import java.awt.event.HierarchyEvent;import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
import javax.swing.Scrollable;public class A extends JFrame { private JPanel jContentPane = null;  //  @jve:decl-index=0:visual-constraint="23,131"
private b jTextArea = null;
JPanel main;
JScrollPane j;
/**
 * This method initializes jTextArea
 * 
 * @return javax.swing.JTextArea
 */
private JTextArea getJTextArea() {
if (jTextArea == null) {
jTextArea = new b();
//jTextArea.setBounds(new java.awt.Rectangle(60,45,165,90));
}
return jTextArea;
} /**
**
 * @param args
 */
public static void main(String[] args) {
Toolkit.getDefaultToolkit().setDynamicLayout(true);
new A().initialize(); } /**
 * This is the default constructor
 */
public A() {
super();
initialize();
} /**
 * This method initializes this
 * 
 * @return void
 */
private void initialize() {
Toolkit.getDefaultToolkit().setDynamicLayout(true);
this.setSize(600, 400);
this.setMaximumSize(new Dimension(500,300));
this.setTitle("JFrame");
this.add(this.getJContentPane());
this.setVisible(true);
Toolkit.getDefaultToolkit().setDynamicLayout(true);
} /**
 * This method initializes jContentPane
 * 
 * @return javax.swing.JPanel
 */
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(null);
main = new JPanel();
Dimension aa = this.getSize();
main.setSize(aa.width/2,1500);
System.out.println(aa.width/2+"  "+aa.height/2);
main.addHierarchyBoundsListener(new bbb(this));
main.setLayout(new GridLayout(50,1));
for(int a = 0;a<50;a++)
{
JPanel main1 = new JPanel();
main1.setSize(100,30);
main1.add(new JTextArea(),null);
main1.setBackground(new Color(4*a,4*a,4*a));
main.add(main1);
}
j = new JScrollPane(main,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
j.setBounds(new java.awt.Rectangle(60,45,165,90));
jContentPane.add(j);
}
return jContentPane;
}
class b extends JTextArea implements Scrollable
{

}
public void paint(Graphics g)
{
super.paint(g);
//System.out.println("1");
}
class bbb implements HierarchyBoundsListener{
A a;
bbb(A a)
{
this.a = a;
}
        public void ancestorResized(HierarchyEvent e)
        {
         Dimension aa = a.getSize();
//main.setSize(aa.width/2,aa.height/2);
//main.repaint();
//j.repaint();
j.setSize(aa.width/2,aa.height/2);
a.repaint();
jContentPane.repaint();
         System.out.println("h:" + aa.height);
        }
        
public void ancestorMoved(HierarchyEvent e)
{
   System.out.println("hello");
}}
}
我在滚动条中放了一个大JPanel,然后在JPanel中放了50个小JPanel,可是我设置的小JPanel高度是30,大JPanel是30*50,而滚动条是200,为什么滚动条里的JPanel的高度变小了啊,我想让里面有滚动效果,而且想保持里面的大小不变(现在高度变的很小,我想要30的高度),该怎么办啊,各位指点啊!

解决方案 »

  1.   

    你需要用下面三个方法给JPanel定义Size:
    pane.setMaximumSize(new Dimension(800, 600));
    pane.setMinimumSize(new Dimension(800, 600));
    pane.setPreferredSize(new Dimension(800, 600));
    这样JScrollPane就可以出现滚动条了。import java.awt.Color;
    import java.awt.Dimension;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;public class Test extends JFrame {
    private JScrollPane sPan = null;
    private JPanel pane = null; public Test() {
    pane = new JPanel();
    pane.setSize(800, 600);
    pane.setBackground(new Color(255, 0, 0));
    pane.setMaximumSize(new Dimension(800, 600));
    pane.setMinimumSize(new Dimension(800, 600));
    pane.setPreferredSize(new Dimension(800, 600));
    sPan = new JScrollPane(pane);
    this.getContentPane().add(sPan);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setSize(300, 200);
    this.setVisible(true);
    } public static void main(String[] arg) {
    new Test();
    }
    }