0

ディレクトリのさまざまな画像を一覧表示するために使用しています。ユーザーがツリーに表示されている画像名をクリックしたときにJtree画像を表示したいのですが、使用しているコードは次のとおりです。別のクラスで使用します。appletta

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

ローカルファイルシステムのファイルを表示しているため、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 に答える
2

しかし、それは機能していません。

これは決して役に立ちません、例外がありますか?何が起こるのですか?より良いヘルプのためにSSCCEをより早く投稿してください

ツリーに表示されている画像名をクリックしたときにアプレットに画像を表示したいのですが、使用しているコードは以下のとおりです。taは別のクラスで使用しているため、アプレットのオブジェクトです。

IMOあなたはJPanelオブジェクトとを使用してそれについて間違っていますComponent#getGraphics

  • Component#getGraphics()それは良い習慣ではなく、永続的ではないため、使用しないでください。したがってrepaint()、画面への次の呼び出しはクリアされます。

  • Swingコンポーネントでアプレットを使用するのではなく、を使用してJAppletください。

変数のゲッターとセッターを使用してカスタムJPanelをコンテナーに追加し、そこにオーバーライドして描画します。BufferedImagepaintComponnetBufferedImage

ここで変更するには、セッター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 に答える