↓↓クリックして頂けると励みになります。
【37 | レイアウトマネージャー】 << 【ホーム】 >> 【39 | JButtonとJLabel】
ここからはSwingについて取り上げていきます。
JavaのSwingは、Javaプログラミング言語でGUI(グラフィカルユーザインターフェース)アプリケーションを作成するためのツールキットです。
Swingは、AWT(Abstract Window Toolkit)の後継として開発されました。
AWTは、Javaの初期のGUIコンポーネントセットでしたが、SwingはAWTよりも柔軟で強力なGUIを提供します。
Swingは、ボタン、ラベル、テキストフィールド、リストなどのさまざまなGUIコンポーネントを提供し、これらのコンポーネントを組み合わせてアプリケーションのユーザインターフェースを構築することができます。
Swingは、Javaの標準ライブラリの一部として提供されており、ほとんどのJava開発環境に含まれています。
Swingは軽量で、カスタマイズ性が高く、クロスプラットフォームで動作する特徴があります。
これは、SwingがJavaの標準GUIツールキットとして広く採用されている理由の一部です。
Swingを使用すると、Java開発者は、Windows、Mac、Linuxなどのさまざまなプラットフォームで一貫した外観と動作を持つアプリケーションを開発することができます。
Swingは下図のようにAWT上に構築されたGUIを構築するためのパッケージです。
java.lang.Object | +--java.awt.Component | +--java.awt.Panel+--java.applet.Applet+--javax.swing.JApplet | +--java.awt.Window | | | +--java.awt.Frame+--javax.swing.JFrame | +--java.awt.Dialog+--javax.swing.JDialog | +--javax.swing.JWindow | +--javax.swing.JComponent | +--javax.swing.JButton | | | +--javax.swing.JButton | +--javax.swing.JMenuItem+--javax.swing.JMenu +--javax.swing.JPanel +--javax.swing.JTable : :
図の通りSwingコンポーネントは「java.awt.Container」のサブクラスになります。
このことはSwingコンポーネントがレイアウトなどを行えることを示しています。
Swingの多くのコンポーネントは「軽量コンポーネント」と呼ばれており、実行されるシステムとは密接に関係しないコンポーネントです。
AWTの多くのコンポーネントは「重量コンポーネント」です。
またSwingコンポーネントの中でも「アプレット(JApplet)」「フレーム(JFrame)」「ダイアログ(JDialog)」「ウィンドウ(JWindow)」は重量コンポーネントです。
これらSwingの重量コンポーネントを「トップレベル・コンテナ」とも呼びます。
軽量コンポーネントになったことで各システムで見た目が違うということや、場合によっては動作が同様ではないといったことを避けることが出来るようになりました。
しかしSwingの場合、全てをJava側で処理するため動作速度が遅くなる場合が多いです。
Swingを用いたアプリケーションでは、javax.swing.*
パッケージの他に、色や図形描画、イベント処理のために、AWTの機能(java.awt.*
、java.awt.event.*パッケージ
)を使うことが多いです。
Swingの特徴として、AWTの重量コンポーネント(ボタンなど)を置き換えた軽量コンポーネントが用意されています。
それらSwingコンポーネントはさらに追加の機能を持っていることが多いです。
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【SwingDraw1.java】
/** *JPanelに楕円を表示する。SwingDraw.java */ import java.awt.*; import javax.swing.*; public class SwingDraw1 extends JPanel { private final int WIDTH = 400; //JPanelの幅と高さを定義 private final int HEIGHT = 200; private int x=0; //楕円のx座標は0から /**コンストラクタ*/ public SwingDraw1() { super(); //JPanelのコンストラクタを呼び出す setBackground(Color.white); //JPanelの背景色は白 //JPanelの幅と高さを設定 setPreferredSize(new Dimension(WIDTH, HEIGHT)); } /**グラフィックス描画処理*/ public void paintComponent(Graphics g) { //コンポーネント全体を白で描画 g.setColor(Color.white); g.fillRect(0, 0, WIDTH, HEIGHT); //200ミリ秒休止 try { Thread.sleep(200); } catch(InterruptedException ex) { System.err.println(ex); } //x座標を進めて楕円を描画 x+=10; g.setColor(Color.red); g.fillOval(x, 0, 30, 30); g.setColor(Color.green); g.fillOval(x, 50, 30, 30); g.setColor(Color.blue); g.fillOval(x, 100, 30, 30); g.setColor(Color.pink); g.fillOval(x, 150, 30, 30); } /**main()*/ public static void main(String[] args) { SwingDraw1 sample = new SwingDraw1(); JFrame frame = new JFrame("SwingDraw1"); //「閉じる」ボタンが押された場合はフレームを閉じる frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //コンテンツ・ペインにJPanelをadd frame.getContentPane().add(sample, "Center"); frame.pack(); frame.setVisible(true); //右端に行くまでpaintComponent()を呼び出す。 while(sample.x < sample.WIDTH) { sample.repaint(); } } }
JFrameはウィンドウのクローズ・イベント処理を「setDefaultCloseOperation()
」メソッドで設定できます。
具体的には以下のように設定します。
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
ウィンドウが閉じられたときの動作は、以下の定数で決まります。
Swingの軽量コンポーネントは全て「JComponent」が基になっています。
JComponentには以下のような特徴があります。
JComponentはAWTのコンポーネントと同様にサイズを指定することが可能です。
ただし、実際にはレイアウトマネージャーがサイズの最終決定を行うので、設定通りにならない場合もあります。
サイズの設定には、最大サイズを設定する「
void setMaximumSize(Dimension)
」、最小サイズを設定する「void setMinimumSize(Dimension)
」、推奨サイズを設定する「void setPreferredSize(Dimension)
」があります。Demensionはサイズを規定するクラスです。
「幅400・高さ300」のコンポーネントサイズを設定する例を挙げます。
JPanel panel = new JPanel(); panel.setPreferredSize(new Dimension(400, 300));
SwingではCanvasは存在しませんが、Swingコンポーネントの多くはグラフィックスを扱えるので目的に応じて使い分ければよいです。
通常は「JPanel」を使用することが多いです。
グラフィックスの描画自体はJComponent.paint()メソッド
によって実行されます。
正確には特定のコンポーネント描画だけならJComponent.paintComponent()
をオーバーライドし、JComponent.paint()
はコンポーネント(JComponent.paintComponent)やボーダー(JComponent.paintBorder)、あるいは子コンポーネント(JComponent.paintChirdren)を順次実行するので必要ならメソッドをオーバーライドしてJComponent.paint()
自体はオーバーライドしないようにします。
Swingで再描画を行う場合はrepaint()メソッド
を使用しますが、AWTのそれと違いupdate()
に処理を記述する必要はほぼありません。
通常JComponent.update()
はpaint()メソッド
を呼び出す前にコンポーネントをクリアすることもありません。
オーバーライドされていないJComponent.paintComponent()
は背景をクリアします。
repaint()
はなるべく早く書き換えを行うComponent.repaint()
を使用することが多いと思います。
プログラムを実行して動作を確認します。
白いキャンバスに4つの楕円図形が0.2秒ずつ描画して消えるのを繰り返し続けます。
左から右に図形が動いていきます。
フレームの終了ボタンで終了出来ます。
~/Desktop/Programming/JP $ javac SwingDraw1.java ~/Desktop/Programming/JP $ java SwingDraw1
【37 | レイアウトマネージャー】 << 【ホーム】 >> 【39 | JButtonとJLabel】
↓↓クリックして頂けると励みになります。