缩放panel面版,及组件有关问题

缩放panel面版,及组件问题我现在有一个面版,我想让它缩放,且上面的子组件也跟着变换大小,我做了一个例子,

缩放panel面版,及组件问题
我现在有一个面版,我想让它缩放,且上面的子组件也跟着变换大小,我做了一个例子,不过只能        
将面版以及它的子组件的UI缩放,而无法将组件真正的缩放,下面是我做的例子,        

package   print;        
import   java.awt.*;        
import   java.awt.event.*;        
import   java.awt.geom.AffineTransform;        
import   java.awt.geom.Line2D;        

import   javax.swing.*;        


public   class   PrintTest2   extends   JFrame   {        
AffineTransform   trans;//用来控制面版缩放的对象;        

public   PrintTest2(){        
setSize(800,   600);        
PanelZzg   panelzzg=new   PanelZzg();        
panelzzg.setPreferredSize(new   Dimension(900,700));        
JScrollPane   jscrollpane=new   JScrollPane(panelzzg);        

add(jscrollpane,BorderLayout.CENTER);        

setVisible(true);        
}        

public   static   void   main(String[]   args){        


PrintTest2   a=new   PrintTest2();        
a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        

}        

class   PanelZzg   extends   JPanel{        

JButton   btn;        
JLabel   lab;        
JToggleButton   a;        
AbstractButton   b;        
public   PanelZzg(){        
setLayout(null);        
a=new   JToggleButton( "kdkfj ");        
setBackground(Color.BLUE);        
btn=new   JButton( "可是可靠   可是扩大   ");        
btn.setBounds(120,60,120,60);        
lab=new   JLabel( "skdfjklsdjflsksdfs ");        
lab.setOpaque(true);        
lab.setBounds(200,200,100,100);        
a.setBounds(200,400,100,60);        

add(a);        
add(btn);        
add(lab);        
setSize(800,600);        
trans=new   AffineTransform();        
trans.scale(0.5,   0.5);//设置缩放的陪数;        

setVisible(true);        

}        


public   void   paint(Graphics   g){        
Graphics2D   g2=(Graphics2D)g;        
g2.setTransform(trans);//设置画笔坐标系的缩放        
super.paintComponent(g2);        
super.paintChildren(g2);        

}        


}        

}

[解决办法]
这似乎是比较难的~~
你想,你在Windows里把一个窗口缩小的时候,按钮并不会缩小吧?
最好的方式也许是组件之间的距离随着窗口大小的变化而变化。
------解决方案--------------------


你那么做只是“看起来”缩小了,组件的实际属性并没有改变。修改了一下楼主的代码如下:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class PrintTest2 extends JFrame {

public PrintTest2(){
setSize(800, 600);
PanelZzg panelzzg=new PanelZzg();
panelzzg.setPreferredSize(new Dimension(900,700));
JScrollPane jscrollpane=new JScrollPane(panelzzg);

add(jscrollpane,BorderLayout.CENTER);

setVisible(true);
}

public static void main(String[] args){


PrintTest2 a=new PrintTest2();
a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

class PanelZzg extends JPanel{

JButton btn;
JLabel lab;
JToggleButton a;
AbstractButton b;
JPanel p = this;
public PanelZzg(){
setLayout(null);
a=new JToggleButton( "kdkfj ");
setBackground(Color.BLUE);
btn=new JButton( "点我 ");
btn.setBounds(120,60,120,60);
lab=new JLabel( "skdfjklsdjflsksdfs ");
lab.setOpaque(true);
lab.setBounds(200,200,100,100);
a.setBounds(200,400,100,60);

add(a);
add(btn);
add(lab);
setSize(800,600);
btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
tranform(p, 0.5, 0.5);
}
});

setVisible(true);

}

//此函数将一个Container缩小到指定比例
public void tranform(Container c, double scaleX, double scaleY)
{
c.setBounds((int)(c.getX() * scaleX),
(int)(c.getY() * scaleY),
(int)(c.getWidth() * scaleX),
(int)(c.getHeight() * scaleY));

Component[] cs = c.getComponents();

for (int i = 0; i < cs.length; i++) {
if (cs[i] instanceof Container) {
tranform((Container)cs[i], scaleX, scaleY);
}
else {
cs[i].setBounds((int)(cs[i].getX() * scaleX),
(int)(cs[i].getY() * scaleY),
(int)(cs[i].getWidth() * scaleX),
(int)(cs[i].getHeight() * scaleY));
}
}
}
}
}