请教SWING小问题

最近天天加班陪测试组做测试,以前都是开发J2EE,下载来一本电子书,里边有个例子,是个小小的图片浏览器,
这个东西很粗糙,JFrame的大小不能随图片大小而改变,我想着去改进下,JFrame的大小是随图片大小改变了,但是JMenuBar和JLabel的大小却变不了,百度了下,都没有找到解决方法:
代码如下:

 

package com.yejq.Swing;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

/*
 * 图片预览器
 */

public class ImageViewer {

    /**
     * @param args
     */
    public static void main(String[] args) {
        JFrame frame = new ImageViewerFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
    
}

class ImageViewerFrame extends JFrame
{   
    public ImageViewerFrame()
    {
        this.setTitle("图片预览器");
        this.setSize(DEFAULT_WITH, DEFAULT_HEIGHT);
        
        label = new JLabel();
        this.add(label);
        
        chooser = new JFileChooser();
        chooser.setCurrentDirectory(new File("."));
        
        JMenuBar menuBar = new JMenuBar();
        this.setJMenuBar(menuBar);
        
        JMenu menu = new JMenu("File");
        menuBar.add(menu);      
        
        JMenuItem openItem = new JMenuItem("open");
        menu.add(openItem);
        openItem.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent event) {
                //show file chooser dialog
                int result = chooser.showOpenDialog(null);
                //if file selected, set it as icon of the label
                if(result == JFileChooser.APPROVE_OPTION)
                {
                    String name = chooser.getSelectedFile().getPath();
                    ImageIcon image = new ImageIcon(name);
                    changeSize(image.getIconWidth(),image.getIconHeight());
                    label.setIcon(image);
                }
            }           
        });
        
        JMenuItem exitItem = new JMenuItem("exit");
        menu.add(exitItem);
        exitItem.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
            {
                System.exit(0);
            }
        });
        
    }
    
    public void changeSize(int width, int height)
    {
        this.setSize(width,height);
    }
    

    private JLabel label;
    private JFileChooser chooser;
    private static final int DEFAULT_WITH = 300;
    private static final int DEFAULT_HEIGHT = 400;
}

 

不太明白楼主是啥意思,是打开图片后JFrame就自动根据图片的大小展开,并且图像正常显示吗?
这样的话,只要在只要在上面代码的第64行加上如下两行代码就可以了:
[code="java"]
ImageViewerFrame.this.validate();
ImageViewerFrame.this.repaint();
[/code]
还是说在图片显示之后,当调整窗口打小的时候,图片会随着窗口的大小而缩放?
这样的话,需要加一个窗口大小监控事件,每次窗口变化的时候进行重绘。
重绘代码如下:
[code="java"]
ImageIcon image = (ImageIcon)label.getIcon();
Image imageNew = image.getImage().getScaledInstance(label.getWidth(), label.getHeight(), Image.SCALE_DEFAULT);
label.setIcon(new ImageIcon(imageNew));
ImageViewerFrame.this.validate();
ImageViewerFrame.this.repaint();
[/code]