Gachoooon | サンプルソース | |
---|---|---|
往年の名ギャグ「ガチョーン」とjavax.swing.JScrollBarのステキでキュートなマリアージュ。スクロールバーの上下に伴い、拡大縮小する画像。その味わいを、じっくりとご堪能ください。 |
Gachoooon.java |
/** * 愛のJava256本ノック for Java 5.0 * Javaサンプルソース ver0.2C "Gachoooon" * Gachoooon.java 「JScrollBarで画像を拡大縮小」 * * 2005/09/23 制作:安永ノリカズ * * 【コンパイル&実行方法】 * >javac Gachoooon.java * >java Gachoooon * 【キーワード】 * 最大値(maximum), 最小値(minimum), 現在値(current value), 範囲(extent), * 方向(orientation), 垂直(vertical), 水平(horizontal), 谷啓 * 【試してみよう】 * 横スクロールバーで「ガチョーン」。 * JScrollBarの最大値、最小値、ツマミの長さを変えてみる。 */ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; import java.lang.String; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollBar; public class Gachoooon extends JFrame implements AdjustmentListener { DrawPanel I00; public Gachoooon() { JScrollBar L00 = new JScrollBar(JScrollBar.VERTICAL); L00.addAdjustmentListener(this); add(L00, BorderLayout.EAST); I00 = new DrawPanel(L00.getMaximum() - L00.getVisibleAmount()); add(I00, BorderLayout.CENTER); } public void adjustmentValueChanged(AdjustmentEvent A00) { I00.M00(A00.getValue()); I00.repaint(); } public static void main(String[] A00) { Toolkit.getDefaultToolkit().setDynamicLayout(true); Gachoooon L00 = new Gachoooon(); L00.setTitle("谷啓になったつもりで!"); L00.setDefaultCloseOperation(EXIT_ON_CLOSE); L00.setBackground(Color.white); L00.pack(); L00.setVisible(true); } } class DrawPanel extends JPanel { static final String C00 = "image/gachoooon.gif"; private Image I00; private int I01; // 幅 private int I02; // 高さ private int I03; // 最大値 private int I04; // 現在値 public DrawPanel(int A00) { this.I03 = A00; setBackground(Color.white); I00 = new ImageIcon(C00).getImage(); I01 = I00.getWidth(this); I02 = I00.getHeight(this); setPreferredSize(new Dimension(I01, I02)); } public void paintComponent(Graphics A00) { super.paintComponent(A00); int L00 = I01 * I04 / I03; int L01 = I02 * I04 / I03; A00.drawImage(I00,(getWidth() - L00) / 2, (getHeight() - L01) / 2, L00, L01, this); } public void M00(int A00) { this.I04 = A00; } } /* ■ クラスの外でちょっと一言 ■ JScrollBarを構成する要素は、最小値、最大値、現在値、表示範囲(=ツマミの長 さ)の4つ。ツマミを動かせばAdjustmentEventが発生し、そのイベントでツマミ の位置を取得することができます。 デフォルトでは、最小値=0、最大値=100、現在地=0、ツマミの長さ=10のスク ロールバーが生成されます。では、そのデフォルトのスクロールバーが返す最大 の値はいくつになるでしょう? 答えは、最大値(100)−ツマミの長さ(10)の90 です。 そもそもスクロールバーとは、広い領域の一部分を表示するためにあるもの。ツ マミの長さは表示する範囲を表します。ですので、この例でいえば、90の位置か ら10の分量を表示すれば、全体の100を表示することが可能で、スクロールバー の機能としてはこれで充分なわけです。 そういう観点からすると、画像の拡大縮小にスクロールバーを使うのは邪道で、 スライダー(JSlider)の方が適切と思われます。でも今回は、ウィンドウの右側 にある見慣れたスクロールバーで「ガチョーン」をするのが面白さなんで、ご勘 弁を。 最後に、近頃の若いもんに忠告。ただズルッとスクロールバーを下げるなんて野 暮なマネはしないように。下の方で細かく上下に動かして「ガチョーン」のカメ ラワークを再現するんだぞ。頼むからな。 */