我现在有一个面版,我想让它缩放,且上面的子组件也跟着变换大小,我做了一个例子,不过只能    
将面版以及它的子组件的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);    }    
}    }

解决方案 »

  1.   

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

  2.   

    你那么做只是“看起来”缩小了,组件的实际属性并没有改变。修改了一下楼主的代码如下: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));
    }
    }
    }
    }
    }
      

  3.   

    谢谢两位兄弟,呵呵,特别是CrazyGou,让我毛塞顿开啊,真的是感激涕零啊,唔唔唔,