yejq8 2009-06-23 23:49
浏览 257
已采纳

请教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;
}
  • 写回答

1条回答 默认 最新

  • hunterli0408 2009-06-24 13:47
    关注

    不太明白楼主是啥意思,是打开图片后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]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?