Java Swingのサンプル

編集者:Terai Atsuhiro
作成日:2003-09-25
更新日:2010-02-07 (Sun) 21:14:11

概要

このページ以下では、Java Swing での GUI プログラム作成のコツなどを、「小さなサンプル(ソースコード付き)」を使って紹介しています*1

Swing/_ScreenShots

  • 上の画像をクリックするとスクリーンショット一覧に飛びますが、画像が大量にあるので注意してください。

Swingとは

Swing は、GUI(グラフィカル・ユーザ・インタフェース)を作成するための、Java標準のコンポーネントセット(ライブラリ、UIツールキット)です。

Tips一覧


編集方針

  • 最も欲しいものはサンプルである ( steps to phantasien t(2007-07-06)から引用 *2 )
    • http://terai.xrea.jp/data/swing/webstart.png ボタンをクリックする*3だけで、サンプルプログラムを、安全*4簡単に起動することが出来ます。
      • 一時ファイルを保持する設定の場合、Java キャッシュビューア*5*6から、一度試したサンプルを再度実行したり、全部まとめてアンインストール(javaws -uninstall)できます。
  • SSCCE ( Short, Self Contained, Correct Example )
    • すべての記事にソースコードや画像などのリソース、これらを簡単にコンパイル、実行するためのbuild.xmlをまとめたzipファイルを添付しています。

更新履歴

  • 一月以上前の更新履歴
    • ソースの不具合や、誤字の修正などは随時行っていますが、簡単なものについては記録していないので、必要な場合は各ページの上部メニューからdiff(変更された箇所をみる)かbackup(更新履歴を参照する)を利用してください。

動作環境

このサイトにあるサンプルの、動作・テスト環境や、JDKのダウンロード、利用方法、質問、不具合報告についてお願いなどを記述しています。

参考リンク

参考にしたサイトなどのリンクをまとめています。

以前このページの下にあった「Java Swing Hacks」本のレビュー?は、すべててんぷらメモ@はてなに移動しました。


コメント

Swing関係のコメントや、ネタのリクエストなどがあれば書き込んでみてください。

Show recent 10 comments. Go to the comment page.

  • JTableで、セルの結合や、二段組みレイアウトにするのは可能でしょうか? -- わさびもち? 2008-10-29 (Wed) 03:32:41
    • セルの結合は、Multi-Span Cellがよく知られています。(JTableの?)二段組みはよく分からないです。隣のセルに文字列が流れるような組版なんでしょうか? -- terai 2008-10-30 (木) 13:44:28
  • お早い回答ありがとうございます。セルの結合が出来るなら、HTMLと同様の考え方で、二段組みも可能だと考えられます。 解説しているサイトなどはあるのでしょうか?もしなければ頑張って読みます... -- わさびもち? 2008-10-30 (Thu) 03:54:05
    • 自分とわさびもちさんの考えている段組が、どうも食い違っているような感じがします(例えばセル結合とHTMLと段組の関係がよく分からないです)。参考になる画像などがあればいいのですが・・・。 -- terai 2008-10-31 (金) 14:34:20
  • 私の考えていた段組みは、一つのレコードを複数行に表示するテーブルのことです。確かに、段組みというとWordなどでもある、二段組みなどになりますよね。すいません。 -- わさびもち? 2008-10-30 (Thu) 21:24:23
  • 始めまして。 JScrollPaneで中身のコンポーネントの大きさを変更してからsetViewPositionをすると、場所によってちゃんと移動してくれないのですが、どうしてなのでしょうか? -- mogu? 2009-01-17 (土) 21:35:26
    • はじめまして。移動というのがよく分かりません。カーソルキーとか、マウスでスクロールバーを動かしているのでしょうか?ちょっとしたサンプルがあるとなにか分かるかもしれません。 -- terai 2009-01-19 (月) 13:28:13
  • サンプルをアップロードいたしましたhttp://www1.axfc.net/uploader/He/so/184421 DLキーはswingです ソースコードの冒頭に説明書いてあります -- mogu? 2009-01-19 (月) 23:01:22
    • おはようございます。サンプルどうもです。canvasの方もscrollRectToVisibleでスクロールさせておくとうまくいっているようです。 -- terai 2009-01-20 (火) 08:43:39
      //http://terai.xrea.jp/data/swing/Sample.java
      public void zooming(double zoom) {
        double origzoom = this.zoom;
        this.zoom = zoom;
        Point p = spCanvas.getViewport( ).getViewPosition( ); //左上の座標
        canvas.setPreferredSize(
          new Dimension((int)( PWIDTH * zoom ) , (int)( PHEIGHT * zoom )));
        canvas.revalidate( );
        // 左上の位置を拡大縮小した大きさでの位置にあわせる
        //<ins>
        Point pt = new Point(
          (int)( p.x * zoom / origzoom ) , (int)( p.y * zoom / origzoom ));
        canvas.scrollRectToVisible(new Rectangle(pt, spCanvas.getViewport( ).getSize()));
        //</ins>
        spCanvas.getViewport( ).setViewPosition(pt);
      }
      
    • Swing/HandScrollもすこし更新してみました。JComponent#scrollRectToVisibleの代わりに、JViewport#setViewPositionを使用すると、中のViewの外までスクロールできるので、このあたりが拡大したときに影響していたのかも。 -- terai 2009-01-19 (Mon) 17:10:41
  • しっかりと移動することができました ありがとうございます!一週間ほど試行錯誤してたのですが、scrollRectToVisibleは盲点に入ってて試していませんでした。本当にありがとうございました。 -- mogu? 2009-01-21 (水) 20:46:45
  • 再度失礼します。scrollRectToVisibleで出来たと思ったのですが、今度は縮小のときに違う方向に飛んでしまうようになりました。ですが、setViewPositionの方は縮小は問題ないので場合わけでなんとかできました。解決の助けをいただきありがとうございました。 -- mogu? 2009-01-21 (水) 21:43:43
  • Swing/_JFrameが壊れていたのを修正。 -- terai 2009-03-17 (火) 20:41:02
  • swingを勉強してるのですが、パネルを作る際コードが長くなってしますので、それぞれにJPanelを継承したクラスを作りフレームに貼り付けたいのですがうまくいきません。こういうことはできないのでしょうか?また普通はこんなことしないのでしょうか? -- さと? 2009-07-28 (火) 15:11:22
    • フレームへの貼り付けがうまくいかないとのことですが、何かエラーになるのでしょうか?一つのJPanelにコンポーネントを並べるのではなく、コンポーネントを複数のSubJPanelに分割して作成し、そられのJPanelを一つのMainJPanelにまとめて配置する( frame.getContentPane().add(new Hoge().getMainJPanel(), BorderLayout.CENTER) )のは、よくある手法だと思います。パネルに分けるときに「JPanelを継承」*7は、JPanelのメソッドをなにかオーバーライドするのでなければ、あまりやらないかもしれません。IDEなどを使えば、initComponents()とか適当なメソッドを作って、その中で設定していくようになっているのが多いような気がします。 -- terai 2009-07-28 (火) 16:20:48
  • はじめまして。 eclipseでguiアプリケーションを作っています。リストの項目を追加、削除するプログラムをつくってみたのですが、動作はうまく動いてるんですが、最初実行したときに、フレームの中に何も表示されずに、マウスでフレームを触ると表示されるのです。これはコード上で問題があるのか、eclipse上で実行した場合の仕様(バグ?)なのでしょうか? -- yuu? 2009-08-17 (月) 17:28:48
    • はじめまして。ソースを見ないとハッキリとは分からないのですが、以下に似たような動作?をするサンプルコードを置いておきます。このサンプルには、EDT(Event Dispatch Thread)の無視、JFrame#setVisible(true)の順番がおかしいといった問題があります。 -- terai 2009-08-17 (月) 18:29:51
      import java.awt.*;
      import javax.swing.*;
      public class Test{
        public static void main(String[] args) {
          //<XXX>
          createAndShowGUI();
          //</XXX>
          //EventQueue.invokeLater(new Runnable() {
          //  public void run() {
          //    createAndShowGUI();
          //  }
          //});
        }
        public static void createAndShowGUI() {
          JFrame frame = new JFrame();
          //<XXX>
          frame.setVisible(true);
          frame.setSize(300,200); //or frame.pack();
          frame.setLocationRelativeTo(null);
          //</XXX>
          frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
          frame.getContentPane().add(new JScrollPane(new JTree()));
          //frame.setSize(320,240); //or frame.pack();
          //frame.setLocationRelativeTo(null);
          //frame.setVisible(true);
        }
      }
      
    • このような現象を解消するには、<XXX>の内部をコメントアウトして、現在コメントアウトされている行を使うようにすると良いはず…です。 -- terai 2009-08-17 (月) 18:37:03
Name:

*1 SwingどころかJFCにも無関係なTipsも混在していますが、細かいことはあまり気にしない方向で…
*2 via:濃縮還元オレンジニュース
*3 このサイトではJavaScriptを有効しておく必要があります
*4 これらのサンプルは、Java Web Start のサンドボックス内で実行され、ローカルPCのリソースにはアクセスしません。アクセスする必要のあるサンプルは、ソースファイルなどをダウンロードして確認してから実行してください。
*5 参考: 某開発者の独り言: JWSのJavaアプリケーションキャッシュビューア
*6 Java コントロールパネル(javaws -viewer) から一時ファイル表示でもキャッシュ一覧が起動します。
*7 このサイトでは、サンプルだし面倒だからテンプレにしちゃっていますが・・・