【Swing】JFrameクラスについて

###(JFrameのクラス階層)
java.lang.Object
→java.awt.Component
→→java.awt.Container
→→→java.awt.Window
→→→→java.awt.Frame
→→→→→javax.swing.JFrame

###(JFrameクラスのコンストラクタ)
```java
JFrame()
//初期状態が不可視な新しいフレームを構築する
```

```java
JFrame(GraphicsConfiguration　gc)
//画面デバイスで指定されたGraphicsConfigurationと空のタイトルでFrameを作成
```

```java
JFrame(String title)
//指定されたタイトルを使用して、初期状態で不可視な新しいFrameを作成
```

```java
JFrame(String title, GraphicsConfiguration gc)
//指定されたタイトルと画面デバイスの指定されたGraphicsConfigurationで、JFrameを作成します。
```

→主に使うのは一番目と三番目のコンストラクタ
→使用例

```java
import javax.swing.JFrame;

class Sample{
  public static void main(String args[]){
    JFrame frame = new JFrame("MyTitle");
  }
}
```

###(メソッド)
```java
public void setVisible(boolean b)
//引数がtrueならフレームを表示
```

```java
public void setTitle(String title)
//引数にタイトルをセット
```
```java
public void setSize(int width, int height)
//引数でフレームの広さ、高さを定義
```
```java
public void setLocation(int x, int y)
//引数でフレームの位置を定義
```
```java
public void setLocationRelativeTo(null);
//引数nullでフレームの位置が中央
```
```java
public void setBounds(int x, int y, int width, int height)
//引数でフレームの位置と広さ高さを定義
```

```java
public void setDefaultCloseOperation(int operation)
//引数にJFrame.EXIT_ON_CLOSEで×ボタンでフレームを終了
```


###(JFrameクラスを継承したサブクラス)
→フレームに対して独自のメソッドなどを追加したい場合はJFrameクラスを継承したサブクラスを定義する
→フレームのサイズや位置などの初期化処理はサブクラスのコンストラクタ内で行う


```java
import javax.swing.JFrame;

//JFrameを継承
class JSample5_1 extends JFrame{
  public static void main(String args[]){
    JSample5_1 frame = new JSample5_1("MyTitle");
    frame.setVisible(true);
  }

//コンストラクタ
  JSample5_1(String title){
    setTitle(title);
    setBounds(100, 100, 600, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}
```

###(ペインの取得とコンポーネント)
→コンポーネントを追加するには
→フレームからペイン(pane)を取得しペインにコンポーネントを追加する
→ペイン(pane)とはそれぞれ異なる目的のためにフレームに定義されているもの

######(ContentPane)
→ContentPaneを取得するためにはJFrameクラスのgetContentPaneメソッドを使う

```java
import javax.swing.JFrame;
import java.awt.Container;

class Sample extends JFrame{
  public static void main(String args[]){
  }

  Sample(String title){
    Container contentPane = getContentPane();//ContentPaneの取得
  }
}
```

→ContentPaneに対してのコンポーネントの追加
→Containerクラスで定義されているaddメソッドを使う

```java
public void add(Component comp, Object constraints)
//一番目の引数はコンポーネントのオブジェクト
//二番目の引数は追加する位置
```

→レイアウトマネージャー:コンポーネントをどうするか
→レイアウトマネージャーは複数種類ある

```
//東西南北中の位置を指定するレイアウトマネージャー
BorderLayout.NORTH
BorderLayout.SOUTH
BorderLayout.EAST
BorderLayout.WEST
BorderLayout.CENTER
```

(ボタン追加)

```Java
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.Container;
import java.awt.BorderLayout;

class Sample extends JFrame{
	public static void main(String[] args){
	JFrame frame = new JFrame();
    	JButton btn = new JButton("aaaa");

	Container contentPane = frame.getContentPane();
	contentPane.add(btn, BorderLayout.NORTH);
	
	frame.setBounds(100, 100, 600, 400);
	frame.setTitle("MyTitle");
    	frame.setVisible(true);
	}

}
```
(出力結果)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538121/172b7f39-c470-f4e8-a71c-4db1fb2ad945.png)


######(ContentPaneの取得の省略)
→新しい環境なら自動でContentPaneを取得してくれるため省略可能

```java
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.Container;
import java.awt.BorderLayout;

class Sample extends JFrame{
	public static void main(String[] args){
	JFrame frame = new JFrame();
    	JButton btn = new JButton("aaaa");

	frame.add(btn, BorderLayout.NORTH);
	
	frame.setBounds(100, 100, 600, 400);
	frame.setTitle("MyTitle");
    	frame.setVisible(true);
	}

}
```

(出力結果)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538121/172b7f39-c470-f4e8-a71c-4db1fb2ad945.png)



###(レイアウトマネージャーの設定)
→フレームでレイアウトマネージャーを設定するにはContentPaneを取得しペインに対して設定する

```java
public void setLayout​(LayoutManager mgr)
//レイアウトマネージャーを設定する
```

```java
//使用例
import javax.swing.JFrame;
import java.awt.FlowLayout;

class Sample extends JFrame{
  public static void main(String args[]){
  }

  Sample(String title){
    Container contentPane = getContentPane();
    contentPane.setLayout(new FlowLayout());
  }
}

```

※現在はContentPaneを取得しなくてもJFrameクラスのsetLayoutメソッドで自動的にContentPaneに設定される

```java
public void setLayout​(LayoutManager manager)
//レイアウトマネージャーを設定する
```

```java
//使用例
import javax.swing.JFrame;
import java.awt.FlowLayout;

class Sample extends JFrame{
  public static void main(String args[]){
  }

  Sample(String title){
    setLayout(new FlowLayout());
  }
}
```

######(背景色)

```java
public void setBackground​(Color bg)
//引数はColorクラスのものを使う
//例:「Color.GREEN」
```

######(アイコン画像)

```java
public void setIconImage(Image image)
//Imaginationクラスをインスタンス化し、画像のパスを引数に渡す
```