1

画像リストにJtreeを使用して選択した画像を表示していますが、問題は、画像サイズがキャンバスサイズよりも大きい場合(つまり、300 X 300)、画像の左上のみが表示されることです。画像全体を固定で表示する方法サイズのキャンバス?

私は次のコードを使用しています:

private void displayImage(File file) {

    try 
    {
        BufferedImage image = ImageIO.read(file);
        ta.Picture = image;
    }
    catch (Exception e) 
    {}

    Graphics g = ta.imageCanvas.getGraphics();
    g.clearRect(0, 0, 300, 300);
    g.drawImage(ta.Picture, 00, 00, this);

} // displayImage

public void valueChanged(TreeSelectionEvent e) 
{
    // TODO Auto-generated method stub
    FileTreeNode node = (FileTreeNode) tree.getLastSelectedPathComponent();

    if (node.isLeaf()) 
    {

        currentFile = node.file;

        File ff = new File("F:/images_blue/" + currentFile.getName());
        displayImage(ff);

    } else
        currentFile = null;

}
4

2 に答える 2

2

それを指摘したいのですが...

Graphics g = ta.imageCanvas.getGraphics();
g.clearRect(0, 0, 300, 300);
g.drawImage(ta.Picture, 00, 00, this);

本当に悪い考えです。

getGraphics戻る可能性がnullあり、せいぜい最後の再ペイントサイクルのスナップショットであり、次のペイントサイクルで無効化または参照解除される可能性があります。

メソッドのようなものから拡張して、メソッドJPanelをオーバーライドする必要がありますpaintComponent。これにより、画像管理の一部としてゲッターとセッターを提供し、自己完結型で再利用可能な方法で拡大縮小された画像を作成できるようになります。

あなたは私のためにPerfomingCustomPaintingをチェックしてください情報

そして、私のコメントによると、あなたは例のためにこれらの前の質問をチェックしたいかもしれません

于 2013-01-29T07:37:46.427 に答える
1

このようにBufferedImageをスケーリングできます。

BufferedImage before = getBufferedImage(encoded);
int w = before.getWidth();
int h = before.getHeight();
BufferedImage after = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
AffineTransform at = new AffineTransform();
at.scale(2.0, 2.0);
AffineTransformOp scaleOp = 
   new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
after = scaleOp.filter(before, after);

ここでスニペットを見つけました

于 2013-01-29T07:14:19.697 に答える