【问题标题】:Display image on applet在小程序上显示图像
【发布时间】:2013-01-11 10:24:35
【问题描述】:

我正在使用Jtree 列出目录的各种图像,当用户单击树中显示的图像名称时,我想在applet 上显示图像,我使用的代码如下,@ 987654323@ 是小程序的一个对象,因为我在另一个类中使用它。

private void displayImage(URL furl, String fname) {


    ta.Picture = ta.getImage(furl, fname);
    prepareImage(ta.Picture, this);
    Graphics g = ta.imageCanvas.getGraphics();
    g.clearRect(10, 10, 800, 800);
    g.drawImage(ta.Picture, 10, 10, this);

} // displayImage

public void valueChanged(TreeSelectionEvent e) 
{
    // TODO Auto-generated method stub
    FileTreeNode node = (FileTreeNode) tree.getLastSelectedPathComponent();
    System.out.println("slecte asldf " + node.isLeaf());
    if (node.isLeaf()) 
    {

        currentFile = node.file;
        System.out.println("File name " + currentFile.getName());
        try 
        {
            URL furl = new URL("file:/F:/photos");
            displayImage(furl, currentFile.getName());
        }
        catch (MalformedURLException mle) 
        {
            System.out.println("Exception::::::" + mle);
        }

    } 
    else
        currentFile = null;

}

但它不起作用。

【问题讨论】:

    标签: java image swing applet jtree


    【解决方案1】:

    当您显示来自本地文件系统的文件时,不需要使用 URL。使用

    displayImage(currentFile);
    

    并重写该方法如下:

    private void displayImage(File file) {
        BufferedImage image = ImageIO.read(file);
        ta.image = image;
        ta.repaint();
     } 
    

    (我假设的)组件 ta 的绘制方法必须是这样的

    BufferedImage image;
    public void paint(Graphics g) { 
        g.clearRect(10, 10, 800, 800);
        g.drawImage(ta.Picture, 10, 10, this);
    }
    

    出于安全原因,小程序只有在没有安全管理器的情况下签名或运行时才能访问文件系统(通常在同一台计算机上)。

    【讨论】:

    • 出于安全原因,只有在同一台计算机上签名或运行的小程序才能访问文件系统。 +1.虽然不太确定paint 我更喜欢JPanelpaintComponent
    • 当然,如果这是一个 Swing 小程序。我不确定,也许是 AWT 小程序。
    • "只有在同一台计算机上签名或运行的小程序才能访问文件系统。" 不,最后一部分应该是 "如果签名或..” ..在没有安全管理器的情况下运行。沙盒小程序根本无法访问本地文件系统,相同/不同的计算机没有区别。
    • 同意。曾经是一个常见的问题,即有人在 IDE 中测试具有更多访问权限的小程序(通常在没有安全管理器的情况下运行),然后它无法在 Internet 上运行。只是想警告一下。也许最近的小程序开发工具会自动安装该管理器。更新了帖子
    【解决方案2】:

    但它不起作用。

    这绝对没有帮助,你有例外吗?发生什么了?请尽快发布SSCCE 以获得更好的帮助

    当用户单击图像时,我想在小程序上显示图像 树中显示的名称,我使用的代码如下,ta 是 小程序的对象,因为我在另一个类中使用它。

    IMO 你用JPanel 对象和Component#getGraphics 做错了。

    • 不要使用Component#getGraphics(),因为它不是很好的做法,也不是持久的,因此下次调用repaint()时屏幕将被清除。

    • 不要将 Applet 与 Swing 组件一起使用,而应使用 JApplet

    为容器中的BufferedImage 变量添加一个带有getter 和setter 的自定义JPanel,然后覆盖paintComponnet 并在那里绘制BufferedImage

    现在要更改BufferedImage,只需调用setter,即setBackgroundImage(BufferedImage img),然后在JPanel 上调用repaint() 以显示更改。像这样:

    public class MyPanel extends JPanel {
        private BufferedImage bg;
    
        public MyPanel(BufferedImage bi) {
            bg=bi;
        }
    
        @Override
        protected void paintComponent(Graphics g) {
           super.paintComponent(g);
    
           Graphics2D g2d=(Graphics2D)g;
           g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
           g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));
    
           g2d.drawImage(bg,0,0,this);
        }
    
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(bg.getWidth(),bg.getHeight());
        }
    
        public BufferedImage setBackgroundImage(BufferedImage bi) {
            bg=bi;
        }
    }
    

    现在我们像这样使用它:

    MyPanel mp=new MyPanel(...);//create the panel with an image
    ...
    add(mp);//add to container
    ...
    mp.setBackgroundImage(..);//change the image being displayed
    
    mp.repaint();//so the new image may be painted
    

    【讨论】:

    • 不要将 Applet 与 Swing 组件一起使用,而应使用 JApplet。 你能解释一下为什么吗?只是想知道。
    • @Che Applet 是 AWT...JApplet 是 Swing
    • 仅仅因为它是基础并且没有出现语法错误并不意味着我们可以毫无问题地混合两者。就像对 Swing 组件使用 AWT KeyListener 一样,存在焦点问题......可能会发生不寻常的事情。因此不建议使用。是的,我相信 L&F 问题也可能发生......
    • 好的。感谢您的解释。 1+
    • 回复。 this 如果小组声明 public MyPanel(Image bi) { 而不是 public MyPanel(BufferedImage bi) {,那么我的声明会更有意义。我认为没有任何方法可以异步加载BufferedImage。 OTOH,thisnull 一样短。那么为什么曾经null 用作一个组件的ImageObserver
    猜你喜欢
    • 2014-07-02
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多