本帖最后由 sgwhp 于 2011-10-17 01:16:22 编辑

解决方案 »

  1.   

    把JPanel panel = new JPanel();
    修改成为
    JPanel panel = new JPanel(new BorderLayout());试试看
      

  2.   

    按照你的修改之后确实可以,这是为什么?另外,如果要求为FlowLayout要怎么办?
      

  3.   

    流式布局可以采用两个panel去做啊.
      

  4.   

    可以说具体点么,俺很菜还有,为啥用BorderLayout才能画出来呢?多谢了
      

  5.   

    在new JPanel的时候使用一下语句可以解决之前出现的问题:
            JPanel j = new JPanel(new FlowLayout(FlowLayout.LEFT)){
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension (180,200);
                }
            };但是在这个JPanel内只能显示第一张添加的图片,第二张无法显示。把修改过后的代码再帖上来吧,麻烦各位花点时间帮我分析一下,多谢了。
    import javax.imageio.*;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.geom.*;
    import java.io.*;public class ImgP extends JFrame{
        ImageCanvas ic;    public ImgP(){
            Image image;
            setSize(700, 500);
            JPanel j = new JPanel(new FlowLayout(FlowLayout.LEFT)){
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension (180,200);
                }
            };
            try {
                image = ImageIO.read(new File("G:\\Image\\化一通讯录.jpg"));
                ic = new ImageCanvas();
                ic.setImage(image);
                j.add(ic);
                //j2.add(ic)
                image = ImageIO.read(new File("G:\\Image\\IMG_0783.jpg"));
                ic = new ImageCanvas();
                ic.setImage(image);
                j.add(ic);
                add(j);
            } catch (IOException ex) {
            }
        }
        
        public static void main(String[] args) {
            ImgP ip = new ImgP();
            ip.setVisible(true);
            ip.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }    class ImageCanvas extends JComponent{
            Image img;
            double ratio;
            AffineTransform af = AffineTransform.getScaleInstance(1,1);
            public ImageCanvas(){
                setSize(180, 200);
            }
            void setImage(Image m){
                img = m;
                calculateRatio(img.getWidth(null), img.getHeight(null));
                concateZoom(ratio);
            }
            void concateZoom(double scale){
                if (img==null)return;
                af.preConcatenate(AffineTransform.getScaleInstance(scale,scale));
                paintImmediately(getBounds());
            }
            @Override
            protected void paintComponent(Graphics g) {
                System.out.println(img.getWidth(null) + " " + getX() + " " + getY());
                super.paintComponent(g);
                if (img==null) {
                    g.setColor(Color.BLACK);
                    g.fillRect(0,0,getWidth(),getHeight());
                }
                else {
                    Graphics2D g2d = (Graphics2D)g;
                    g2d.setTransform(af);
                    g2d.drawImage(img, (int)(((getWidth()-img.getWidth(null)*ratio)/2)/ratio),
                            (int)(((getHeight()-img.getHeight(null)*ratio)/2)/ratio), this);
                }
            }    final void calculateRatio(int width, int height){
            if(getWidth()>=width && getHeight()>=height){
                ratio = 1;
            }
            if((double)getWidth()/width > (double)getHeight()/height)
                ratio = (double)getHeight() / height;
            else ratio = (double)getWidth() / width;
        }    @Override
        public Dimension getPreferredSize() {return new Dimension(180, 200);}
        }
      

  6.   

    g2d.drawImage(img, (int)(((getWidth()-img.getWidth(null)*ratio)/2)/ratio),
                            (int)(((getHeight()-img.getHeight(null)*ratio)/2)/ratio), this);
    改成g2d.drawImage(img, af, this);后可以解决这个问题,但是不能保证图片居中显示。
      

  7.   

    FlowLayout是流布局,每个组件上下左右都有间隔,间隔太远就看不到了。borderLayout是边框布局,每次放一个组件而又没有规定组件位置的话,默认放置到中间位置