非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

Java/Swing: JFrame上に画像を表示させ矢印キーでスクロールさせる方法

   

前回、JFrame上に画像を表示させる方法について書きました。

今回は、表示させた画像が画面からはみ出た場合に、矢印キーでスクロールさせる方法について書きます。

完成例は下記の通り。スムーズに動かすのではなく見えていないところを順にステップ的にスクロールさせました。ゆっくり下ろしたい場合は今回の例を応用できるかと思います。

 

ソースコードはこちら。以下をコピペしてコンパイルすれば上記のものが実行できます。解説はソース内のコメントを参照ください。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ImageShow extends JFrame implements ComponentListener, KeyListener {
  private Container pane;
  private JScrollPane spane;
  private JLabel label;
  private ImageIcon icon;

  public static void main(String[] args){
    ImageShow f = new ImageShow();
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }

  ImageShow(){
    super("画像表示テスト");
    setSize(1000, 800);
    addComponentListener(this);
    addKeyListener(this);
    pane = getContentPane();
    //画像の読み込み
    icon = new ImageIcon("img.png");
    //ラベルに画像を表示
    label = new JLabel();
    label.setIcon(icon);
    //JScrollPaneにセット。縦横のスクロールバーが常に表示されるように
    spane = new JScrollPane(label, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    pane.add(spane);

    //終了処理
    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    addWindowListener(new WindowAdapter(){
      public void windowClosing(WindowEvent e){
        System.exit(0);
      }
    });

    //ルックアンドフィールをGTK+風に
    try{
      UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
    }catch(Exception e){}
  }

  public void keyPressed(KeyEvent e) {
    //スクロールバーの長さを取得(これを矢印キー押下時の移動量とする)
    int sp_size = spane.getVerticalScrollBar().getVisibleAmount();
    //下矢印キー押下イベント
    if(e.getKeyCode()==KeyEvent.VK_DOWN){
      //現在のスクロール位置からバー長さ分だけ下に下げる
      int step = spane.getVerticalScrollBar().getValue() + sp_size;
      spane.getVerticalScrollBar().setValue(step);
    }
    //上矢印キー押下イベント
    if(e.getKeyCode()==KeyEvent.VK_UP){
      //現在のスクロール位置からバー長さ分だけ上に上げる
      int step = spane.getVerticalScrollBar().getValue() - sp_size;
      spane.getVerticalScrollBar().setValue(step);
    }
  }
  public void keyReleased(KeyEvent e) {}
  public void keyTyped(KeyEvent e) {}

  public void componentHidden(ComponentEvent e) {}
  public void componentMoved(ComponentEvent e) {}
  //ウィンドウリサイズ時のイベント
  public void componentResized(ComponentEvent e) {
    //縦スクロールバーの横幅取得
    int bar_width = spane.getVerticalScrollBar().getSize().width;
    //画像の横幅決定(JFrame幅−縦スクロールバーの横幅, 3pxだけ縮めると丁度よい)
    int width = this.getSize().width - bar_width - 3;
    //画像の横幅をウィンドウ幅に合わせる
    Image smallImg = icon.getImage().getScaledInstance(width, -1, Image.SCALE_SMOOTH);
    ImageIcon img = new ImageIcon(smallImg);
    label.setIcon(img);
  }
  public void componentShown(ComponentEvent e) {}
}
 

 

 

スポンサーリンク

 - Java