JPanel を継承する

JPanel(Swing) を継承して矩形を描画します。
JPanel を継承すると自動的に Double Buffer が使われるので、チラツキが少なくなるようです。

前田稔の超初心者のプログラム入門

プログラムの作成

  1. JPanel(Swing) を継承して矩形を描画する方法です。
    //★ JPanel を継承する    前田 稔
    import java.awt.*;
    import javax.swing.*;
    
    class App extends JPanel
    {
        // Main
        public static void main(String args[])
        {   new App();
        }
    
        // Constructor
        public App()
        {   JFrame jframe = new JFrame("DrawRect");
            Container c = jframe.getContentPane();
            c.add(this, BorderLayout.CENTER);
            jframe.setSize(160, 120);
            jframe.setVisible(true);
        }
    
        // Paint Method
        public void paintComponent(Graphics g)
        {   g.setColor(Color.red);
            g.drawRect(10,10,120,50);
        }
    }
    
  2. java のソースファイルをコンパイルして class オブジェクトを実行して下さい。
    コンパイルの詳細は Java2 を動かす を参照して下さい。

プログラムの説明

  1. Swing を使うので javax.swing.* をインポートして下さい。
    Swing では AWT の機能も使うので java.awt.* もインポートします。
    extends で JPanel を継承します。
        import java.awt.*;
        import javax.swing.*;
        class App extends JPanel
        {
        
  2. main() では App Class をインスタンス化(生成)するだけです。
        // Main
        public static void main(String args[])
        {   new App();
        }
        
  3. コンストラクタでは、パネルに App Class を設定(張り付け)ます。
    まず JFrame を生成して、Container を取得します。
    そして Container に対して c.add(this, BorderLayout.CENTER) で App Class を設定します。
        // Constructor
        public App()
        {   JFrame jframe = new JFrame("DrawRect");
            Container c = jframe.getContentPane();
            c.add(this, BorderLayout.CENTER);
            jframe.setSize(160, 120);
            jframe.setVisible(true);
        }
        
  4. paintComponent() では赤色の矩形を描画します。
    JFrame を継承した場合とメソッドの名前が変わっています。
        // Paint Method
        public void paintComponent(Graphics g)
        {   g.setColor(Color.red);
            g.drawRect(10,10,120,50);
        }
        

プログラムの作成

  1. JPanel を継承して Constructor を使わずに作成します。
    //★ JPanel を継承する(Constructor 無し)    前田 稔
    import java.awt.*;
    import javax.swing.*;
    
    class AppDirect extends JPanel
    {
        // Main
        public static void main(String args[])
        {   AppDirect app = new AppDirect();
            JFrame jframe = new JFrame("DrawRect");
            Container c = jframe.getContentPane();
            c.add(app, BorderLayout.CENTER);
            jframe.setSize(160, 120);
            jframe.setVisible(true);
        }
    
        // Paint Method
        public void paintComponent(Graphics g)
        {   g.setColor(Color.red);
            g.drawRect(10,10,120,50);
        }
    }
    
  2. main() で直接生成すると、ソースコードが短くて簡単なようですが、色々な問題も発生します。
    その一つが main() は static で宣言しなければならず、多少の制限が加わることです。
    またこの方法は「スレッド安全性上お勧め出来ない」の記述を見かけたことがあります。

プログラムの作成

  1. JPanel を継承して Container を使わずに作成します。
    Container を省略する方法は古いバージョンでは動かないかも知れません。
    //★ JPanel を継承する(Constructor 無し)    前田 稔
    import java.awt.*;
    import javax.swing.*;
    
    class AppDirect2 extends JPanel
    {
        // Main
        public static void main(String args[])
        {   AppDirect2 app = new AppDirect2();
            JFrame jframe = new JFrame("DrawRect");
            jframe.add(app, BorderLayout.CENTER);
            jframe.setSize(160, 120);
            jframe.setVisible(true);
        }
    
        // Paint Method
        public void paintComponent(Graphics g)
        {   g.setColor(Color.red);
            g.drawRect(10,10,120,50);
        }
    }
    
  2. 説明は先のプログラムを参照して下さい。

超初心者のプログラム入門(Java2)