免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3165 | 回复: 4
打印 上一主题 下一主题

[求助]关于ImageIcon类的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-12 18:00 |只看该作者 |倒序浏览
最近在做一个小项目,涉及到JLabel中要添加图片,于是乎想到了直接用new JLabel(new ImageIcon("my.gif"))。结果在Eclipse中调试可以正常显示,但是打成包后,却显示不了。改成Applet,用浏览器打开,说是访问安全性不够。

后来在网上搜索,找到一段源码:
import java.applet.*;
import java.awt.*;
import java.io.*;
public class ResourceDemoApplet extends Applet {
    Image m_image;
    public void init() {
        try {
            InputStream in = getClass().getResourceAsStream("my.gif");
            if (in == null) {
                System.err.println("Image not found.");
                return;
            }
            byte[] buffer = new byte[in.available()];
            in.read(buffer);
            m_image = Toolkit.getDefaultToolkit().createImage(buffer);
        }
        catch (java.io.IOException e) {
            System.err.println("Unable to read image.");
            e.printStackTrace();
        }
        add(new JLabel(new ImageIcon(m_image)));
    }

}

测试,打包后能正常显示,改成Applet也无访问安全性的问题。

这我就不理解了,为什么通过ImageIcon(String filename)导入的文件有问题,而用ImageIcon(Image image)却没有问题呢?

论坛徽章:
0
2 [报告]
发表于 2006-02-12 18:12 |只看该作者
估计是你的启动目录不一样。

对my.gif的引用出现了偏差。

可以放到一个Package里面,然后

Class.getResourceAsStream ("/some/pkg/resource.properties");

[ 本帖最后由 knight-yl 于 2006-2-12 18:18 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2006-02-12 19:43 |只看该作者
问题是我在Eclipse中编译的时候图片能够调用,但是打成jar后,双击运行却显示不出来。

我的源码:

package count;

// UpperPanel.java
// 此类是所有计算类的父类,提供公共的借口给各个子类
//

import java.awt.*;
import java.awt.event.*;
import java.io.InputStream;
import java.security.AccessControlException;

import javax.swing.*;

public abstract class UpperPanel extends JPanel implements ActionListener {

    private static int Number;

    private GridBagLayout bagLayout;
    private GridBagConstraints constraints;

    // 计算类名称
    private String name;
    // 参数的个数
    private int parameterNumber;
    // 对计算的描述
    private JTextArea describeArea;
    // 显示参数的内部面板
    private JPanel innerPanel;
    private JLabel[] parLabels;
    private JTextField[] parFields;
    // 计算按钮
    private JButton count;
    // 显示结果
    private JTextArea resultArea;

    public UpperPanel(String name, String describe, String[] parName) {
        Number++;
        this.name = name;
        parameterNumber = parName.length;

        bagLayout = new GridBagLayout();
        setLayout(bagLayout);
        constraints = new GridBagConstraints();

        constraints.fill = GridBagConstraints.BOTH;
        describeArea = new JTextArea(describe);
        describeArea.setEditable(false);
        describeArea.setLineWrap(true);
        JScrollPane scrollPane = new JScrollPane(describeArea);
        constraints.weightx = 1000;
        constraints.weighty = 1;
        addComponent(scrollPane, 0, 0, 1, 3);

        constraints.fill = GridBagConstraints.NONE;
        constraints.weightx = 0;
        constraints.weighty = 0;
        innerPanel = new JPanel();
        innerPanel.setLayout(new GridLayout(0, 6));
        parLabels = new JLabel[parameterNumber];
        parFields = new JTextField[parameterNumber];

        for (int i = 0; i < parameterNumber; i++) {
            /*
            try {
                parLabels[i] =new JLabel(new ImageIcon("count/images/" +parName[i] +".gif"));
            }
            catch(AccessControlException e) {
                parLabels[i] =new JLabel(parName[i]);
            }
            parLabels[i] =new JLabel(new ImageIcon("count/images/" +parName[i] +".gif"));
            */
            Image m_image = null;
            try {
                InputStream in = getClass().getResourceAsStream(
                        "images/" + parName[i] + ".gif");
                if (in == null) {
                    System.err.println("Image not found.");
                    return;
                }
                byte[] buffer = new byte[in.available()];
                in.read(buffer);
                m_image = Toolkit.getDefaultToolkit().createImage(buffer);
            }
            catch (java.io.IOException e) {
                System.err.println("Unable to read image.");
                e.printStackTrace();
            }
            parLabels[i] = new JLabel(new ImageIcon(m_image));

            parFields[i] = new JTextField();
            innerPanel.add(parLabels[i]);
            innerPanel.add(parFields[i]);
        }
        addComponent(innerPanel, 0, 1, 1, 1);

        constraints.fill = GridBagConstraints.BOTH;
        count = new JButton("计算");
        count.addActionListener(this);
        addComponent(count, 1, 1, 1, 1);

        resultArea = new JTextArea("计算结果:\n");
        resultArea.setEditable(false);
        resultArea.setLineWrap(true);
        JScrollPane scrollPane2 = new JScrollPane(resultArea);
        addComponent(scrollPane2, 2, 1, 1, 1);
    }

    private void addComponent(Component component, int row, int column,
            int width, int height) {
        constraints.gridx = column;
        constraints.gridy = row;

        constraints.gridwidth = width;
        constraints.gridheight = height;

        this.add(component, constraints);

    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public int getParameterNumber() {
        return parameterNumber;
    }

    public int getNumber() {
        return Number;
    }

    public JTextArea getResultArea() {
        return resultArea;
    }

    public JTextArea getDescribeArea() {
        return describeArea;
    }

    public void setDescribeArea(String describe) {
        describeArea.setText(describe);
    }

    // 子计算类实现相应的功能
    public abstract double count();

    // 搜集用户输入的参数,并通过一个double数组输出
    protected double[] getParameter() {
        double[] result = new double[parameterNumber];
        String st = "";
        for (int i = 0; i < parameterNumber; i++) {
            st = parFields[i].getText();
            if (st == "" || st == null || st.equals("")) {
                result[i] = 0.0;
                continue;
            }
            else {
                try {
                    result[i] = Double.parseDouble(parFields[i].getText());
                }
                catch (NumberFormatException e) {
                    JOptionPane.showMessageDialog(null, "输入参数错误!", "错误",
                            JOptionPane.ERROR_MESSAGE);
                    System.exit(1);
                }
            }
        }
        return result;
    }

    // 计算并输出
    public void actionPerformed(ActionEvent e) {
        double result = count();
        resultArea.append("" + result + "\n");

    }

}

Main类调用count文件夹下的计算子类(继承自UpperPanel),图片是在count文件夹下的images文件夹下。

论坛徽章:
0
4 [报告]
发表于 2006-02-13 01:18 |只看该作者
没错,这是java处于对安全的考虑进行的限制,二楼已经给你解决方案了。说得具体一点,

1. 把你的count/images目录以及图片文件一并压缩到jar文件里面去

2. 修改代码


  1. new JLabel(new ImageIcon("count/images/" +parName[i] +".gif"));
复制代码





  1. InputStream input = Class.class.getClass().getResourceAsStream( "/count/images/" + parName[i] +".gif" );
  2. BufferedImage img = ImageIO.read(input);
  3. new JLabel(new ImageIcon(img));
复制代码


需要的其他文件资源应该从jar内部提供,不要从本地文件系统提供。如果applet可以访问客户端文件,不是一件很可怕的事情吗?要是那样的话,你访问的网页就能够盗取你电脑上的资料了!

还有更简单的
new ImageIcon(getClass().getClassLoader().getResource("count/images/" + parName +".gif"))

[ 本帖最后由 perryhg 于 2006-2-28 01:48 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2006-02-13 11:55 |只看该作者
多谢指点~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP