0

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

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;

}

但它不起作用。

4

2 回答 2

2

但它不起作用。

这一点帮助都没有,你有例外吗?怎么了?请尽快发布SSCCE以获得更好的帮助

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

IMO 你使用JPanel对象和Component#getGraphics.

  • 不要将Component#getGraphics()其用作不好的做法并且不持久,因此在下次调用repaint()屏幕时将被清除。

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

JPanel将带有getter 和 setter的自定义添加BufferedImage到容器中,然后覆盖paintComponnet并绘制BufferedImage那里。

现在要更改BufferedImage简单地调用设置器,然后setBackgroundImage(BufferedImage img)调用repaint()JPanel显示更改。像这样:

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
于 2013-01-28T08:04:59.773 回答
2

当您显示来自本地文件系统的文件时,不需要使用 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);
}

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

于 2013-01-28T07:08:55.000 回答