Javaのswingで画像を拡大縮小して表示するサンプルです。

ポイント

  1. ImageIconクラスでアイコンとして画像を読み込みます。
  2. getScaledInstanceで大きさを変更します。
    1. 幅と高さともに同じ倍率にする場合、高さは-1にしてもいいです。
  3. MediaTrackerで処理の終了を待ちます。
    1. 画像の加工は、加工完了する前に処理が戻ってくるので、waitForAll()などで処理の終了を待機する必要がある…らしいです。
  4. JLabelにアイコンを設定します。

大きさを変更するのも意外と簡単です。

実行結果


ソース ImageTest2.java

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Image;
import java.awt.MediaTracker;
 
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSeparator;
 
// swing 画像表示サンプル2 画像を拡大縮小してみよう
// ポイント1.ImageIconクラスでアイコンとして画像を読み込みます。
// ポイント2.getScaledInstanceで大きさを変更します。
//        幅と高さともに同じ倍率にする場合、高さは-1にしてもいいです。
//        
// ポイント3.MediaTrackerで処理の終了を待ちます。
//        画像の加工は、加工完了する前に処理が戻ってくるので、waitForAll()などで処理の終了を待機する必要がある…らしいです。
// ポイント4.JLabelにアイコンを設定します。
// 大きさを変更するのも意外と簡単です。
public class ImageTest2 extends JFrame {
  public static void main(String[] args) {
    new ImageTest2();
  }
 
  public ImageTest2() {
    setTitle("swing 画像表示サンプル2 画像を拡大縮小してみよう");
    // 今回はレイアウトマネージャを使います
    setLayout(new FlowLayout());
 
    // ポイント1.ImageIconクラスでアイコンとして画像を読み込みます。
    ImageIcon icon = new ImageIcon("logo3w.png");
 
    MediaTracker tracker = new MediaTracker(this);
    // ポイント2.getScaledInstanceで大きさを変更します。
    Image smallImg = icon.getImage().getScaledInstance((int) (icon.getIconWidth() * 0.5), -1,
        Image.SCALE_SMOOTH);
    Image bigImg = icon.getImage().getScaledInstance((int) (icon.getIconWidth() * 1.5), -1,
        Image.SCALE_SMOOTH);
 
    // ポイント3.MediaTrackerで処理の終了を待ちます。
    tracker.addImage(smallImg, 1);
    tracker.addImage(bigImg, 2);
 
    ImageIcon smallIcon = new ImageIcon(smallImg);
    ImageIcon bigIcon = new ImageIcon(bigImg);
 
    try {
      tracker.waitForAll();
    } catch (InterruptedException e) {
      System.out.println("なんかエラーでた。");
    }
 
    // ポイント4.JLabelにアイコンを設定します。
    JLabel l = new JLabel("0.5", smallIcon, JLabel.LEFT);
    JLabel ll = new JLabel("1.0", icon, JLabel.LEFT);
    JLabel lll = new JLabel("1.5", bigIcon, JLabel.LEFT);
 
    // 関係ないポイント
    // 横幅の大きなJseparatorを差し込むと、JFlowLayoutの強制改行みたいな事ができます
    JSeparator sp = new JSeparator();
    JSeparator sp2 = new JSeparator();
    sp.setPreferredSize(new Dimension(5000, 0));
    sp2.setPreferredSize(new Dimension(5000, 0));
 
    add(l);
    add(sp);
    add(ll);
    add(sp2);
    add(lll);
 
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setBounds(100, 100, 500, 350);
    setVisible(true);
  }
}
 

コメント(バグ、間違い、こんな情報が欲しい等ありましたら)

  • ImageIconで取得した画像のレイアウトはBoxLayoutではうまくいかないのですか? 初心者ですみません… - 名無し 2013-07-01 16:23:48
名前:

アンケート(このページの情報はお役に立ちましたか?)

順位 選択肢 得票数 得票率 投票
1 役に立った 25 (57%)
2 分かりにくい 11 (25%)
3 役に立たない 8 (18%)
4 間違っている 0 (0%)
その他
投票総数 44