JAVA-GUI グラフィカル ユーザー インターフェイス [Swing]

GUI - グラフィカル ユーザー インターフェイスの知識

目次

GUI - グラフィカル ユーザー インターフェイスの知識

1. GUIの概要

1.1 Swing を初めて知る 

2. Swing の最上位コンテナ

2.1 Jフレーム

2.2 Jダイアログ

3. レイアウトマネージャー

3.1 BorderLayout (ボーダーレイアウトマネージャー)

3.2 FlowLayout(フローレイアウトマネージャー)

3.3 GridLayout (グリッドレイアウトマネージャー)

3.4 CardLayout (カードレイアウトマネージャー)

4. イベント処理

 4.1 フォームイベント

 4.2 マウスイベント

 4.3 キーボードイベント

 5. スイング共通コンポーネント

5.1 パネルの組み立て

5.2 テキストコンポーネント

5.3 ラベルのコンポーネント

5.4 ボタンコンポーネント

5.4.1 JCheckBox チェックボックス

5.4.2 JRadioButtonラジオボタン

5.5 JComboBox (ドロップダウン ボックス コンポーネント)

5.6 メニューのコンポーネント 

5.6.1 プルダウンメニュー

5.6.2 JPopupMenu(ポップアップメニュー) 


1. GUIの概要

         GUI グラフィカル ユーザー インターフェイス (グラフィカル ユーザー インターフェイス、GUI、グラフィカル ユーザー インターフェイスとも呼ばれる) は、アプリケーション プログラムによってユーザーが操作するために提供されるグラフィカル インターフェイスであり、ウィンドウ、メニュー、ボタン、ツールバー、およびその他のさまざまなグラフィカル インターフェイスが含まれます。要素。

        GUI 設計は豊富なクラス ライブラリを提供します。これらのクラスは、AWT および Swing と呼ばれる java.awt および javax.swing パッケージにあります。

        Swing は、AWT のすべての機能を実現するだけでなく、より豊富なコンポーネントと機能も提供します。

この記事は主に Swing の学習に焦点を当てており、参考資料「Java 基礎入門」を参照してください。

1.1 Swing を初めて知る 

        Swing は Java 言語によって開発された軽量コンポーネントであり、基礎となる層は AWT に基づいているため、クロスプラットフォーム アプリケーションはプラグイン可能な外観スタイルを使用でき、Swing はより簡潔なコード、柔軟な関数、モジュラー コンポーネントを使用して、エレガントなユーザーインターフェイスを作成します。Swing は AWT の代替品ではなく、元の AWT を補足するものであることに注意してください。

        Swing コンポーネントのすべてのクラスは Container クラスから継承され、GUI 開発の機能に従って 2 つの主要なブランチ、コンテナ ブランチ (ウィンドウ ウィンドウとパネル パネルを含む) とコンポーネント ブランチが拡張されます。

        コンテナ ブランチ: グラフィカル ユーザー インターフェイス ウィンドウを実装するように設計されています。

        コンポーネントブランチ:データ、要素、人間とコンピュータの対話コンポーネントをコンテナに詰め込むなどの機能を実現することです。

Swing コンポーネントの継承図

2. Swing の最上位コンテナ

        Swing は、JFrame、JDialog、および JApplet という 3 つの主要なトップレベル コンテナ クラスを提供します。

2.1 Jフレーム

        Frame と同様に、JFrame は独立したトップレベル ウィンドウであり、他のコンテナに配置することはできません。JFrame は、ウィンドウの最小化、ウィンドウ サイズの設定など、一般的なウィンドウの基本的な機能をすべてサポートしています。以下は、JFrame を使用する効果を示す小さなケースです。

JFrame のデモコード:

package javaSE.GUI;

import javax.swing.JFrame;

/*
JFrame的常量解释
 DO_NOTHING_ON_CLOSE:当窗口关闭时,不做任何处理
 HIDE_ON_CLOSE:当窗口关闭时,隐藏这个窗口
 DISPOSE_ON_CLOSE:当窗口关闭时,隐藏并处理这个窗口(只有当它是最后一个窗口,才会退出JVM)
 EXIT_ON_CLOSE:当窗口关闭时,退出程序。(直接退出jvm)
*/

public class MyJFrame {
 public static void main(String[] args) {
	//JFrame指一个窗口,构造方法参数为窗口标题
	 JFrame frame = new JFrame("我的第一个窗口");

	 //frame.setTitle("修改窗口标题");
	 
     //设置关闭窗口时的默认操作。设置当窗口关闭时,退出程序
	 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	 //设置窗口大小
	 frame.setSize(400,300);
	 
	 //窗口弹出的初始位置
	 frame.setLocation(400,400);
	 
	 //显示窗口(这条语句 没写/填写false 窗口不会显示)
	 frame.setVisible(true);
 }
}

結果を示す:

2.2 Jダイアログ

        JDialog は、Swing のもう 1 つのトップレベル ウィンドウであり、Dialog と同様にダイアログを表します。

        JDialog ダイアログ ボックスは、モーダル ダイアログ ボックスと非モーダル ダイアログ ボックスの 2 つのタイプに分類できます。このうち、モーダル ダイアログ ボックスは、ユーザーが他のウィンドウとの対話を続行する前に、ダイアログ ボックスが処理されるまで待つ必要があることを意味します。モードレス ダイアログを使用すると、ユーザーはダイアログの処理中に他のウィンドウと対話できます。

         ダイアログ ボックスはモーダルまたは非モーダルであり、Dialog オブジェクトの作成時にコンストラクターにパラメーターを渡すか、JDialog オブジェクトの作成後に setModal() メソッドを呼び出すことによって設定できます。

  JDialogの一般的な構築方法 

JDialog(フレーム所有者) 構築方法。非モーダル ダイアログ ボックスの作成に使用されます。所有者はダイアログ ボックス (トップレベル ウィンドウ JFrame) の所有者です。
JDialog(フレーム所有者、文字列タイトル) コンストラクター。指定されたタイトルを持つ非モーダル ダイアログ ボックスを作成します。
JDialog(フレーム所有者、ブール値モーダル) 指定されたモードで無題のダイアログを作成します

JDialog デモ コード:

package javaSE.GUI;

import javax.swing.JDialog;
import javax.swing.JFrame;

/*
 * JDialog对话框
 *  模式对话框:用户需要等到处理完对话框后才能继续与其它窗口交互。
 *  非模式对话框:允许用户在处理对话框的同时与其它窗口交互。
 *  
 *  JDialog(Frame owner, String title, boolean modal)
 *  	owner:对话框所依赖的窗口
 *		title:窗口标题
 *		modal:true模式,false非模式
 *	
 */
public class MyJDialog {
	public static void main(String[] args) {
		
		//创建JFrame容器窗口,窗口名称JFrameTest
		JFrame frame = new JFrame("JFrameTest");
		//设置关闭窗口时的默认操作。EXIT_ON_CLOSE:当窗口关闭时,退出程序。
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(400,300);//设置窗口大小
		frame.setVisible(true);//显示窗口
		
		//创建JDialog(对话框所有者,标题,true模式/false非模式)
		JDialog dialog = new JDialog(frame,"JDialog对话框",true);
		//设置关闭窗口时的默认操作。HIDE_ON_CLOSE:当窗口关闭时,隐藏这个窗口
		dialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
		dialog.setSize(300,200);//窗口大小
		dialog.setVisible(true);//显示窗口
		
		
	}

}

結果を示す:

JDialog ダイアログ = new JDialog(frame,"JDialog ダイアログ",true);

true の場合、モーダル ダイアログ ウィンドウを意味します。JDialog ダイアログ ボックスが処理される前は、JFrameTest ウィンドウで操作を実行できません。true を false に変更すると、ノンモーダルダイアログウィンドウになります。

 JDialog ダイアログ = new JDialog(frame,"JDialog ダイアログ ボックス",false);//非モーダル ダイアログ ウィンドウ

非モーダル ダイアログ ウィンドウに変更すると、JDialog ダイアログ ボックスの処理中に JFrameTest ウィンドウを操作することもできます。

変更されたエフェクト表示:

3. レイアウトマネージャー

        Swing コンポーネントは単独で存在することはできず、コンテナ内に配置する必要があり、コンテナ内のコンポーネントの位置とサイズはレイアウト マネージャによって決定されます。Swing ツールは、AWT に基づいた 8 つのレイアウト マネージャーを提供します。 BorderLayout (ボーダー レイアウト マネージャー)
                BoxLayout (ボックス レイアウト マネージャー)
                CardLayout (カード レイアウト マネージャー)
                FlowLayout (フロー レイアウト マネージャー)
                GridLayout (グリッド レイアウト マネージャー)
                GridBagLayout (グリッド バッグ レイアウト マネージャー)
                GroupLayout (グループ レイアウト マネージャー)
                SpringLayout (フレキシブル レイアウト マネージャー)

以下に、よく使われるレイアウトマネージャーについて説明します。

3.1 BorderLayout (ボーダーレイアウトマネージャー)

        BorderLayout (ボーダー レイアウト マネージャー) は、コンテナを 5 つのエリア (東 (EAST)、南 (SOUTH)、西 (WEST)、北 (NORTH)、中央 (CENTER) の 5 つのエリアに分割する、より複雑なレイアウト方法です。コンポーネントは、これら 5 つの領域のいずれかに配置できます。

        BorderLayout レイアウト マネージャーのコンテナーにコンポーネントを追加する場合は、add(Component comp, Objectconstraints) メソッドを使用する必要があります。この場合、パラメーター制約はオブジェクト型であり、パラメーターを渡すときに BorderLayout クラスによって提供される 5 つの定数を使用できます。 、EAST (東)、SOUTH (南)、WEST (西)、NORTH (北)、CENTER (中央) です。

 BorderLayout コード表示:

package javaSE.GUI;

import java.awt.*;
import javax.swing.*;

/*
 * BorderLayout(边界布局管理器)
 */
public class BorderLayoutTest1 {
	public static void main(String[] args) {
		//创建一个名为BorderLayout的顶级容器窗口
		JFrame frame = new JFrame("BorderLayout");
		
		//设置窗体的布局管理器为BorderLayout
		frame.setLayout(new BorderLayout());
		frame.setSize(300,300); 	//设置窗体大小
		frame.setLocation(300,200);	//设置窗体显示位置
		
		//下面的代码是创建五个按钮主键
		JButton but1 = new JButton("NORTH(北)");
		JButton but2 = new JButton("SOUTH(南)");
		JButton but3 = new JButton("WEST(西)");
		JButton but4 = new JButton("EAST(东)");
		JButton but5 = new JButton("CENTER(中)");
		
		//将创建好的按钮组件添加到窗体中,并设置按钮所在的区域
		frame.add(but1, BorderLayout.NORTH);//北
		frame.add(but2, BorderLayout.SOUTH);//南
		frame.add(but3, BorderLayout.WEST);	//西
		frame.add(but4, BorderLayout.EAST);	//东
		frame.add(but5, BorderLayout.CENTER);//中
		
		//窗体可见
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口时,退出应用程序
		
		
	}
}

結果を示す:

ボタンの位置を 1 つ減らして追加するとどうなるでしょうか? 北の位置のボタンを追加せずに試してみましょう

//不添加位置为北的按钮(先注释掉下面这行代码)
//frame.add(but1, BorderLayout.NORTH);//北

 位置が北であるボタンの効果をコメントアウトします。

3.2 FlowLayout(フローレイアウトマネージャー)

        FlowLayout はフロー レイアウト マネージャーであり、最も単純なレイアウト マネージャーです。FlowLayout レイアウト マネージャーを使用する場合、コンテナーは追加された順序でコンポーネントを左から右に配置します。コンテナの境界に達すると、コンポーネントは次の行の先頭に自動的に配置されます。これらのコンポーネントは、左揃え、中央揃え (デフォルト)、または右揃えにできます。

   FlowLayout コンストラクター

FlowLayout() コンポーネントはデフォルトで中央に配置され、水平方向と垂直方向の間隔はデフォルトで 5 単位になります。
FlowLayout(int align) コンテナに対するコンポーネントの配置を指定します。水平方向と垂直方向の間隔のデフォルトは 5 単位です
FlowLayout(int align,int hgap,int vgap) コンポーネントの配置と水平方向と垂直方向の間隔を指定します

FlowLayoutの構築方法:

このうち、align は、各行のコンテナの境界線を基準としたコンポーネントの配置をそれぞれ決定します。

  FlowLayout.LEFT (左揃え)
  FlowLayout.RIGHT (右揃え)
  FlowLayout.CENTER (中央揃え)

パラメータ hgap と vgap はそれぞれ、コンポーネント間の水平方向と垂直方向の間隔を設定し、任意の値を入力できます。

FlowLayout コードの表示:

package javaSE.GUI;


import java.awt.*;
import javax.swing.*;

/*
 * FlowLayout(流式布局管理器)
 * 
 *FlowLayout.LEFT   (左对齐)
 *FlowLayout.RIGHT  (右对齐)
 *FlowLayout.CENTER (居中对齐)
 */
public class FlowLayoutTest {
	public static void main(String[] args) {
		//创建一个名为FlowLayout的窗体
		JFrame f = new JFrame("FlowLayout");
		
		//设置窗体中的布局管理器为FlowLayout
		//所有组件左对齐,水平间距为20,垂直间距为24
		f.setLayout(new FlowLayout(FlowLayout.LEFT,20,24));
		f.setSize(400,200);		//设置窗体大小
		f.setLocation(300,200); //设置窗体显示位置
		
		//向容器添加组件
		f.add(new JButton("老大"));
		f.add(new JButton("老二"));
		f.add(new JButton("老三"));
		f.add(new JButton("老四"));
		f.add(new JButton("老五"));
		f.add(new JButton("老六"));
		
		//窗体可见
		f.setVisible(true);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口时,退出应用程序
		
	}
}

結果を示す:

3.3 GridLayout (グリッドレイアウトマネージャー)

        GridLayout (グリッド レイアウト マネージャー) は、垂直線と水平線を使用してコンテナーを n 行 m 列の等しいサイズのグリッドに分割し、各グリッドにコンポーネントを配置します。

         コンテナに追加されたコンポーネントは、最初に行 1、列 1 (左上隅) のグリッドに配置され、次に他のコンポーネントが行 1 のグリッドに左から右に配置されます。行がいっぱいになったら、次の手順に進みます。次の行 コンポーネントを左から右に配置します

GridLayout構築メソッド

グリッドレイアウト() デフォルトでは行が 1 つだけあり、各コンポーネントが 1 列を占めます。
GridLayout(int 行, int 列) コンテナの行数と列数を指定します。
GridLayout(int rows,intcols,int hgap,int vgap) コンテナの行数と列数、コンポーネント間の水平方向と垂直方向の距離を指定します。

GridLayout コード表示:

package javaSE.GUI;

import java.awt.*;
import javax.swing.*;

/*
 * GridLayout(网格布局管理器)
 */
public class GridLayoutTest {
	public static void main(String[] args) {
		//创建一个名为GridLayout的窗体
		JFrame f = new JFrame("GridLayout");
		

		//设置窗体中的布局管理器GridLayout
		//设置该窗体为3*3的网格
		f.setLayout(new GridLayout(3,3));
		f.setSize(300,300);		//设置窗体大小
		f.setLocation(400,400); //设置窗体显示位置
		
		//使用循环添加8个按钮到GridLayout容器中
		for(int i = 1; i <= 8; i++) {
			Button btn = new Button(i + "号键");
			f.add(btn);
		}
		
		//窗体可见
		f.setVisible(true);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口时,退出应用程序
		
		
	}

}

結果を示す:

3.4 CardLayout (カードレイアウトマネージャー)

        CardLayout (カード レイアウト マネージャー) はインターフェイスを一連のカードとみなし、いつでもそのうち 1 枚だけが表示され、このカードがコンテナーの領域全体を占めます。

CardLayout コンストラクター

void first(コンテナ親)

親コンテナの最初のカードを表示します

void last(コンテナ親)

親コンテナの最後のカードを表示します

voidPrevious(コンテナ親)

親コンテナの前のカードを表示します

void next(コンテナ親)

親コンテナの次のカードを表示します

void show(コンテナ親,

文字列名)

親コンテナーに name という名前のコンポーネントを表示します。存在しない場合は何も起こりません。

CardLayout コードの表示:

package javaSE.GUI;

import java.awt.*;
import java.awt.event.*;

/*
1、CardlayoutTest类继承Frame类,实现ActionListener接口
2、在该类中定义Panel面板放置卡片,再定义一个Panel面板放置按钮
3、定义卡片布局对象,在卡片面板中添加2个文本标签分别为“传智播客”和“黑马程序员”
4、定义一个方法实现按钮的监听触发,并对触发事件做出相应的处理
*/
class CardlayoutTest extends Frame implements ActionListener {
	Panel cardPanel = new Panel();              // 创建Panel面板放置卡片
	Panel controlpaPanel = new Panel();         // 创建Panel面板放置按钮
    Button nextbutton, preButton;	//创建按钮
	CardLayout cardLayout = new CardLayout();//定义卡片布局对象
	
	public CardlayoutTest() { //定义构造方法,设置卡片布局管理器的属性
		
		cardPanel.setLayout(cardLayout); // 设置cardPanel面板对象为卡片布局
		// 在cardPanel面板对象中添加3个文本标签
		cardPanel.add(new Label("蛋炒饭", Label.CENTER));
		cardPanel.add(new Label("回锅肉", Label.CENTER));
		cardPanel.add(new Label("大头鱼", Label.CENTER));
		
		// 创建两个按钮对象
		nextbutton = new Button("下一张卡片");
		preButton = new Button("上一张卡片");
		
		// 为按钮对象注册监听器
		nextbutton.addActionListener(this);
		preButton.addActionListener(this);
		
		// 将按钮添加到controlpaPanel【控制面板】中
		controlpaPanel.add(preButton);
		controlpaPanel.add(nextbutton);
		
		// 将cardPanel面板放置在窗口边界布局的中间,窗口默认为边界布局
		this.add(cardPanel, BorderLayout.CENTER);
		// 将controlpaPanel面板放置在窗口边界布局的南区,
		this.add(controlpaPanel, BorderLayout.SOUTH);
		
		setSize(300, 200); //设置窗口大小	
		setVisible(true);  //显示窗口
		// 为窗口添加关闭事件监听器
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				CardlayoutTest.this.dispose();
			}
		});
		
		
	}
	
	// 下面的代码实现了按钮的监听触发,并对触发事件做出相应的处理
	public void actionPerformed(ActionEvent e) {
		// 如果用户单击nextbutton,执行的语句
		if (e.getSource() == nextbutton) {
		// 切换cardPanel面板中当前组件之后的一个组件,若当前组件为最后一个组件,则显示第一个组件。
			cardLayout.next(cardPanel);
		}
		if (e.getSource() == preButton) {
		// 切换cardPanel面板中当前组件之前的一个组件,若当前组件为第一个组件,则显示最后一个组件。
			cardLayout.previous(cardPanel);
		}
	}
	

}
public class Test {
	public static void main(String[] args) {
		new CardlayoutTest();//创建CardlayoutTest实例
	}
}

結果を示す:

4. イベント処理

        Swing コンポーネントのイベント処理は、ユーザーのアクションに応答するように設計されています。Swing イベント処理のプロセスでは、主に次の 3 種類のオブジェクトが関係します。

1. イベント ソース (コンポーネント): イベントが発生する場所。通常は、ウィンドウ、ボタン、メニューなど、イベントを生成するコンポーネントです。 

2. イベント オブジェクト (Event): GUI コンポーネント上で発生する特定のイベント (通常はユーザーによる操作) をカプセル化します。

3. リスナー (Listener): イベント ソースで発生するイベントをリッスンし、さまざまなイベントに応答するオブジェクト (オブジェクトにはイベント ハンドラーが含まれます)。イベントハンドラ: 受信したイベントオブジェクトをリスナーオブジェクトがそれに応じて処理するためのメソッド

AWTでは豊富なイベントが提供されており、大きく分けてフォームイベント、マウスイベント、キーボードイベント、アクションイベントなどが含まれます。

 イベント処理フローチャート

         プログラム内でイベント監視機構を実装するには、まずイベント リスナーのインターフェイスを実装するクラスを定義する必要があります (たとえば、Window 型のウィンドウには WindowListener を実装する必要があります)。次に、addWindowListener() メソッドを使用してイベント ソースのイベント リスナー オブジェクトを登録します。イベント ソースでイベントが発生すると、イベント リスナー オブジェクトがトリガーされ、イベント リスナーは対応するメソッドを呼び出して対応するイベントを処理します。

それを感じるために小さな例を書いてみましょう

 コード表示:

package javaSE.GUI;

import java.awt.event.*;
import javax.swing.*;


/*
 * 实现步骤
 *  在JFrame窗口中添加一个JButton按钮组件
 *  同时通过addActionListener()方法为按钮组件添加一个自定义事件监听器
 *  当单击按钮组件时就会触发事件监听器,进行事件处理
 */

//自定义事件监听器类
class MyListener implements ActionListener{
	//实现监听器方法,对监听器事件进行处理
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("您点击了JButton按钮组件");
	}
}


public class Test01 {
	public static void main(String[] args) {
		
		//创建一个名为事件测试的窗体
		JFrame f = new JFrame("事件测试");
		f.setSize(400, 200); //设置窗口大小
		
		//创建一个按钮组件,作为事件源
		JButton btn = new JButton("按钮");
		
		//为按钮组件(事件源)添加自定义监听器
		btn.addActionListener(new MyListener());
		
		f.add(btn);//向容器中添加按钮组件
		f.setVisible(true);//窗体可见
	    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口时,退出应用程序
		
	}
	

}

結果を示す

ボタンをクリックすると、関連情報が背景に印刷されます

 4.1 フォームイベント

         WindowEvent アプリケーションでウィンドウ イベントを処理するときは、まず WindowListener インターフェイスをウィンドウ リスナーとして実装するクラスを定義し、次に addWindowListener() メソッドを使用して、ウィンドウ オブジェクトをウィンドウ リスナーにバインドされているように接続する必要があります。

        ほとんどの GUI アプリケーションは、Windows フォーム オブジェクトを最も外側のコンテナとして使用する必要があります。フォーム オブジェクトはすべての GUI アプリケーションの基礎であると言えます。アプリケーションは通常、他のコンポーネントをフォームに直接または間接的に追加します。フォームの開始、終了、アクティブ化、非アクティブ化など、これらのアクションはすべてフォーム イベントです。

フォームイベントコードの表示:

package javaSE.GUI;


import java.awt.event.*;
import javax.swing.JFrame;

public class WindowsEventTest {
	public static void main(String[] args) {
		JFrame f = new JFrame("窗体事件");	//创建一个名为窗体事件的窗体
		f.setSize(400,300);		//设置窗体大小
		f.setLocation(300,200);	//设置窗体显示位置
		f.setVisible(true);		//窗体可见
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口时,退出应用程序
		
        //f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//测试windowClosed
        //窗口关闭时,隐藏并处理这个窗口(只有当它是最后一个窗口,才会退出JVM)
        
		// 使用内部类创建WindowListener实例对象,监听窗体事件
		f.addWindowListener(new WindowListener() {
			
			public void windowOpened(WindowEvent e) {
				System.out.println("窗体打开事件");
			}
			
			public void windowIconified(WindowEvent e) {
				System.out.println("窗体图标化事件");//最小化
			}
			
			public void windowActivated(WindowEvent e) {
				System.out.println("窗体激活事件");//获得焦点状态
			}
			
			public void windowDeiconified(WindowEvent e) {
				System.out.println("窗体取消图标化事件");//最小化恢复正常
			}
			
			public void windowDeactivated(WindowEvent e) {
				System.out.println("窗体停用事件");//失去焦点状态
			}
			
			public void windowClosing(WindowEvent e) {
				System.out.println("窗体正在关闭事件");
                //关闭,点击右上角X,优先于windowClosed
			}
			
			public void windowClosed(WindowEvent e) {
				System.out.println("窗体关闭事件");
                //关闭,设置为 DISPOSE_ON_CLOSE时才会被调用
			}
		});
	}
}

ウィンドウイベントエフェクトの表示:

windowClosed (ウィンドウを閉じるイベント) は、DISPOSE_ON_CLOSE に設定されている場合にのみ表示されることに注意してください。

DISPOSE_ON_CLOSE: [ウィンドウが閉じているとき、このウィンドウを非表示にして処理します (最後のウィンドウの場合のみ、JVM を終了します)]

ウィンドウ操作:最小化、アイコンをクリック (最小化して通常に戻す)、右上隅の閉じるボタンをクリックします

 4.2 マウスイベント

        マウス イベント (MouseEvent)、ほぼすべてのコンポーネントでマウス イベントを生成できます。マウス イベントには、マウス ダウン、マウス リリース、マウス クリックなどが含まれます。

        マウス イベントは、MouseListener インターフェイスを実装するか、アダプターの MouseAdapter クラスを継承してから、addMouseListener() メソッドを呼び出してリスナーをイベント ソース オブジェクトにバインドすることによって処理できます。

マウスイベントコードの表示:

package javaSE.GUI;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/*
 * 鼠标事件(MouseEvent)
 */
public class MouseEventTest {
	public static void main(String[] args) {
		
        创建一个名为鼠标事件的窗体
		JFrame f = new JFrame("鼠标事件");

		//窗口设置流式布局管理器
        //[FlowLayout() : 组件默认居中对齐,水平、垂直间距默认为5个单位]
		f.setLayout(new FlowLayout());

		f.setSize(300, 200); 	//设置窗体大小
		f.setLocation(300, 200);//设置窗体显示位置
		f.setVisible(true);		//窗体可见
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口时,退出应用程序
		Button but = new Button("按钮"); // 创建按钮对象
		f.add(but); // 在窗口添加按钮组件
		
		//为按钮添加鼠标事件监听器
		but.addMouseListener(new MouseListener() {
			public void mouseReleased(MouseEvent e) {
				System.out.println("鼠标放开");
			}
			public void mousePressed(MouseEvent e) {
				System.out.println("鼠标按下");
			}
			public void mouseExited(MouseEvent e) {
				System.out.println("鼠标移出按钮区域");
			}
			public void mouseEntered(MouseEvent e) {
				System.out.println("鼠标进入按钮区域");
			}
			public void mouseClicked(MouseEvent e) {
				System.out.println("鼠标完成点击");
			}
		});
	}
}


マウスイベント効果表示:

 4.3 キーボードイベント

        キーボード操作は、キーボードを押す、離すなど、最も一般的に使用されるユーザー操作方法でもあります。これらの操作はキーボード イベントとして定義されます。

        キーボード イベント (KeyEvent)、KeyEvent イベントを処理するリスナー オブジェクトは、KeyListener インターフェイスを実装するか、KeyAdapter クラスを継承してから、addKeyListener() メソッドを呼び出してリスナーをイベント ソース オブジェクトにバインドする必要があります。

キーボード イベント コードは次を示します。

package javaSE.GUI;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/*
 * 键盘事件(KeyEvent)
 */
public class KeyEventTest {
	public static void main(String[] args) {
		//创建一个名为键盘事件的窗体
		JFrame f = new JFrame("键盘事件");
		
		//窗口设置流式布局管理器
		//[FlowLayout() : 组件默认居中对齐,水平、垂直间距默认为5个单位]
		f.setLayout(new FlowLayout());
		
		f.setSize(400, 300);	//设置窗体大小
		f.setLocation(300, 200);//设置窗体显示位置
		TextField tf = new TextField(30); //创建文本框对象
		f.add(tf); 			//在窗口中添加文本框组件
		f.setVisible(true);	//窗体可见
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口时,退出应用程序
		
         // 为文本框添加键盘事件监听器
		tf.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				// 获取所按键对应的字符代码(键码)
			 	int keyCode = e.getKeyCode(); 
			 	// 获取所按键的键盘字符
				String keyChar = KeyEvent.getKeyText(keyCode);
				//char keyChar = e.getKeyChar(); 
				//方法二 单字符可以,但是像Shift,Ctrl等键就显示不出来,打印为?
			 	
				System.out.print("输入的内容为:" + keyChar + " , ");
				System.out.println("KeyCode(键码)为:" + keyCode);
			}
		});
	}
}

キーボードイベントエフェクト表示:

 

 5. スイング共通コンポーネント

5.1 パネルの組み立て

        Swing コンポーネントには、JFrame や JDialog などのトップレベル コンテナがあるだけでなく、中間コンテナとも呼ばれるいくつかのパネル コンポーネントも提供されます。つまり、パネル コンポーネントは単独では存在できず、トップレベル コンテナにのみ配置できます。2 つの共通パネル コンポーネント、Jpanel と JScrollPane があります。

        JPanel: 移動、拡大、縮小、閉じることができないフチなしパネルで、デフォルトのレイアウト マネージャーは FlowLayout です。もちろん、コンストラクター JPanel(LayoutManagerlayout) またはその setLayout() メソッドを使用して、そのレイアウト マネージャーを作成することもできます。

        JScrollPane : スクロール バーのあるパネル コンテナーであり、このパネルでは 1 つのコンポーネントのみを追加できます。複数のコンポーネントを JScrollPane パネルに追加する場合は、まずこれらの複数のコンポーネントをコンポーネント (JPane など) に追加してから、このコンポーネント (JPanel など) は JScrollPane に追加されます。

JScrollPane の一般的な構築方法

JScrollPane() 空の JScrollPane パネルを作成する
JScrollPane (コンポーネントビュー) 指定されたコンポーネントを表示する JScrollPane を作成し、コンポーネントのコンテンツがビュー サイズを超えている限り水平スクロール バーと垂直スクロール バーを表示します。
JScrollPane (コンポーネント ビュー、int vsbPolicy、int hsbPolicy)

指定されたコンテナを表示し、指定されたスクロール ポリシーを持つ JScrollPane を作成します。パラメータ vsbPolicy と hsbPolicy は、それぞれ垂直スクロール ポリシーと水平スクロール ポリシーを表します。

    JScrollPane セットパネルスクロール戦略メソッド

void set水平バーポリシー(int ポリシー) 水平スクロール バーのポリシー、つまり水平スクロール バーがスクロール パネルに表示されるタイミングを指定します。
void setVerticalBarPonlicy(int ポリシー) 垂直スクロール バーのポリシー、つまり垂直スクロール バーがスクロール パネルに表示されるタイミングを指定します。
void setViewportView(コンポーネントビュー)

スクロールパネルに表示するコンポーネントを設定する

         JScrollPane パネルのスクロール戦略

HORIZONTAL_SCROLLBAR_​​AS_NEEDED 必要な場合にのみ水平スクロールバーを表示するのがデフォルトのポリシーです。(横スクロール軸は、横領域の内容が表示領域より大きい場合に表示されます)
HORIZONTAL_SCROLLBAR_​​NEVER 水平スクロールバーが表示されない
HORIZONTAL_SCROLLBAR_​​ALAWAYS 水平スクロールバーは常に表示されます
VERTICAL_SCROLLBAR_​​AS_NEEDED  垂直スクロール軸は、垂直領域の内容が表示領域よりも大きい場合に表示されます。
VERTICAL_SCROLLBAR_​​NEVER 垂直スクロール軸が表示されない
VERTICAL_SCROLLBAR_​​ALWAYS 垂直スクロール軸は常に表示されます

コード表示:

package javaSE.GUI;

/*
 * JScrollPane是一个带有滚动条的面板容器,而且这个面板只能添加一个组件,
 * 如果想往JScrollPane面板中添加多个组件,应该先将组件添加到JPanel中,
 * 然后将JPanel添加到JScrollPane中.
 */
import java.awt.*;
import javax.swing.*;

public class JScrollPaneTest {
	public static void main(String[] args) {
		//1、创建一个名为PanelDemo的窗体
		JFrame f = new JFrame("PanelDemo");
			
		/*
		 * BorderLayout 窗口设置边界布局管理器
		 * 边界布局管理器 将容器划分为五个区域:
		 *   分别是东(EAST)、南(SOUTH)、西(WEST)、北(NORTH)、中(CENTER)
		 */
		f.setLayout(new BorderLayout());
				
		f.setSize(350, 200);	//设置窗体大小
		f.setLocation(300, 200);//设置窗体显示位置
		f.setVisible(true);	//窗体可见
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口时,退出应用程序
		
		//2、创建JScrollPane滚动面板组件
		JScrollPane scrollPane = new JScrollPane();
		// 设置水平滚动条策略-滚动条需要时显示
		scrollPane.setHorizontalScrollBarPolicy
			(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		// 设置垂直滚动条策略-滚动条一直显示
		scrollPane.setVerticalScrollBarPolicy
			(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		
		//3、定义一个JPanel面板
		JPanel panel = new JPanel();
		//在Panel面板中添加五个按钮
		panel.add(new JButton("金"));
		panel.add(new JButton("木"));
		panel.add(new JButton("水"));
		panel.add(new JButton("火"));
		panel.add(new JButton("土"));
		
		//设置JPanel面板在滚动面板JScrollPane中显示
		scrollPane.setViewportView(panel);
		//4、向JFrame容器窗口中添加JScrollPane滚动面板
		f.add(scrollPane,BorderLayout.CENTER);//BorderLayout.CENTER 设置为中
		
		
	}
}

結果を示す:

 水平スクロール バー戦略は HORIZONTAL_SCROLLBAR_​​AS_NEEDED です。水平スクロール バーは、完全なコンテンツを水平方向に表示できない場合にのみ表示されるため、効果を確認するにはウィンドウを水平に引いてズームアウトする必要があります。

5.2 テキストコンポーネント

JTextComponent クラスには、JTextField (テキスト ボックス) と JTextArea (テキスト フィールド) という 2 つのサブクラスがあります。

JTextComponent の共通メソッド

文字列 String getText() テキストコンポーネント内のすべてのテキストコンテンツを返します。
文字列 String getSelectedText() テキストコンポーネント内の選択されたテキストコンテンツを返します。
void selectAll() テキストコンポーネント内のすべてを選択します
void setEditable(boolean b) テキストコンポーネントを編集可能または編集不可能に設定します。
void setText(文字列テキスト) テキストコンポーネントの内容を設定します
void replaceSelection(文字列コンテンツ) 現在選択されているコンテンツを指定されたコンテンツに置き換えます

JTextField の一般的な構築メソッド

JTextField() 初期文字列が null の空のテキストボックスを作成します
JTextField(int 列) 指定された列数で、初期文字列が null のテキストボックスを作成します。
JTextField(文字列テキスト) 指定された初期文字列を表示するテキスト ボックスを作成します
JTextField(文字列テキスト、整数列) 指定された列数のテキスト ボックスを作成し、指定された初期文字列を表示します。

JTextArea の一般的な構築メソッド

JTextArea() コンストラクター、空のテキストフィールドを作成します
JTextArea(文字列テキスト) 指定された初期文字列を表示するテキストフィールドを作成するコンストラクターメソッド
JTextArea(int 行, int 列) 指定された行数と列数の空のテキストフィールドを作成するコンストラクター
JTextArea(文字列テキスト、int 行、int 列) 構築方法。指定された初期テキストを表示し、行と列を指定するテキスト フィールドを作成します。

以下のチャット ウィンドウを作成して、テキスト コンポーネント JTextField (テキスト ボックス) および JTextArea (テキスト フィールド) コンポーネントの基本的な使用法を示します。

コード表示:

package javaSE.GUI;

import java.awt.BorderLayout;

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
/*
	编写一个简单的聊天窗口:
		使用JFrame顶级容器创建并设置了一个聊天窗口
		BorderLayout边界布局管理器分为:上下两个区域
			中:
				JScrollPane滚动面板,
				该面板中封装了JTextArea文本域(显示聊天记录)
			南:
				JPanel面板中放置了三个组件
				JLabel标签(用于信息说明)
				JTextField文本框(输入聊天信息)
				JButton按钮(发送消息)
				
 */
public class TextTest {
	public static void main(String[] args) {
		//1、创建一个名为聊天窗口的窗体
		JFrame f = new JFrame("聊天窗口");	
		/*
		 * BorderLayout 窗口设置边界布局管理器
		 * 边界布局管理器 将容器划分为五个区域:
		 *   分别是东(EAST)、南(SOUTH)、西(WEST)、北(NORTH)、中(CENTER)
		 */
		f.setLayout(new BorderLayout());
		
		//2、创建一个JTextArea文本域,用来显示多行聊天信息
		JTextArea showArea = new JTextArea(12,34);
		//创建一个JScrollPane滚动面板组件,将JTextArea文本域作为其显示组件
		/*
		 * JScrollPane (Component view)	
		 * 创建一个显示指定组件的JScrollPane面板,
		 * 只要组件的内容超过视图大小,就会显示水平和垂直滚动条
		 */
		JScrollPane scorllPane = new JScrollPane(showArea);
		showArea.setEditable(false); //设置文本域不可编辑
		
		//3、创建一个JTextField文本框,用来输入单行聊天信息
		JTextField inputField = new JTextField(20);
		JButton btn = new JButton("发送");  // 创建一个发送按钮
		
		// 为按钮添加事件
		btn.addActionListener(new ActionListener() { // 为按钮添加一个监听事件
			public void actionPerformed(ActionEvent e) {// 重写actionPerformed方法
				String content = inputField.getText();  // 获取输入的文本信息
              // 判断输入的信息是否为空
				if (content != null && !content.trim().equals("")) {
                    // 如果不为空,将输入的文本追加到到聊天窗口(放入文本域中)
					showArea.append("路人甲:"+content + "\n"); 
				    } else {
                    // 如果为空,提示短信内容不能为空
				    showArea.append("消息内容不能为空!" + "\n");
				}
				inputField.setText(""); //最后将输入的文本域内容置为空
			}
		});
		
		//4、创建一个JPanel面板组件
		JPanel panel = new JPanel();
		JLabel label = new JLabel("聊天信息");	//创建一个标签
		panel.add(label);		//将标签组件添加到JPanel面板
		panel.add(inputField);	//将文本框添加到JPanel面板
		panel.add(btn);			//将按钮添加到JPanel面板
		
		//5、向JFream聊天窗口的中部和南部分别加入面板组件JScrollPane和JPanel
		f.add(scorllPane,BorderLayout.CENTER);//中(CENTER)
		f.add(panel,BorderLayout.SOUTH);	  //南(SOUTH)
		
		f.setSize(400, 350); 	//设置窗体大小
		f.setLocation(300, 200);//设置窗体显示位置
		f.setVisible(true);		//窗体可见
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口时,退出应用程序
		
		
	}

}

結果を示す:

5.3 ラベルのコンポーネント

        Swing のラベル コンポーネントは主に JLabel を使用します。

        JLabel组件可以显示文本,图像,还可以设置标签内容的垂直和水平对齐方式。

JLabel构造方法

JLabel() 创建无图像并且标题为中字符串的JLabel
JLabel(Icon image) 创建有指定图像的JLabel
JLabel(Icon image,int horizontalAlignment) 创建有指定图像和水平对齐方式的JLabel
JLabel(String text) 创建有指定文本的JLabel
JLabel(String text,Icon icon,int horizontalAlignment) 创建有指定文本、图像和水平对齐方式的JLabel
JLabel(String text,int horizontalAlignment) 创建有指定文本和水平对齐方式的JLabel

代码展示:

package javaSE.GUI;

import java.awt.*;
import javax.swing.*;

/*
	使用JFrame顶级容器
	BorderLayout边界布局管理器分为:上下两个区域
		中:
			JLabel标签(加入图标【ImageIcon图标组件】)
		南:
			JLabel标签(加入文字)
			

	SCALE_DEFAULT 		   使用默认的图像缩放算法。
	SCALE_AREA_AVERAGING   使用 Area Averaging 图像缩放算法。
	SCALE_FAST     		   选择一种图像缩放算法,在这种缩放算法中,缩放速度比缩放平滑度具有更高的优先级。
	SCALE_REPLICATE        使用 ReplicateScaleFilter 类中包含的图像缩放算法。
	SCALE_SMOOTH           选择图像平滑度比缩放速度具有更高优先级的图像缩放算法
 */
public class JLabelTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//1、创建一个名为JLabel测试的窗体
		JFrame f = new JFrame("JLabel测试");	
		/*
		 * BorderLayout 窗口设置边界布局管理器
		 * 边界布局管理器 将容器划分为五个区域:
		 *   分别是东(EAST)、南(SOUTH)、西(WEST)、北(NORTH)、中(CENTER)
		 */
		f.setLayout(new BorderLayout());
		
		//2、创建一个JLabel标签,用于展示图片
		JLabel label = new JLabel();
		/*
		     创建一个ImageIcon图标组件,从指定的文件中读取相关图象信息,它支持GIF和JPG、BMP等基本图象格式
		     我的test.jpg,就放在项目。如果图盘放在src目录下 "src/test.jpg"
		*/
		ImageIcon icon = new ImageIcon("test.jpg"); 
		Image img = icon.getImage();	//获取这个Icon的image
		//用于设置图片大小尺寸(宽度,高度,SCALE_DEFAULT使用默认的图像缩放算法)
		img = img.getScaledInstance(400, 200, Image.SCALE_DEFAULT);
		
		icon.setImage(img);	//将调好的image放到ImageIcon
		label.setIcon(icon);//将ImageIcon放入JLabel图标中
		
		//3、创建一个JPanel面板
		JPanel panel = new JPanel();
		//创建JLabel标签(指定文本,水平对齐方式)【CENTER居中】
		JLabel label2 = new JLabel("祝你 早安、午安、晚安",JLabel.CENTER);
		panel.add(label2);//将JLabel标签添加到JPanel面板
		
		//4、向JLabel测试窗口的中部部和南部分别加入面板组件JLabel和JPanel
		f.add(label,BorderLayout.CENTER);//中
		f.add(panel,BorderLayout.SOUTH); //南
		
		f.setSize(400, 300); 	//设置窗体大小
		f.setLocation(300, 200);//设置窗体显示位置
		f.setVisible(true);		//窗体可见
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口时,退出应用程序
		
	}

}

效果展示:

5.4 按钮组件

        常见的按钮组件有JButton、JCheckBox、JRadioButton等,它们都是抽象类AbstractButton类的直接或间接子类。

AbstractButton 常用方法

Icon getIcon 获取按钮组件
void setIcon(Icon icon) 设置按钮的图标
String getText() 获取按钮的文本
void setText(String text) 设置按钮的文本
void setEnable(boolean b) 设置按钮是否可用
boolean setSelected(boolean b) 设置按钮是否为选中状态
boolean isSelected() 返回按钮的状态(true为选中,反之则未选中)

5.4.1 JCheckBox 复选框

        JCheckBox组件(复选框),它有 选中/未选中 两种状态。如果复选框有多个,则用户可以选中其中一个或者多个。

JCheckBox 常用发方法

JCheckBox() 创建一个没有文本信息,初始状态未被选中的复选框
JCheckBox(String text) 创建一个带有文本信息,初始状态未被选中的复选框
JCheckBox(String text,boolean selected) 创建一个带有文本信息,并指定初始状态(选中/未选中)的复选框

代码展示:

package javaSE.GUI;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/*
	使用JFrame顶级容器
	使用BorderLayout边界布局管理器分为:上下两个区域
			JLabel标签(用来展示文字)
		南:
			JPanel面板中放置了两个JCheckBox复选框和JLabel标签(提示信息)
			(两个复选框分别对应不同的字体样式)

 */
public class JCheckBoxTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//1、创建一个名为 JCheckBoxTest的窗体
		JFrame f = new JFrame(" JCheckBoxTest");	
		/*
		 * BorderLayout 窗口设置边界布局管理器
		 * 边界布局管理器 将容器划分为五个区域:
		 *   分别是东(EAST)、南(SOUTH)、西(WEST)、北(NORTH)、中(CENTER)
		 */
		f.setLayout(new BorderLayout());
			
		//2、创建一个JLabel标签组件 ,标签文本居中对齐
		JLabel label = new JLabel("骑马倚斜桥,满楼红袖招",JLabel.CENTER);
		// 设置标签文本的字体(Font是一个字体类,PLAIN(普通样式),BOLD(粗体样式),ITALIC(斜体样式))
		label.setFont(new Font("宋体", Font.PLAIN, 20));
		
		//3、创建一个JPanel面板组件
		JPanel panel = new JPanel();
		//创建两个JCheckBox复选框,并添加到JPanel组件中
		JCheckBox italic = new JCheckBox("斜体");
		JCheckBox bold = new JCheckBox("黑体");
		
		//为复选框定义ActionListener监听器
		ActionListener listener = new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				int mode = 0; 
				if(bold.isSelected())	//如果bold黑体复选框被选中
					mode += Font.BOLD;	//字体添加黑体样式
				if(italic.isSelected()) //如果italic斜体复选框被选中
					mode += Font.ITALIC; //字体添加斜体样式
				label.setFont(new Font("宋体", mode , 20));
				
			}
			
		};
		
		//为两个复选框添加监听器
		italic.addActionListener(listener);
		bold.addActionListener(listener);
		
		JLabel label2 = new JLabel("请选择文字的样式:");//创建一个标签(提示信息)
		panel.add(label2);//将标签添加到JPanel面板
		//将复选框添加到JPanel面板
		panel.add(italic);
		panel.add(bold);
		
		//4、向JFrame窗口中加入居中的JLabel标签组件和JPanel面板组件
		f.add(label);
		f.add(panel,BorderLayout.SOUTH);//南
				
		f.setSize(400, 350); 	//设置窗体大小
		f.setLocation(300, 200);//设置窗体显示位置
		f.setVisible(true);		//窗体可见
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口时,退出应用程序
		
		
	}

}

效果展示:

5.4.2 JRadioButton 单选按钮

        JRadioButton组件(单选按钮),与JCheckBox复选框不同的是,单选按钮只能选中一个。对于JRadioButton按钮来说,当一个按钮被选中时,先前被选中的按钮就会自动取消选中。

JRadioButton 常见构造方法

JRadioButton() 创建一个没有文本信息、初始状态未被选中的单选框
JRadioButton(String text) 创建一个带有文本信息、初始状态未被选中的单选框
JRadioButton(String text,boolean selected) 创建一个带有文本信息、并指定初始状态(选中/未选中)的单选框

代码展示:

package javaSE.GUI;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/*
	使用JFrame顶级容器
		在JPanel面板上放置三个JRadioButton按钮,代表“红”、“黄”、“蓝”
		按钮添加到panel面板和ButtonGroup按钮组中并添加监听器
		选择三个JRadioButton按钮可以改变面板的颜色

 */
public class JRadioButtonTest {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//1、创建一个名为 JRadioButtonTest的窗体
		JFrame f = new JFrame(" JRadioButtonTest");	
		/*
		 * BorderLayout 窗口设置边界布局管理器
		 * 边界布局管理器 将容器划分为五个区域:
		 *   分别是东(EAST)、南(SOUTH)、西(WEST)、北(NORTH)、中(CENTER)
		 */
		f.setLayout(new BorderLayout());
			
		//2、创建一个 JPanel面板(放置三个JRadioButton按钮)
		JPanel panel = new JPanel();
		//创建ButtonGroup按钮组件
		ButtonGroup group = new ButtonGroup();
		//创建三个JRadioButton单选框
		JRadioButton red = new JRadioButton("红");
		JRadioButton yellow = new JRadioButton("黄");
		JRadioButton blue = new JRadioButton("蓝");
		//将单选框添加到同一个ButtonGroup按钮组件中
		group.add(red);
		group.add(yellow);
		group.add(blue);
		
		//3、创建一个JPanel面板作为调色板
		JPanel panel2 = new JPanel();
		
		//为单选按钮定义ActionListener监听器
		ActionListener listener = new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				Color color = null;
				if(red.isSelected()) {//red红单选框是否被选中
					color = Color.RED;	
				}else if(yellow.isSelected()) {//yellow黄单选框是否被选中
					color = Color.YELLOW; 
				}else{//BLUE蓝单选框被选中
					color = Color.BLUE;
				}
				panel2.setBackground(color);//设置背景颜色
				
			}
			
		};
		
		//为三个单选添加监听器
		red.addActionListener(listener);
		yellow.addActionListener(listener);
		blue.addActionListener(listener);
		
		//将复选框添加到JPanel面板
		panel.add(red);
		panel.add(yellow);
		panel.add(blue);
		
		//4、向JFrame窗口中加入JPanel面板组件和JPanel2面板组件
		f.add(panel,BorderLayout.NORTH);//北
		f.add(panel2,BorderLayout.CENTER);//中
				
		f.setSize(400, 350); 	//设置窗体大小
		f.setLocation(300, 200);//设置窗体显示位置
		f.setVisible(true);		//窗体可见
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口时,退出应用程序
		
		
	}
}

效果展示:

 

5.5 JComboBox(下拉框组件)

         JComboBox组件被称为组合框或者下拉列表框,它将所有选项折叠收藏在一起,默认显示的是第一个添加的选项。当用户点击组合框时,会出现下拉式的选择列表,用户可以从中选择其中一项并显示。

JComboBox 对象的构造方法

JComboBox() 创建一个没有可选项的下拉框
JComboBox(Object[ ] items) 创建一个下拉框,将Object数组中的元素作为下拉框的下拉列表选项
JComboBox(Vector items) 创建一个下拉框,将Vector集合中的元素作为下拉框的下拉列表选项

JComboBox 常用方法

void addItem(Object anObject) 为下拉框添加选项
void insertItemAt(Object anObject,int index) 在指定索引处添加选项
Object getItemAt(int index) 返回指定索引处选项,第一个选项的索引为0
int getItemCount() 返回下拉框中选项的数目
Object getSelectedItem() 返回当前所选项
void removeAllItems() 删除下拉框中所有选项
void removeItem(Object object) 从下拉框中删除指定选项
void removeItemAt(int index) 移除指定索引的选项
void setEditable(boolean aFlag) 设置下拉框的选项是否可编辑,true可编辑,反之则不可编辑

代码展示:

package javaSE.GUI;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
/*
使用JFrame顶级容器
	使用BorderLayout边界布局管理器分为:
		北:
			JComboBox下拉框(注册监听器)
			JTextField文本框
 */
public class JComboBoxText {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//1、创建一个名为 JComboBoxText的窗体
		JFrame f = new JFrame(" JComboBoxText");	
		/*
		 * BorderLayout 窗口设置边界布局管理器
		 * 边界布局管理器 将容器划分为五个区域:
		 *   分别是东(EAST)、南(SOUTH)、西(WEST)、北(NORTH)、中(CENTER)
		 */
		f.setLayout(new BorderLayout());
			
		//2、创建一个 JPanel面板,用来封装JComboBox下拉框
		JPanel panel = new JPanel();
		//创建JComboBox下拉框
		JComboBox<String> comboBox = new JComboBox<>();
		//为下拉框添加选项
		comboBox.addItem("请选择角色");
		comboBox.addItem("天星");
		comboBox.addItem("暗影");
		comboBox.addItem("绿魔");
		comboBox.addItem("王霸");
		
		//创建JTextField文本框组件,展示用户的选择
		JTextField textField = new JTextField(20);
		
		//为JComboBox下拉框定义ActionListener监听器
		ActionListener listener = new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				//获取当前所选项
				String item = (String) comboBox.getSelectedItem();
				if("请选择角色".equals(item)) {
					textField.setText("");
				}else {
					textField.setText("您选择到角色是:" + item);
				}
				
			}
			
		};
		
		//为下拉框添加监听器
		comboBox.addActionListener(listener);

		//将JComboBox下拉框和JTextField文本框添加到JPanel面板
		panel.add(comboBox);
		panel.add(textField);
		
		//4、向JFrame窗口中加入JPanel面板组件和JPanel2面板组件
		f.add(panel,BorderLayout.NORTH);//北
				
		f.setSize(400, 200); 	//设置窗体大小
		f.setLocation(300, 200);//设置窗体显示位置
		f.setVisible(true);		//窗体可见
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口时,退出应用程序
		
		
	}	

}

效果展示:

5.6 菜单组件 

        Swing提供了很多中样式的菜单,这次我们主要来学习下拉式菜单和弹出式菜单。

5.6.1 下拉式菜单

         下拉式菜单包括JMenuBar(菜单栏)、JMenu(菜单)和JMenuItem(菜单项)。用记事本为例,展示一下这三个组件所对应的位置。

JMenuBar:表示一个水平的菜单栏,它用来管理菜单,不参与同用户的交互式操作。 JMenu:表示一个菜单,它用来整合管理菜单项。菜单可以是单一层次的结构,也可以是多层次的结构。                                                                                                              JMenuItem:表示一个菜单项,它是菜单系统中最基本的组件。和JMenu菜单一样,在创建JMenuItem菜单项时,通常会使用JMenumItem(String text)这个构造方法为菜单项指定文本内容。JMenuItem继承自AbstractButton类,因此可以把它看成是一个数组,如果使用无参的构造方法创建一个菜单项,则可以调用从AbstractButton类中继承的setText()方法和setIcon()方法为其设置文本和图标

 JMenu 常用方法(菜单)

JMenuItem add(JMenuItem menuItem)  将菜单项添加到菜单末尾,返回此菜单
void addSeparator() 将分隔符添加到菜单的末尾
JMenuItem getItem(int pos) 返回指定索引处的菜单项,第一个菜单项的索引为0
int getItemCount() 返回菜单上的项数,菜单项和分隔符都计算在内
JMenuItem insert(JmenuItem menuItem,int pos) 在指定索引处插入菜单项
void insertSeparator(int pos) 在指定索引处插入分隔符
void remove(int pos) 从菜单中移除指定索引处的菜单项
void remove(JMenuItem menuItem) 从菜单中移除指定的菜单项
void removeAll() 从菜单中移除所有的菜单项

代码展示:

package javaSE.GUI;

import java.awt.event.*;
import javax.swing.*;

/*
 使用JFrame顶级容器
	创建JMenuBar菜单栏对象,将其放置在JFrame窗口的顶部
	创建JMenu菜单对象,将其添加到JMenuBar菜单栏中
	创建JMenuItem菜单项,为菜单项添加事件监听器
	当点击菜单项会弹出一个模态的JDialog窗口,将菜单项添加到JMenu菜单中。
 */

public class JMenuText {
	public static void main(String[] args) {
		//1、创建一个名为 JMenuText的窗体
		JFrame f = new JFrame("JMenuText");	
		
		//2、创建菜单栏组件JMenuBar 
		JMenuBar menuBar = new JMenuBar();
		//创建菜单组件JMenu
		JMenu menu = new JMenu("文件");      //创建文件菜单
		JMenu menu1 = new JMenu("编辑");      //创建编辑菜单
		JMenu menu2 = new JMenu("查看");      //创建查看菜单
	    // 将菜单添加到菜单栏上
		menuBar.add(menu);                    
		menuBar.add(menu1);                
		menuBar.add(menu2);                               
			
		//创建两个JMenuItem菜单项
		JMenuItem item1 = new JMenuItem("新建");
		JMenuItem item2 = new JMenuItem("退出");
		//JMenuItem菜单项添加到menu菜单组件
		menu.add(item1);
		menu.addSeparator();//设置分隔符
		menu.add(item2);
		

		//分别为两个JMenuItem菜单项创建监听器
		item1.addActionListener(new ActionListener() {//新建监听器
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				// 创建一个JDialog窗口 (true模式,false非模式)
				JDialog dialog = new JDialog(f,"新建文件",true);
				dialog.setSize(200, 200);  //设置窗体大小
				dialog.setLocation(50, 50);//设置窗体显示位置
				dialog.setVisible(true);//窗体可见
				//DISPOSE_ON_CLOSE:当窗口关闭时,隐藏并处理这个窗口(只有当它是最后一个窗口,才会退出JVM)
				dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
				
			}
			
		});
		
		item2.addActionListener(new ActionListener() {//退出监听器
			public void actionPerformed(ActionEvent e) {
				System.exit(0);//正常退出程序(关闭当前正在运行的java虚拟机)
			}
		});

		//3、向JFrame窗口容器中加入JMenuBar组件
		f.setJMenuBar(menuBar);
				
		f.setSize(400, 350); 	//设置窗体大小
		f.setLocation(300, 200);//设置窗体显示位置
		f.setVisible(true);		//窗体可见
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口时,退出应用程序	
	}
}

效果展示:

5.6.2 JPopupMenu(弹出式菜单) 

        弹出式菜单用JPopupMenu表示 JPopupMenu弹出式菜单和下拉式菜单一样都通过调用add()方法添加JMenuItem菜单项,但它默认是不可见的,如果想要显示出来,则必须调用它的show(Component invoker,int x,int y)方法,invoker表示JPopupMenu菜单显示位置的参考方式,x和y表示invoker组件坐标空间中的一个坐标,显示的是JPopupMenu菜单的左上角坐标。

代码展示:

package javaSE.GUI;

import java.awt.event.*;
import javax.swing.*;

/*
 使用JFrame顶级容器
 	popupMenu设置弹出式菜单(这里注册监听,鼠标单击右键显示)
 	该菜单添加三个JMenuItem菜单项
	
 */
public class JPopupMenuTest {
	public static void main(String[] args) {
		//1、创建一个名为 JPopupMenuTest的窗体
		JFrame f = new JFrame("JPopupMenuTest");	
				
		//2、创建菜JPopupMenu弹出式菜单 
		JPopupMenu popupMenu = new JPopupMenu();                             
					
		// 创建三个JMenuItem菜单项
	 	JMenuItem refreshItem = new JMenuItem("查看");
	 	JMenuItem createItem = new JMenuItem("新建");
	 	JMenuItem exitItem = new JMenuItem("退出");
	 			
		//JMenuItem菜单项添加到menu菜单组件
	 	popupMenu.add(refreshItem);
	 	popupMenu.addSeparator();//设置分隔符
	 	popupMenu.add(createItem);
	 	popupMenu.addSeparator();//设置分隔符
	 	popupMenu.add(exitItem);

		//3、为JFrame窗口添加鼠标事件监听器
	 	f.addMouseListener(new MouseAdapter() {
	 		public void mouseClicked(MouseEvent e) {
	 			// 如果点击的是鼠标的右键,显示JPopupMenu菜单
	 			if (e.getButton() == MouseEvent.BUTTON3) {
	 				popupMenu.show(e.getComponent(), e.getX(), e.getY());
	 			}
	 		}
	 	});
	 			
	 	createItem.addActionListener(new ActionListener() {//新建监听器
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				// 创建一个JDialog窗口 (true模式,false非模式)
				JDialog dialog = new JDialog(f,"新建文件",true);
				dialog.setSize(200, 200);  //设置窗体大小
				dialog.setLocation(50, 50);//设置窗体显示位置
				dialog.setVisible(true);//窗体可见
				//DISPOSE_ON_CLOSE:当窗口关闭时,隐藏并处理这个窗口(只有当它是最后一个窗口,才会退出JVM)
				dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
						
			}
					
		});
				
		exitItem.addActionListener(new ActionListener() {//退出监听器
			public void actionPerformed(ActionEvent e) {
				System.exit(0);//正常退出程序(关闭当前正在运行的java虚拟机)
			}
		});

						
		f.setSize(400, 250); 	//设置窗体大小
		f.setLocation(300, 200);//设置窗体显示位置
		f.setVisible(true);		//窗体可见
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口时,退出应用程序	
	}

}

效果展示:

                                点击右键弹出菜单项

结尾:

GUI - 图形用户接口相关知识远不止于此,如果您感兴趣的话,就继续向前探索吧!

文章还有许多不足之处,还请大家多多指正。

有则改之,无则加勉。

获取编程软件和资源 下载链接:

java初学者的装备(软件、学习路线、资源)_小白要努力变黑的博客-CSDN博客

おすすめ

転載: blog.csdn.net/m0_51315555/article/details/123761623