第18章 スイングプログラミング

目次

概要

スイングの一般的なフォーム 

JFrameフォーム

「JDialog」ダイアログ・ボックス 

JOptionPane の小さなダイアログ ボックス 

 1.カスタムダイアログボックス

2. 確認ボックス 

3.入力ボックス 

4.通知ボックス 

よく使用されるレイアウトマネージャー 

null 絶対レイアウト

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

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

GridLayout ネットワーク レイアウト マネージャー

よく使われるパネル 

JPパネルパネル

JScrollPane スクロール パネル 

 テキストラベルのコンポーネントとアイコン

JLableタグ

アイコンの使用

ボタンコンポーネント 

JButton ボタン

JRadinButton ラジオ ボタン 

1. ラジオボタン

2.ボタングループ

リストコンポーネント 

JComboBox ドロップダウン リスト ボックス

JList リストボックス 

テキストコンポーネント 

JTextField テキスト ボックス

JPasswordField パスワード ボックス

JTextArea テキスト領域

テーブルコンポーネント

テーブルの作成

DefaultTableModel テーブル データ モデル

テーブルモデルを保守する 

イベントリスナー 

ActionEvent アクションイベント

KeyEvent キーボードイベント 

MouseEvent マウスイベント 


概要

String パッケージの階層構造と継承関係は以下のとおりです 

一般的に使用されるSwing コンポーネント次の表

 

スイングの一般的なフォーム 

JFrameフォーム

JFrame クラスの一般的に使用される構築メソッドには、次の 2 つの形式が含まれます。

public JFrame(): 最初は非表示の無題のフォームを作成します。
public JFrame(String title): タイトルを持つ非表示のフォームを作成します。
たとえば、タイトルが付いた非表示のフォームを作成する場合、キー コードは次のとおりです。
 

JFrame jf = new JFrame("システムにログイン");

コンテナコンテナ = jf.getContentPane();

 フォームを作成した後、まず getContentPaneO メソッドを呼び出してフォームをコンテナーに変換し、次に addO メソッドまたは RemoveO メソッドを呼び出してコンポーネントをコンテナーに追加するか、コンテナー内のコンポーネントを削除します。コンテナにボタンを追加します。キーコードは次のとおりです。

JButton okBtn= new JButton("OK")

コンテナ.add(okBtn);

コンテナ内のボタンを削除します。キーコードは次のとおりです。

コンテナ.削除(okBtn); 

フォームを作成したら、フォームの位置やサイズ、表示/非表示の設定など、フォームの設定を行う必要があります。 JFrame クラスによって提供される対応するメソッドは、次のように上記の設定操作を実装できます。

setBounds(int x, int y, int width, int leight): 画面上のフォームの左上隅の座標を (x, y) に設定し、フォームの幅を width に設定します。フォームの高さから高さまで。
setLocation(int x,int y): 画面上のフォームの左上隅の座標を (x, y) に設定します。
setSize(int width, int height): フォームの幅を width に、高さを height に設定します。
setVisibale(boolean b): フォームを表示するかどうかを設定します。 b が true の場合は可視であることを意味し、b が false の場合は不可視であることを意味します。 setDefaultCloseOperation(int activity): フォームの終了メソッドを設定します。デフォルト値は DISPOSE_ON_CLOSE です。 
Java 言語にはフォームのさまざまな終了メソッドが用意されており、一般的に使用されるメソッドは次の 4 つです。表18.2に示します。
例 18.1

import java.awt.*;			//导入AWT包
import javax.swing.*;		//导入Swing包
public class JFreamTest {
	public static void main(String args[]) {		//主方法
		JFrame jf=new JFrame();						//创建窗体对象
		jf.setTitle("创建一个JFream 窗体");				//设置窗体标题
		Container container=jf.getContentPane();	//获取主容器
		JLabel jl=new JLabel("这是一个JLrame 窗体");		//一个文本标签
		jl.setHorizontalAlignment(SwingConstants.CENTER);	//使标签上的文字居中
		container.add(jl);				//将标签添加到主容器中
		jf.setSize(300, 150);			//设置窗体宽高
		jf.setLocation(320,240);		//设置窗体在屏幕中出现的位置
		jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);	//关闭窗体则停止程序
		jf.setVisible(true);			//让窗体展示出来
		}
}//例题18.1

 実行結果は次のとおりです。

「JDialog」ダイアログ・ボックス 

JDialog クラスの一般的に使用される構築メソッドは次のとおりです。

public JDialogO: タイトルと親フォームのないダイアログ ボックスを作成します。
public JDialog(Frame f): タイトルなしで親フォームを指定してダイアログ ボックスを作成します。
public JDialog(Frame f, boolean model): タイトルなしで親フォームとモードを指定してダイアログ ボックスを作成します。モデルが true の場合、ダイアログ ボックスが表示された後、ユーザーは親フォームを操作できません。
public JDialog(Frame f, String title): 指定されたタイトルと親フォームを持つダイアログ ボックスを作成します。
public JDialog(Frame f, String title, boolean model): タイトル、親フォーム、およびモードを指定してダイアログ ボックスを作成します。
例 18.2
 

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
class MyJDialog extends JDialog{					//自定义对话框类,继承 JDialog
	public MyJDialog(MyFrame frame) {
		//调用各类构造方法,第一个参数是父窗口,第二个参数是窗体标题,第三个参数表示阻塞父窗体
		super(frame,"第一个JDialog窗体",true);
		Container container	=getContentPane();
		container.add(new JLabel("这是一个对话框"));		//在容器中添加标签
		setBounds(120,120,100,100);					//设置对话框窗体再桌面显示的坐标和大小
		}
	}
public class MyFrame extends JFrame {			//自定义窗体类,继承JFrame
public MyFrame(){								//窗体的构造方法
	Container container	=getContentPane();		//获得窗体主容器
	container.setLayout(null); 					//容器使用绝对布局
	JButton bl=new JButton("弹出对话框");			//创建一个按钮
	bl.setBounds(10,10,100,21);					//定义按钮在容器中的坐标和大小
	bl.addActionListener(new ActionListener() {	//为按钮添加单击事件
		public void actionPerformed(ActionEvent e) {	//单击事件触发的方法
			MyJDialog dialog = new MyJDialog(MyFrame.this);	//创建MyJDialog对话框
			dialog.setVisible(true);					//使对话框可见
		}
	});
	container.add(bl);		//将按钮添加到容器中
	setSize(200,200);		//窗体的宽高
	setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);	//关闭窗体则停止程序
	setVisible(true);		//使窗体可见
}
 
	public static void main(String[] args) {
		new MyFrame();
	}
 
}//例题18.2

 実行結果は次のとおりです。

JOptionPane の小さなダイアログ ボックス 

JOptionPane には、ダイアログ ボックスを作成するための次の 4 つのメソッドが用意されています。

以下に、これら 4 つのダイアログ ボックスの外観スタイルと使用方法を紹介します。

 1.カスタムダイアログボックス

パラメータの説明は次のとおりです。

parentComponent: ダイアログ ボックスがどのフォームに表示されるかを示します。特定のフォーム オブジェクトが渡された場合、ダイアログ ボックスはフォームの中央に表示されます。null が渡された場合、ダイアログ ボックスはポップされます。画面の真ん中あたりにあります。
メッセージ: プロンプト メッセージ。
title: ダイアログ ボックスのタイトル。
optionType: ダイアログ ボックスで使用できるオプションを指定する整数: DEFAULT_OPTION、YES NO_OPTION.YES NO_CANCEL_OPTION、または OK_CANCEL_OPTION。
messageType: メッセージ タイプを指定する整数。主に、挿入可能な外観からアイコン ERRORMESSAGE、INFORMATION_MESSAGE、WARNING_MESSAGE、QUESTION_MESSAGE、または PLAIN_MESSAGE を決定するために使用されます。
アイコン: ダイアログ ボックスに表示されるアイコン。
オプション: ユーザーが選択できるオブジェクトを示す配列。オブジェクトがコンポーネントの場合、これは正しくレンダリングされ、非 String オブジェクトは toString メソッドを使用してレンダリングされます。このパラメーターが null の場合、外観によってオプションが決まります。
initialValue: ダイアログ ボックスのデフォルトの選択を表すオブジェクト。オプションを使用する場合にのみ意味があり、null にすることもできます。
例 18.3

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JOptionPane;//例题18.3
 
public class Demo{
	public static void main(String[] args){
		Object o[] ={ new JButton("是的"),new JButton("再想想")};		//按钮对象的Object数组
		Icon icon = new ImageIcon("src/pic.png");					//获取图标对象
		JOptionPane.showOptionDialog(null,
				"你做好准备了吗?",
				"注意了!",
				JOptionPane.DEFAULT_OPTION,
				JOptionPane.DEFAULT_OPTION,
				icon, o, null);
	}
}	
 

実行結果は次のとおりです。

2. 確認ボックス 

  • [はい]、[いいえ]、および [キャンセル] のオプションを含む、[オプションの選択] というタイトルのダイアログ ボックスが表示されます。

static int showconfirmDialog(コンポーネントparentComponent, オブジェクトメッセージ)

  • optionType パラメータで決定されたオプションの数を含むダイアログ ボックスを呼び出します。

 static int showconfirmDialog(コンポーネントparentComponent, オブジェクトメッセージ, 文字列タイトル, int optionType)

  • ダイアログ ボックスを呼び出します。このダイアログ ボックスでは、optionType パラメータによってオプションの数が決定され、messageType パラメータによって表示されるアイコンが決定されます。

static int showconfirmDialog(コンポーネントparentComponent,

        オブジェクトメッセージ、

        文字列タイトル、

        int オプションの種類、

        int メッセージタイプ)

         アイコンアイコン)

 例18.4

 
import javax.swing.JOptionPane;
 
public class Demo{//例题18.4
	public static void main(String[] args){
		int answer = JOptionPane.showConfirmDialog(null,
				"确定离开吗?",
				"标题",
				JOptionPane.YES_NO_CANCEL_OPTION);
	}
}

実行結果は次のとおりです。

3.入力ボックス 

入力ボックスは、一連の外観スタイルでカプセル化されています。ポップアップ後、ユーザーはテキスト ボックスにテキストを入力する必要があります。ユーザーが入力操作を完了すると、入力ボックスはユーザーの入力結果を返すことができます。入力ボックスを作成するメソッドには、次のオーバーロードされたフォームがあります。

parentComponent を親として、ユーザー入力を要求する質問メッセージ ダイアログ ボックスを表示します。

static String showlnputDialog(コンポーネントparentComponent、オブジェクトメッセージ)

parentComponent を親として、ユーザー入力を要求する質問メッセージ ダイアログ ボックスを表示します。

static String showlnputDialog(コンポーネントparentComponent、オブジェクトメッセージ、オブジェクトinitialSelectionValue)

ユーザー入力を要求するダイアログ ボックスを表示します。このダイアログ ボックスは、parentComponent によって親化されます。ダイアログ ボックスのタイトルは title、メッセージ タイプは messageType です。

 static String showlnputDialog(コンポーネントparentComponent、オブジェクトメッセージ、文字列タイトル、int messageType)

初期選択、可能な選択、その他すべてのオプションを指定できるモジュール式ダイアログ ボックスでユーザーに入力を求めます。

 

static Object showInputDialog(コンポーネントparentComponent,

                オブジェクトメッセージ、

                文字列タイトル、

                int メッセージタイプ、

                アイコンアイコン、

                オブジェクトの選択値、

                オブジェクトの初期選択値)
 

ユーザー入力を求める質問メッセージ ダイアログ ボックスを表示します。

static String showInputDialog(オブジェクトメッセージ)

 質問メッセージ ダイアログ ボックスを表示し、initialSelectionValue に初期化された入力値を使用してユーザー入力を要求します。

static String showInputDialog(オブジェクトメッセージ, オブジェクトinitialSelectionValue)

例18.5

 
import javax.swing.JOptionPane;
 
public class Demo{
	public static void main(String[] args){
		String name = JOptionPane.showInputDialog(null,"请输入您的名字");
	}
}//例题18.5

 実行結果は次のとおりです。

4.通知ボックス 

通知ボックスを作成するメソッドには、次のオーバーロードされたフォームがあります。

  • 「メッセージ」というタイトルの情報メッセージ ダイアログ ボックスを表示します。

static void showMessageDialog(コンポーネントparentComponent、オブジェクトメッセージ)

  • messageType パラメータで決定されたデフォルトのアイコンを使用してメッセージを表示するダイアログ ボックスを表示します。

static void showMessageDialog(コンポーネントparentComponent,

                オブジェクトメッセージ、

                文字列タイトル、

                int メッセージタイプ)
 

  • すべてのパラメータが指定された情報を表示するダイアログ ボックスを呼び出します。

static void showMessageDialog(コンポーネントparentComponent,

                オブジェクトメッセージ、

                文字列タイトル、

                int メッセージタイプ、

                アイコンアイコン)
 

 例18.6

 
import javax.swing.JOptionPane;
 
public class Demo{
	public static void main(String[] args){
		JOptionPane.showMessageDialog(null, 
				"您与服务器断开连接",
				"发生错误",
				JOptionPane.ERROR_MESSAGE);
	}
}//例题18.6

実行結果は次のとおりです。

よく使用されるレイアウトマネージャー 

null 絶対レイアウト

例18.7

import java.awt.*;
import javax.swing.*;
public class AbsolutePosition extends JFrame{//例题18.7
	public AbsolutePosition(){
		setTitle("本窗体使用绝对布局");		//窗体标题
		setLayout(null);				//使用null布局
		setBounds(0, 0, 300, 150);		//设置窗体的坐标与宽高
		Container c = getContentPane(); //获取主容器
		JButton b1=new JButton("按钮1");  //创建按钮
		JButton b2= new JButton("按钮2");
		b1.setBounds(10, 30, 80, 30);		//设置按钮的位置与大小
		b2.setBounds(60, 70, 100, 20);
		c.add(b1);							//将按钮添加到容器中
		c.add(b2);
		setVisible(true);					//使窗体可见
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭窗体则停止程序
	}
	public static void main(String[] args) {
		new AbsolutePosition();
	}
}
 

 実行結果は次のとおりです。

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

FlowLayout クラスには、一般的に使用される次のコンストラクターがあります。

public FlowLayout()。
public FlowLayout(intalignment)。
public FlowLayout(intalignment,int horizGap,int vertGap)。あ>

 例18.8

import java.awt.*;
import javax.swing.*;
public class FlowLayoutPosition extends JFrame {
	public FlowLayoutPosition(){
		setTitle("本窗体使用流布局管理器");		//设置窗体标题
		Container c = getContentPane();
		//窗体使用流布局,组件右对齐,组件之间的水平间隔为 10 像素,垂直间隔为 10像素
		setLayout(new FlowLayout(FlowLayout.RIGHT,10, 10));
		for (int i= 0;i< 10; i++){		//在容器中循环添加10个按钮
			c.add(new JButton("button" + i));
		}
			setSize(300,200);			//设置窗体大小
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); //关闭窗体则停止程序
			setVisible(true);			//设置窗体可见
	}
	public static void main(String[] args){
		new FlowLayoutPosition();
	}
}//例题18.8

実行結果は次のとおりです。

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

 

addoメソッドはコンテナにコンポーネントを追加する機能を実装するメソッドで、コンポーネントの配置位置を設定することができます。 addO メソッドでよく使用される式

法的な形式は次のとおりです。

public void add(コンポーネントのコンストレイント、オブジェクトのコンストレイント)

  • comp: 追加されたコンポーネント。
  • constraints: 追加されたコンポーネントのレイアウト制約オブジェクト。

例18.9
 

import java.awt.*;
import javax.swing.*;
public class BorderLayoutPosition extends JFrame{
	public BorderLayoutPosition(){
		setTitle("这个窗体使用边界布局管理器");
		Container c = getContentPane();		//获取主容器
		setLayout(new BorderLayout());		//容器使用边界布局
		JButton centerBtn = new JButton("中");
		JButton northBtn = new JButton("北");
		JButton southBtn= new JButton("南");
		JButton westBtn = new JButton("西");
		JButton eastBtn = new JButton("东");
		c.add(centerBtn, BorderLayout.CENTER);		//中部添加按钮
		c.add(northBtn, BorderLayout.NORTH);		//北部添加按钮
		c.add(southBtn, BorderLayout.SOUTH);		//南部添加按钮
		c.add(westBtn, BorderLayout.WEST);			//西部添加按钮
		c.add(eastBtn, BorderLayout.EAST);			//东部添加按钮
		setSize(350, 200);							//设置窗体大小
		setVisible(true);							//设置窗体可见
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);			//关闭窗体则停止程序
	}
		public static void main(String[] args){
				new BorderLayoutPosition();
		}
}//例题18.9		
 
			
 
 

 実行結果は次のとおりです。

 

GridLayout ネットワーク レイアウト マネージャー

グリッド レイアウト マネージャーには、主に次の 2 つの一般的に使用される構築方法があります。

public GridLayout(int 行、int 列)。
public GridLayout(int rows, int columns, int horizGap, int vertGap)。
このうち、パラメータ rows と columns は、それぞれグリッドの行数と列数を表します。これら 2 つのパラメータのうち 1 つだけが 0 にできます。これは、任意の数のグリッドが存在することを示すために使用されます。行または列を配置できます。コンポーネント; パラメータ horizGap と vertGap は、それぞれグリッド間の水平方向の間隔と垂直方向の間隔を表します。

例18.10

import java.awt.*;
import javax.swing.*;
public class GridLayoutPosition extends JFrame{
	public GridLayoutPosition(){
			Container c = getContentPane();
			//设置容器使用网格布局管理器,设置7行3列的网格。组件间水平间距为5像素,垂直间距为5像素
			setLayout(new GridLayout(7, 3, 5, 5));
			for (int i=0;i<20; i++){
				c.add(new JButton("button"+i));			//循环添加按钮
			}
			setSize(300, 300);
			setTitle("这是一个使用网格布局管理器的窗体");
			setVisible(true);
			setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		}
			public static void main(String[] args){
				new GridLayoutPosition();
			}
		}//例题18.10

実行結果は次のとおりです。

 

よく使われるパネル 

JPパネルパネル

JPanel パネルはフォーム コンテナ内で使用する必要があり、フォームの外に表示することはできません。

例18.11

 

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
 
public class JPaneITest extends JFrame{
	public JPaneITest(){
		Container c = getContentPane();
		//将整个容器设置为2行2列的网格布局,组件水平间隔10像素,垂直间隔10像素
		c.setLayout(new GridLayout(2, 2, 10, 10));
		//初始化一个面板,此面板使用1行4列的网格布局,组件水平间隔10像素,垂直间隔10像素
		JPanel p1= new JPanel(new GridLayout(1, 4, 10, 10));
		//初始化一个面板,此面板使用边界布局
		JPanel p2 = new JPanel(new BorderLayout());
		//初始化一个面板,此面板使用1行2列的网格布局,组件水平间隔10像素,垂直间隔10像素
		JPanel p3 = new JPanel(new GridLayout(1, 2, 10, 10));
		//初始化一个面板,此面板使用2行1列的网格布局,组件水平间隔10像素,垂直间隔10像素
		JPanel p4 = new JPanel(new GridLayout(2, 1, 10, 10));
		//给每个面板都添加边框和标题,使用BorderFactory工厂类生成带标题的边框对象
		p1.setBorder(BorderFactory.createTitledBorder("面板 1"));
		p2.setBorder(BorderFactory.createTitledBorder("面板 2"));
		p3.setBorder(BorderFactory.createTitledBorder("面板 3"));
		p4.setBorder(BorderFactory.createTitledBorder("面板 4"));
		//向面板1中添加按钮
		p1.add(new JButton("b1"));
		p1.add(new JButton("b1"));
		p1.add(new JButton("b1"));
		p1.add(new JButton("b1"));
		//向面板2中添加按钮
		p2.add(new JButton("b2"), BorderLayout.WEST);
		p2.add(new JButton("b2"), BorderLayout.EAST);
		p2.add(new JButton("b2"), BorderLayout.NORTH);
		p2.add(new JButton("b2"), BorderLayout.SOUTH);
		p2.add(new JButton("b2"), BorderLayout.CENTER);
		//向面板3中添加按钮
		p3.add(new JButton("b3"));
		p3.add(new JButton("b3"));
		//向面板4中添加按钮
		p4.add(new JButton("b4"));
		p4.add(new JButton("b4"));
		//向容器中添加面板
		c.add(p1);
		c.add(p2);
		c.add(p3);
		c.add(p4);
		setTitle("在这个窗体中使用了面板");
		setSize(500, 300);											//窗体宽高
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); //关闭动作
	}
	public static void main(String[] args){
		JPaneITest test = new JPaneITest();
		test.setVisible(true);
	}
}//例题18.11
				
 
				
 

実行結果は次のとおりです。

JScrollPane スクロール パネル 

JScrollPane スクロール パネルはレイアウト マネージャーを使用できず、1 つのコンポーネントのみを収容できます

 例18.12

import java.awt.Container;
 
import javax.swing.*;
 
public class JScrollPaneTest extends JFrame{
	public JScrollPaneTest() {
		Container c	=getContentPane();			//获取主容器
		JTextArea ta = new JTextArea(20,50);
		JScrollPane sp =new JScrollPane(ta);
		c.add(sp);								//将该面板添加到主容器中
		setTitle("带滚动条的文字编译器");
		setSize(40,200);
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	}
 
	public static void main(String[] args) {
		JScrollPaneTest test= new JScrollPaneTest();
		test.setVisible(true);
	}
 
}//例题18.12

 実行結果は次のとおりです。

 テキストラベルのコンポーネントとアイコン

JLableタグ

JLabel クラスの一般的に使用される構築メソッドは次のとおりです。
public JLabel0: アイコンやテキストのないラベルを作成します。
public JLabel(アイコン アイコン): アイコン付きのラベルを作成します。
public JLabel(Icon icon, intalignment): アイコンを含むラベルを作成し、アイコンの水平方向の配置を設定します。
public JLabel(String text, intalignment): テキストを含むラベルを作成し、テキストの水平方向の配置を設定します。
public JLabel(String text, Icon icon, intalignment): テキストとアイコンを含む JLabel オブジェクトを作成し、テキストとアイコンの水平方向の配置を設定します。
例 18.13

import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;
 
public class JLableITest extends JFrame{
	public JLableITest(){
		Container container = getContentPane();
		JLabel jI= new JLabel("这是一个 JFrame 窗体");					//创建标签
		container.add(jI);											//将标签添加到容器中
		setSize(200, 100);											//设置窗体大小
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);	//设置窗体关闭模式
		setVisible(true);											//使窗体可见
	}
public static void main(String args[]){
	new JLableITest();
	}
}//例题18.13
 
 
 
 
 
 
 
 
 

実行結果は次のとおりです。

アイコンの使用

Swing プログラミングでは、ラベルやボタンなどのコンポーネントにアイコンが追加されることがよくありますが、既存のイメージに基づいてアイコンを作成するには、javax.swing.Imagelcon クラスを使用します。 ImageIcon クラスは、複数の構築メソッドを持つ Icon インターフェイスを実装します。一般的に使用されるメソッドは次のとおりです。

public ImagelconO: Imagelcon オブジェクトを作成します。ImageIcon オブジェクトを作成した後、それを使用して setImage(Image image) メソッドを呼び出し、画像を設定します。
public Imagelcon(イメージ画像): 既存のイメージに基づいてアイコンを作成します。
public ImageIcon(URL url): 既存の画像のパスに基づいてアイコンを作成します。
例 18.14

import java.awt.*;
import java.net.URL;
import javax.swing.*;
 
public class MyImageIcon extends JFrame{
	public MyImageIcon() {
		Container container = getContentPane();
		JLabel jl = new JLabel("这是一个JLabel 窗体");					//创建标签
		URL url =MyImageIcon.class.getResource("pic.png");			//获取图片所在的URL
		Icon icon = new ImageIcon(url);		//获取图片的Icon对象
		jl.setIcon(icon);		//为标签设置图片
		jl.setHorizontalAlignment(SwingConstants.CENTER);			//设置文字放置在标签中间
		jl.setOpaque(true);		//设置标签为不透明状态
		container.add(jl);		//将标签添加到容器中
		setSize(300,200);		//设置窗体大小
		setVisible(true);		//使窗体可见
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);	//关闭窗体则停止程序
	}
 
	public static void main(String[] args) {
		new MyImageIcon();
 
	}
 
}//例题18.14

実行結果は次のとおりです。

 

ボタンコンポーネント 

JButton ボタン

スイング ボタンは JButton オブジェクトで表され、一般的に使用される JButton の構築メソッドは次のとおりです。

public JButtonO: テキストやアイコンのないボタンを作成します。
public JButton(String text): テキストを含むボタンを作成します。
public JButton(アイコン アイコン): アイコン付きのボタンを作成します。
public JButton(String text, Icon icon): テキストとアイコンを含むボタンを作成します。
JButton オブジェクトを作成した後、JButton オブジェクトを設定する場合は、JButton クラスが提供するメソッドを使用できます。

JButton クラスの一般的なメソッドと説明を表 18.6 に示します。

 例18.15

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JButtonTest extends JFrame {
	public JButtonTest(){
		Icon icon = new ImageIcon("src/pic.jpg");			//获取图片文件
		setLayout(new GridLayout(3, 2, 5, 5));				//设置网格布局管理器
		Container c = getContentPane();						//获取主容器
		JButton btn[]=new JButton[6];						//创建按钮数组
		for (int i= 0; i< btn.length; i++){
			btn[i]= new JButton();							//实例化数组中的对象
			c.add(btn[i]);									//将按钮添加到容器中
		}
		btn[0].setText("不可用");
		btn[0].setEnabled(false);							//设置按钮不可用
		btn[1].setText("有背景色");
		btn[1].setBackground(Color.YELLOW);
		btn[2].setText("无边框");
		btn[2].setBorderPainted(false);						//设置按钮边框不显示
		btn[3].setText("有边框");
		btn[3].setBorder(BorderFactory.createLineBorder(Color.RED));	//添加红色线型边框
		btn[4].setIcon(icon);								//为按钮设置图标
		btn[4].setToolTipText("图片按钮");						//设置鼠标悬停时提示的文字
		btn[5].setText("可点击");
		btn[5].addActionListener(new ActionListener(){		//为按钮添加监听事件
		public void actionPerformed(ActionEvent e){
			JOptionPane.showMessageDialog(JButtonTest.this,"点击按钮");	//出确认对话框
			}
		});
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
		setTitle("创建不同样式的按钮");
		setBounds(100, 100, 400,200);
	}
		public static void main(String[] args){
			new JButtonTest();
		}
}//例题18.15

 実行結果は次のとおりです。

 

JRadinButton ラジオ ボタン 

1. ラジオボタン

JRadioButton オブジェクトを作成するには、JRadioButton クラスのコンストラクターを使用する必要があります。 JRadioButton クラスの一般的に使用される構築メソッドは次のとおりです。

public JRadioButton(): 未設定のテキストを含む未選択のラジオ ボタンを作成します。
public JRadioButton(Icon icon): 選択されておらず、テキストも設定されていないが、指定されたアイコンを持つラジオ ボタンを作成します。
public JRadioButton(Icon icon, boolean selected): 指定されたアイコンと選択状態でラジオ ボタンを作成しますが、テキスト領域は設定されていません。
public JRadioButton(String text): 指定されたテキストでラジオ ボタンを作成しますが、選択されていません。
public JRadioButton(String text, Icon icon): 指定されたテキスト、指定されたアイコンで、選択されていない
ラジオ ボタンを作成します。
public JRadioButton(String text, Icon icon, boolean selected): 指定されたテキスト、指定されたアイコン、選択状態のラジオ ボタンを作成します。
上記の構築方法の関連する紹介によれば、ラジオ ボタンのアイコン、テキスト、選択状態、およびその他の属性を同時に設定できることがわかります。たとえば、JRadioButton クラスのコンストラクターを使用して、「オプション A」というテキストを持つラジオ ボタンを作成します。キー コードは次のとおりです。
 

JRadioButton rbtn = new JRadioButton("オプション A"); 

2.ボタングループ

スイング ボタン グループは ButtonGroup オブジェクトで表され、ボタン グループに複数のラジオ ボタンを追加すると、「複数のオプションを実現できます。」

ButtonGroup オブジェクトを作成した後、addO メソッドを使用して複数のラジオ ボタンを追加できます。

ButtonGroup オブジェクト。

 例18.6

import javax.swing.*;
public class RadioButtonTest extends JFrame {
	public RadioButtonTest() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setTitle("单选按钮的使用");
		setBounds(100, 100, 240, 120);
		getContentPane().setLayout(null);
		JLabel IblNewLabel= new JLabel("请选择性别:");
		IblNewLabel.setBounds(5, 5, 120, 15);
		getContentPane().add(IblNewLabel);
		JRadioButton rbtnNormal = new JRadioButton("男");
		rbtnNormal.setSelected(true);
		rbtnNormal.setBounds(40, 30, 75, 22);
		getContentPane().add(rbtnNormal);
		JRadioButton rbtnPwd = new JRadioButton("女");
		rbtnPwd.setBounds(120, 30, 75, 22);
		getContentPane().add(rbtnPwd);
		ButtonGroup group = new ButtonGroup();//创建按钮组,把交互面板中的单选按钮添加到按钮组中
		group.add(rbtnNormal);
		group.add(rbtnPwd);
	}
	public static void main(String[] args){
		RadioButtonTest frame = new RadioButtonTest();		//创建窗体对象
		frame.setVisible(true);								//使窗体可见
	}
}//例题18.16

実行結果は次のとおりです。

JCheckBox チェック ボックス 
JCheckBox の一般的な構築方法は次のとおりです。

public JCheckBox(): テキストとアイコンが設定されておらず、デフォルトではチェックされていないチェック ボックスを作成します。
public JCheckBox(アイコン アイコン、ブール値チェック): 指定されたアイコンを使用してチェック ボックスを作成し、最初に選択されているかどうかを指定しますが、テキストは設定されていません。
public JCheckBox(String text, Boolean selected): 指定されたテキストでチェック ボックスを作成し、最初に選択されているがアイコンが設定されていないかを指定します。
例 18.17
 

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
import javax.swing.event.AncestorListener;
 
public class CheckBoxTest extends JFrame{
	public CheckBoxTest() {
		setBounds(100,100,170,110);					//床楼大小和坐标
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c	=getContentPane();				//获取主容器
		c.setLayout(new FlowLayout());				//容器使用流布局
		JCheckBox c1 =new JCheckBox("1");			//创建复选框
		JCheckBox c2 =new JCheckBox("2");
		JCheckBox c3 =new JCheckBox("3");
		c.add(c1);									//容器添加复选框
		c.add(c2);
		c.add(c3);
		JButton btn = new JButton("打印");			//创建“打印”按钮
		btn.addActionListener(new ActionListener() {	//“打印”按钮动作事件
			public void actionPerformed(ActionEvent e) {
				System.out.println(c1.getText()+"按钮选中状态:"+c1.isSelected());
				System.out.println(c2.getText()+"按钮选中状态:"+c2.isSelected());
				System.out.println(c3.getText()+"按钮选中状态:"+c3.isSelected());
			}
		});
		c.add(btn);			//容器添加“打印”按钮
		setVisible(true);
			
	}
 
	public static void main(String[] args) {
		new CheckBoxTest();
 
	}
 
}//例题18.17

 実行結果は次のとおりです。

チェックボックスを選択すると、実行結果は次のようになります。

 

リストコンポーネント 

JComboBox ドロップダウン リスト ボックス

JComboBox クラスの一般的な構築メソッドは次のとおりです。

public JComboBox(ComboBoxModeldataModel): JComboBox オブジェクトを作成します。ドロップダウン リストのリスト項目は ComboBoxModel のリスト項目を使用します。ComboBoxModel はコンボ ボックスのデータ モデルです。
public JComboBox(Object[]arrayData): 指定された配列内の要素を含む JComboBox オブジェクトを作成します。
public JComboBox(Vector Vector): 指定された Vector オブジェクト内の要素を含む JComboBox オブジェクトを作成します。Voetor オブジェクト内の要素には整数インデックスを介してアクセスでき、Vector オブジェクト内の要素にはアクセスできます。オンデマンドでアクセスして追加または削除できます。
JComboBox クラスの一般的なメソッドと説明を表 18.7 に示します。

例18.18

import java.awt.event.*;
import javax.swing.*;
public class JComboBoxTest extends JFrame{
	public JComboBoxTest() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setTitle("下拉列表框的使用");
		setBounds(100, 100, 317,147);
		getContentPane().setLayout(null);							//设置绝对布局
		JLabel IbINewLabel= new JLabel("请选择证件:");					//设置坐标
		IbINewLabel.setBounds(28, 14, 80, 15);						//为下拉列表中添加项
		getContentPane().add(IbINewLabel);
		JComboBox<String> comboBox = new JComboBox<String>();		//创建一个下拉列表框
		comboBox.setBounds(110, 11, 80,21);
		comboBox.addItem("军人证");
		comboBox.addItem("身份证");
		comboBox.addItem("学生证");
		comboBox.addItem("工作证");
		comboBox.setEditable(true);
		getContentPane().add(comboBox);								//将下拉列表添加到容器中
		JLabel IblResult = new JLabel("");
		IblResult.setBounds(0, 57, 146, 15);
		getContentPane().add(IblResult);
		JButton btnNewButton= new JButton("确定");
		btnNewButton.setBounds(200,10, 67, 23);
		getContentPane().add(btnNewButton);
		btnNewButton.addActionListener(new ActionListener() {		//为按钮添加监听事件
			@Override
			public void actionPerformed(ActionEvent argo){
				//获取下拉列表中的选中项
				IblResult.setText("您选择的是:"+comboBox.getSelectedItem());
			}
		});
	}
	public static void main(String[] args){
		JComboBoxTest frame = new JComboBoxTest();					//创建窗体对象
		frame.setVisible(true);										//使窗体可见
	}
}//例题18.18

実行結果は次のとおりです。

JList リストボックス 

JList クラスの一般的な構築メソッドは次のとおりです。

public void JList(): 空の JList オブジェクトを作成します。
public void JList(Object[] listData): 指定された配列内の要素を表示する JList オブジェクトを作成します。
public void JList(Vector listData): 指定された Vector 内の要素を表示する JList オブジェクトを作成します。
public void JList(ListModel dataModel): 指定された非 null モデルの要素を表示する JList オブジェクトを作成します。
例 18.19

import java.awt.Container;
import java.awt.event.*;
import javax.swing.*;
public class JListTest extends JFrame {
	public JListTest(){
		Container cp = getContentPane();		//获取窗体主容器
		cp.setLayout(null);//容器使用绝对布局
		//创建字符串数组,保存列表中的数据
		String[] contents ={"列表 1","列表 2","列表 3","列表 4","列表 5","列表6"};
		JList<String> jl = new JList<>(contents);	//创建列表框,并将字符串数组作为构造参数
		JScrollPane js = new JScrollPane(jl);		//将列表框放入滚动面板
		js.setBounds(10, 10, 100, 109);				//设没定滚动面板的坐标和大小
		cp.add(js);
		JTextArea area = new JTextArea();			//创建文本域	
		JScrollPane scrollPane = new JScrollPane(area);		//将文本域放入滚动面板
		scrollPane.setBounds(118, 10, 73, 80);
		cp.add(scrollPane);
		JButton btnNewButton=new JButton("确认");		//创建"确认"按钮
		btnNewButton.setBounds(120,96, 71, 23);		//设定按钮的坐标和大小
		cp.add(btnNewButton);
		btnNewButton.addActionListener(new ActionListener() {	添加按钮事件
			public void actionPerformed(ActionEvent e) {
				//获取列表中选中的元素,返回java.util.List类型
				java.util.List<String> values = jl.getSelectedValuesList();
				area.setText("");					//清空文本域
					for (String value : values){
						area.append(value + "n");	//在文本域循环追加列表框中选中的值
					}
			}
		});
		setTitle("在这个窗体中使用了列表框");
		setSize(217,167);
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
		public static void main(String args[]) {
			new JListTest();
		}
}//例题18.19

実行結果は次のとおりです。

 

テキストコンポーネント 

JTextField テキスト ボックス

テキスト ボックス コンポーネントは JTextField オブジェクトによって表されます。 JTextField クラスの一般的な構築メソッドは次のとおりです。

public JTextFieldO: 未指定のテキストを含むテキスト ボックスを作成します。
public JTextField(String text): 指定したテキストを含むテキスト ボックスを作成します。
public JTextField(int fieldwidth): 指定された列幅のテキスト ボックスを作成します。
public JTextField(String text, int fieldwidth): 指定したテキストと列幅でテキスト ボックスを作成します。
public JTextField(Document docModel, String text, int fieldWidth): テキスト モデル、コンテンツ、列幅を指定してテキスト ボックスを作成します。
テキストが指定されていないテキスト ボックスにテキストの内容を設定する場合は、setTextO メソッドを使用する必要があります。 setText0 メソッドの構文は次のとおりです。
 

public void setText(String t)

このうち、tはテキストボックスに表示されるテキスト内容を表します。

例18.20

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
public class JTextFieldText extends JFrame{
	public JTextFieldText() {
		Container c	=getContentPane();					//获取窗体主容器
		c.setLayout(new FlowLayout());
		JTextField jt = new JTextField("请点击清除按钮");		//设定文本框初始值
		jt.setColumns(20);								//设置文本框长度
		jt.setFont(new Font("宋体",Font.PLAIN,20));		//设置字体
		JButton jb = new JButton("清除");
		jt.addActionListener(new ActionListener() {		//为文本框添加回车事件
			public void actionPerformed(ActionEvent arg0) {
				jt.setText("触发事件");					//设置文本框中的值
			}
		});
		jb.addActionListener(new ActionListener() {		//为按钮添加事件
			public void actionPerformed(ActionEvent arg0) {
				System.out.println(jt.getText());		//输出当前文本框的值
				jt.setText("");							//将文本框置空
				jt.requestFocus();						//焦点回到文本框
			}
		});
		c.add(jt);										//窗体容器添加文本框
		c.add(jb);										//窗体添加按钮
		setBounds(100,100,250,110);
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
 
	public static void main(String[] args) {
		new JTextFieldText();
 
	}
 
}//例题18.20

 実行結果は次のとおりです。

 

JPasswordField パスワード ボックス

パスワード ボックス コンポーネントは JPasswordField オブジェクトによって表され、その機能はユーザーが入力した文字列を特定の記号で暗号化することです。 JPasswordField クラスの一般的な構築メソッドは次のとおりです。

public JPasswordFieldO: 未指定のテキストを含むパスワード フィールドを作成します。
public JPasswordFiled(String text): 指定したテキストを使用してパスワード ボックスを作成します。
public JPasswordField(int fieldwidth): 指定された列幅でパスワード ボックスを作成します。
public JPasswordField(String text, int fieldwidth): 指定されたテキストと列幅でパスワード ボックスを作成します。
public JPasswordField(Document docModel, String text, int fieldWidth): 指定されたテキスト モデルと列幅でパスワード ボックスを作成します。
JPasswordField クラスは、パスワード ボックスのエコー文字を変更するために使用される setEchoCharO メソッドを提供します。 setEchoCharO メソッドの構文は次のとおりです。

public void setEchoChar(char c)

このうち、c はパスワードボックスに表示されるエコー文字を表します。

JTextArea テキスト領域

Text City コンポーネントは JTextArea オブジェクトによって表され、ユーザーからの複数行のテキスト入力を受け入れるために使用されます。 JTextArea クラスの一般的な構築メソッドは次のとおりです。

 patie TextArea0: 未指定のテキストを含むテキスト領域を作成します。
publie NTtextArea(String text): 指定されたテキストを含むテキスト領域を作成します。
pabic leatAesfint rows,int columns): 指定された行の高さと列の幅、ただしテキストが指定されていないテキスト フィールドを作成します。
public JTextArea(Document doc): ドキュメント モデルを指定してテキスト領域を作成します。

public JTextArea(Document doc,String Text,int rows,int columns): 内容、行の高さ、列の幅を含むテキスト領域を作成します。

例18.21

import java.awt.*;
import javax.swing.*;
public class JTextAreaTest extends JFrame {
	public JTextAreaTest(){
		setSize(200,100);
		setTitle("定义自动换行的文本域");
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		Container cp = getContentPane();			//获取窗体主容器
		//创建一个文本内容为“文本域”、行高和列宽均为6的文本域
		JTextArea jt = new JTextArea("文本域",6,6);
		jt.setLineWrap(true);						//可以自动换行
		cp.add(jt);
		setVisible(true);
	}
		public static void main(String[] args) {
			new JTextAreaTest();
		}
	}//例题18.21

実行結果は次のとおりです。

テーブルコンポーネント

テーブルの作成

デフォルトのコンストラクターに加えて、JTable クラスは、2 次元配列内の要素を表示するために使用されるコンストラクターも提供します。

コンストラクター メソッドの構文は次のとおりです。

 JTable(Object[][] rowData, Objectl columnNames)

  • rowData: テーブル データを格納する 2 次元配列。
  • columnNames: テーブルの列名を格納する 1 次元配列。

例18.22

import java.awt.*;
import javax.swing.*;
public class JTableDemo extends JFrame {
	public static void main(String args[]) {
		JTableDemo frame = new JTableDemo();
		frame.setVisible(true);
	}
	public JTableDemo(){
		setTitle("创建可以滚动的表格");
		setBounds(100, 100, 240, 150);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		String[] columnNames = {"A","B"};				//定义表格列名数组
		//定义表格数据数组
		String[][] tableValues = {
   
   {"A1","B1"},{"A2","B2"},{"A3","B3"},
				{"A4","B4"}, {"A5", "B5"}};
		//创建指定列名和数据的表格
		JTable table = new JTable(tableValues, columnNames);
		//创建显示表格的滚动面板
		JScrollPane scrollPane = new JScrollPane(table);
		//将滚动面板添加到边界布局的中间
		getContentPane().add(scrollPane, BorderLayout.CENTER);
	}
}//例题18.22

実行結果は次のとおりです。

DefaultTableModel テーブル データ モデル

Swing は、TableModel インターフェイスを使用してテーブル モデルを定義します。AbstractTableModel 抽象クラスは、TableModel インターフェイスのほとんどのメソッドを実装します。次の 3 つの抽象メソッドのみが実装されていません:

public int getRowCountO);
public int getColumnCountO);
public Object getValueAt(int rowIndex, int columnIndex);
テーブルモデルを使用してテーブルを作成する機能を実現するために、Swing はテーブルモデルクラス、つまり DefaultTableModel クラスを提供します。 DefaultTableModel クラスは、AbstractTableModel 抽象クラスを継承し、上記の 3 つの抽象メソッドを実装します。 DefaultTableModel クラスによって提供される一般的な構築メソッドを表 18.8 に示します。

例18.23

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
public class SortingTable extends JFrame {
	private static final long seriaIVersionUID= 1L;
	public static void main(String args[]){
		SortingTable frame = new SortingTable();
		frame.setVisible(true);
	}
	public SortingTable(){
		setTitle("表格模型与表格");
		setBounds(100, 100, 240, 150);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JScrollPane scrollPane = new JScrollPane();
		getContentPane().add(scrollPane, BorderLayout.CENTER);
		String[] columnNames = {"A","B"};					//定义表格列名数组
		//定义表格数据数组
		String[][] tableValues = {
   
   {"A1","B1"}, {"A2","B2"}, {"A3","B3"}};
		//创建指定表格列名和表格数据的表格模型
		DefaultTableModel tableModel = new DefaultTableModel(tableValues,columnNames);
		JTable table = new JTable(tableModel);
		table.setRowSorter(new TableRowSorter<>(tableModel));
		scrollPane.setViewportView(table);
	}
}//例题18.23

 実行結果は次のとおりです。

テーブルモデルを保守する 

例18.24

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;//例题18.24
public class AddAndDeleteDemo extends JFrame{
 
	private DefaultTableModel tableModel;
	private JTable table;
	private JTextField aTextField;
	private JTextField bTextField;
	public static void main(String args[]){
		AddAndDeleteDemo frame = new AddAndDeleteDemo();
		frame.setVisible(true);
	}
	public AddAndDeleteDemo(){
		setTitle("维护表格模型");
		setBounds(100, 100, 520, 200);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		final JScrollPane scrollPane = new JScrollPane();
		getContentPane().add(scrollPane, BorderLayout.CENTER);
		String[] columnNames = {"A","B"};		//定义表格列名数组
		//定义表格数据数组
		String[][] tableValues = {
   
   {"A1","B1"}, {"A2","B2"},{"A3","B3"}};
		//创建指定表格列名和表格数据的表格模型
		tableModel = new DefaultTableModel(tableValues,columnNames);
		table = new JTable(tableModel);		//创建指定表格模型的表格
		table.setRowSorter(new TableRowSorter<>(tableModel));	//设置表格的排序器
		//设置表格的选择模式为单选
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		//为表格添加鼠标事件监听器
		table.addMouseListener(new MouseAdapter(){
		public void mouseClicked(MouseEvent e) {	//发生了单击事件
		int selectedRow = table.getSelectedRow();	//获得被选中行的索引
		//从表格模型中获得指定单元格的值
		Object oa = tableModel.getValueAt(selectedRow, 0);
		//从表格模型中获得指定单元格的值
		Object ob = tableModel.getValueAt(selectedRow, 1);
		aTextField.setText(oa.toString());		//将值赋值给文本框
		bTextField.setText(ob.toString());		//将值赋值给文本框
		}
		});
		scrollPane.setViewportView(table);
		JPanel panel = new JPanel();
		getContentPane().add(panel, BorderLayout.SOUTH);
		panel.add(new JLabel("A:"));
		aTextField = new JTextField("A4", 10);
		panel.add(aTextField);
		panel.add(new JLabel("B:"));
		bTextField = new JTextField("B4", 10);
		panel.add(bTextField);
		JButton addButton = new JButton("添加");
		addButton.addActionListener(new ActionListener(){
		public void actionPerformed(ActionEvent e){
			String[] rowValues = {aTextField.getText(),
				bTextField.getText()};		//创建表格行数组
			tableModel.addRow(rowValues);	//向表格模型中添加一行
			int rowCount = table.getRowCount()+ 1;
			aTextField.setText("A"+ rowCount);
			bTextField.setText("B"+ rowCount);
			}
		});
		panel.add(addButton);
		JButton updButton = new JButton("修改");
		updButton.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				int selectedRow = table.getSelectedRow();		//获得被选中行的索引
				if (selectedRow !=-1){							//判断是否存在被选中行
					//修改表格模型中的指定值
					tableModel.setValueAt(aTextField.getText(), selectedRow, 0);
					//修改表格模型中的指定值
					tableModel.setValueAt(bTextField.getText(), selectedRow, 1);
				}
			}
		});				
		panel.add(updButton);
		JButton delButton = new JButton("删除");
		delButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				int selectedRow = table.getSelectedRow();		//获得被选中行的索引
				if (selectedRow !=-1);							//判断是否存在被选中行
					tableModel.removeRow(selectedRow);			//从表格模型中删除指定行
			    }
		});
		panel.add(delButton);
	}
}
 
		
		

 実行結果は次のとおりです。

イベントリスナー 

ActionEvent アクションイベント

Action time () ActionEvent リスナーは、Swing で一般的に使用されるイベント リスナーで、ボタンがクリックされたときなど、多くのコンポーネントのアクションをリッスンするために使用されます。

 

例18.25

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
 
public class SimpleEvent extends JFrame{
	private JButton jb = new JButton("我是按钮,点击我");
	
	public SimpleEvent() {
		setLayout(null);
		setSize(200,100);
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		Container cp=getContentPane();
		cp.add(jb);
		jb.setBounds(10,10,150,30);
		jb.addActionListener(new jbAction());
		setVisible(true);
		
	}
	class jbAction implements ActionListener{
		public void actionPerformed(ActionEvent arg0) {
			jb.setText("我被点击了");
		}
	}
	public static void main(String[] args) {
		new SimpleEvent();
 
	}
 
}//例题18.25

実行結果は次のとおりです。

KeyEvent キーボードイベント 

テキスト ボックスに入力すると、キーボード イベントが発生します。 KeyEvent クラスはキーボード イベントのキャプチャを担当します。KeyListener インターフェイスを実装するリスナー クラスをコンポーネントに追加することで、対応するキーボード イベントを処理できます。
KeyListener インターフェイスには 3 つの抽象メソッドがあり、キーストローク イベントが発生した場合(キーが押されて放された場合)、キーが押された場合(指がキーを押したが離さない場合)に使用されます。次のように、キーが放されます (押されたキーから指が放されるとトリガーされます)。
 

パブリック インターフェイス KeyListener extends EventListener {

        Public void keyTyped(KeyEvent e); //キーストロークイベントが発生するとトリガーされる

        Public void keyPressed(KeyEvent e); //キーが押されたときにトリガーされる

        Public void keyReleased(KeyEvent e); //キーが放されたときにトリガーされる
 

 KeyEvent の一般的に使用されるメソッドは次のとおりです。

例18.26

 
import java.awt.BorderLayout;
import java.awt.EventQueue;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.Color;
import java.awt.Component;
 
import javax.swing.JButton;
import java.awt.Font;
import javax.swing.SwingConstants;
import javax.swing.border.TitledBorder;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
 
import javax.swing.JTextField;
 
// 虚拟键盘(键盘的按下与释放)
 
public class KeyBoard extends JFrame { // 创建“键盘”类继承JFrame
	// 声明窗体中的成员组件
	private JPanel contentPane;
	private JTextField textField;
	private JButton btnQ;
	private JButton btnW;
	private JButton btnE;
	private JButton btnR;
	private JButton btnT;
	private JButton btnY;
	private JButton btnU;
	private JButton btnI;
	private JButton btnO;
	private JButton btnP;
	private JButton btnA;
	private JButton btnS;
	private JButton btnD;
	private JButton btnF;
	private JButton btnG;
	private JButton btnH;
	private JButton btnJ;
	private JButton btnK;
	private JButton btnL;
	private JButton btnZ;
	private JButton btnX;
	private JButton btnC;
	private JButton btnV;
	private JButton btnB;
	private JButton btnN;
	private JButton btnM;
	Color green = Color.GREEN;// 定义Color对象,用来表示按下键的颜色
	Color white = Color.WHITE;// 定义Color对象,用来表示释放键的颜色
 
	ArrayList<JButton> btns = new ArrayList<JButton>();// 定义一个集合,用来存储所有的按键ID
	// 自定义一个方法,用来将容器中的所有JButton组件添加到集合中
 
	private void addButtons() {
		for (Component cmp : contentPane.getComponents()) {// 遍历面板中的所有组件
			if (cmp instanceof JButton) {// 判断组件的类型是否为JButton类型
				btns.add((JButton) cmp);// 将JButton组件添加到集合中
			}
		}
	}
 
	//主方法
	 
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() { // 使得Runnable中的的run()方法在the system EventQueue的指派线程中被调用
			public void run() {
				try {
					KeyBoard frame = new KeyBoard(); // 创建KeyBoard对象
					frame.setVisible(true); // 使frame可视
					frame.addButtons();// 初始化存储所有按键的集合
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
 
	// 创建JFrame窗体
	 
	public KeyBoard() { // KeyBoard的构造方法
		setTitle("\u865A\u62DF\u952E\u76D8\uFF08\u6A21\u62DF\u952E\u76D8\u7684\u6309\u4E0B\u4E0E\u91CA\u653E\uFF09"); // 设置窗体题目
		setResizable(false); // 不可改变窗体宽高
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭的方式
		setBounds(100, 100, 560, 280); // 设置窗体的位置和宽高
		//创建JPanel面板contentPane置于JFrame窗体中,并设置面板的背景色、边距和布局
		 
		contentPane = new JPanel();
		contentPane.setBackground(Color.WHITE);
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		//创建按钮button置于面板contentPane中,设置按钮的背景色、位置、宽高以及按钮中的字体位置、内容、样式
		btnQ = new JButton("Q");
		btnQ.setBackground(white);
		btnQ.setVerticalAlignment(SwingConstants.TOP);
		btnQ.setHorizontalAlignment(SwingConstants.LEADING);
		btnQ.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnQ.setBounds(0, 60, 47, 45);
		contentPane.add(btnQ);
		// 创建按钮button_2置于面板contentPane中,设置按钮的背景色、位置、宽高以及按钮中的字体位置、内容、样式
		 
		btnW = new JButton("W");
		btnW.setBackground(white);
		btnW.setVerticalAlignment(SwingConstants.TOP);
		btnW.setHorizontalAlignment(SwingConstants.LEADING);
		btnW.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnW.setBounds(55, 60, 49, 45);
		contentPane.add(btnW);
		// 创建按钮button_3置于面板contentPane中,设置按钮的背景色、位置、宽高以及按钮中的字体位置、内容、样式
		 
		btnE = new JButton("E");
		btnE.setBackground(white);
		btnE.setVerticalAlignment(SwingConstants.TOP);
		btnE.setHorizontalAlignment(SwingConstants.LEADING);
		btnE.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnE.setBounds(110, 60, 45, 45);
		contentPane.add(btnE);
		// 创建按钮button_4置于面板contentPane中,设置按钮的背景色、位置、宽高以及按钮中的字体位置、内容、样式
		
		btnR = new JButton("R");
		btnR.setBackground(white);
		btnR.setVerticalAlignment(SwingConstants.TOP);
		btnR.setHorizontalAlignment(SwingConstants.LEADING);
		btnR.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnR.setBounds(165, 60, 45, 45);
		contentPane.add(btnR);
		// 创建按钮button_5置于面板contentPane中,设置按钮的背景色、位置、宽高以及按钮中的字体位置、内容、样式
		 
		btnF = new JButton("F");
		btnF.setBackground(white);
		btnF.setVerticalAlignment(SwingConstants.TOP);
		btnF.setHorizontalAlignment(SwingConstants.LEADING);
		btnF.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnF.setBounds(195, 125, 45, 45);
		contentPane.add(btnF);
		//创建按钮button_6置于面板contentPane中,设置按钮的背景色、位置、宽高以及按钮中的字体位置、内容、样式
		 
		btnD = new JButton("D");
		btnD.setBackground(white);
		btnD.setVerticalAlignment(SwingConstants.TOP);
		btnD.setHorizontalAlignment(SwingConstants.LEADING);
		btnD.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnD.setBounds(137, 125, 45, 45);
		contentPane.add(btnD);
 
		btnT = new JButton("T");
		btnT.setVerticalAlignment(SwingConstants.TOP);
		btnT.setHorizontalAlignment(SwingConstants.LEADING);
		btnT.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnT.setBackground(white);
		btnT.setBounds(220, 60, 45, 45);
		contentPane.add(btnT);
 
		btnY = new JButton("Y");
		btnY.setVerticalAlignment(SwingConstants.TOP);
		btnY.setHorizontalAlignment(SwingConstants.LEADING);
		btnY.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnY.setBackground(white);
		btnY.setBounds(275, 60, 45, 45);
		contentPane.add(btnY);
 
		btnU = new JButton("U");
		btnU.setVerticalAlignment(SwingConstants.TOP);
		btnU.setHorizontalAlignment(SwingConstants.LEADING);
		btnU.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnU.setBackground(white);
		btnU.setBounds(330, 60, 45, 45);
		contentPane.add(btnU);
 
		btnI = new JButton("I");
		btnI.setVerticalAlignment(SwingConstants.TOP);
		btnI.setHorizontalAlignment(SwingConstants.LEADING);
		btnI.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnI.setBackground(white);
		btnI.setBounds(385, 60, 45, 45);
		contentPane.add(btnI);
 
		btnO = new JButton("O");
		btnO.setVerticalAlignment(SwingConstants.TOP);
		btnO.setHorizontalAlignment(SwingConstants.LEADING);
		btnO.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnO.setBackground(white);
		btnO.setBounds(440, 60, 46, 45);
		contentPane.add(btnO);
 
		btnP = new JButton("P");
		btnP.setVerticalAlignment(SwingConstants.TOP);
		btnP.setHorizontalAlignment(SwingConstants.LEADING);
		btnP.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnP.setBackground(white);
		btnP.setBounds(495, 60, 45, 45);
		contentPane.add(btnP);
 
		btnA = new JButton("A");
		btnA.setVerticalAlignment(SwingConstants.TOP);
		btnA.setHorizontalAlignment(SwingConstants.LEADING);
		btnA.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnA.setBackground(white);
		btnA.setBounds(23, 125, 45, 45);
		contentPane.add(btnA);
 
		btnS = new JButton("S");
		btnS.setVerticalAlignment(SwingConstants.TOP);
		btnS.setHorizontalAlignment(SwingConstants.LEADING);
		btnS.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnS.setBackground(white);
		btnS.setBounds(82, 125, 45, 45);
		contentPane.add(btnS);
 
		btnG = new JButton("G");
		btnG.setVerticalAlignment(SwingConstants.TOP);
		btnG.setHorizontalAlignment(SwingConstants.LEADING);
		btnG.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnG.setBackground(white);
		btnG.setBounds(251, 125, 45, 45);
		contentPane.add(btnG);
 
		btnH = new JButton("H");
		btnH.setVerticalAlignment(SwingConstants.TOP);
		btnH.setHorizontalAlignment(SwingConstants.LEADING);
		btnH.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnH.setBackground(white);
		btnH.setBounds(306, 125, 45, 45);
		contentPane.add(btnH);
 
		btnJ = new JButton("J");
		btnJ.setVerticalAlignment(SwingConstants.TOP);
		btnJ.setHorizontalAlignment(SwingConstants.LEADING);
		btnJ.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnJ.setBackground(white);
		btnJ.setBounds(361, 125, 45, 45);
		contentPane.add(btnJ);
 
		btnK = new JButton("K");
		btnK.setVerticalAlignment(SwingConstants.TOP);
		btnK.setHorizontalAlignment(SwingConstants.LEADING);
		btnK.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnK.setBackground(white);
		btnK.setBounds(416, 125, 47, 45);
		contentPane.add(btnK);
 
		btnL = new JButton("L");
		btnL.setVerticalAlignment(SwingConstants.TOP);
		btnL.setHorizontalAlignment(SwingConstants.LEADING);
		btnL.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnL.setBackground(white);
		btnL.setBounds(471, 125, 45, 45);
		contentPane.add(btnL);
 
		btnZ = new JButton("Z");
		btnZ.setVerticalAlignment(SwingConstants.TOP);
		btnZ.setHorizontalAlignment(SwingConstants.LEADING);
		btnZ.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnZ.setBackground(white);
		btnZ.setBounds(39, 190, 45, 45);
		contentPane.add(btnZ);
 
		btnX = new JButton("X");
		btnX.setVerticalAlignment(SwingConstants.TOP);
		btnX.setHorizontalAlignment(SwingConstants.LEADING);
		btnX.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnX.setBackground(white);
		btnX.setBounds(107, 190, 45, 45);
		contentPane.add(btnX);
 
		btnC = new JButton("C");
		btnC.setVerticalAlignment(SwingConstants.TOP);
		btnC.setHorizontalAlignment(SwingConstants.LEADING);
		btnC.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnC.setBackground(white);
		btnC.setBounds(178, 190, 45, 45);
		contentPane.add(btnC);
 
		btnV = new JButton("V");
		btnV.setVerticalAlignment(SwingConstants.TOP);
		btnV.setHorizontalAlignment(SwingConstants.LEADING);
		btnV.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnV.setBackground(white);
		btnV.setBounds(250, 190, 45, 45);
		contentPane.add(btnV);
 
		btnB = new JButton("B");
		btnB.setVerticalAlignment(SwingConstants.TOP);
		btnB.setHorizontalAlignment(SwingConstants.LEADING);
		btnB.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnB.setBackground(white);
		btnB.setBounds(315, 190, 45, 45);
		contentPane.add(btnB);
 
		btnN = new JButton("N");
		btnN.setVerticalAlignment(SwingConstants.TOP);
		btnN.setHorizontalAlignment(SwingConstants.LEADING);
		btnN.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnN.setBackground(white);
		btnN.setBounds(382, 190, 47, 45);
		contentPane.add(btnN);
 
		btnM = new JButton("M");
		btnM.setVerticalAlignment(SwingConstants.TOP);
		btnM.setHorizontalAlignment(SwingConstants.LEADING);
		btnM.setFont(new Font("Times New Roman", Font.PLAIN, 14));
		btnM.setBackground(white);
		btnM.setBounds(449, 190, 48, 45);
		contentPane.add(btnM);
		// 创建面板panel置于面板contentPane中,设置面板panel的位置、宽高、TitledBorder、背景色以及布局方式(边界布局)
		 
		JPanel panel = new JPanel();
		panel.setBorder(new TitledBorder(null, "文本显示区", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panel.setBackground(Color.WHITE);
		panel.setBounds(0, 0, 540, 45);
		contentPane.add(panel);
		panel.setLayout(new BorderLayout(0, 0));
 
		// 创建文本框textField置于面板panel的中间
		 
		textField = new JTextField();
		textField.addKeyListener(new KeyAdapter() { // 文本框添加键盘事件的监听
			char word;
 
			@Override
			public void keyPressed(KeyEvent e) { // 按键被按下时被触发
				word = e.getKeyChar();// 获取按下键表示的字符
				for (int i = 0; i < btns.size(); i++) {// 遍历存储按键ID的ArrayList集合
					// 判断按键是否与遍历到的按键的文本相同
					if (String.valueOf(word).equalsIgnoreCase(btns.get(i).getText())) {
						btns.get(i).setBackground(green);// 将指定按键颜色设置为绿色
					}
				}
			}
 
			@Override
			public void keyReleased(KeyEvent e) { // 按键被释放时被触发
				word = e.getKeyChar();// 获取释放键表示的字符
				for (int i = 0; i < btns.size(); i++) {// 遍历存储按键ID的ArrayList集合
					// 判断按键是否与遍历到的按键的文本相同
					if (String.valueOf(word).equalsIgnoreCase(btns.get(i).getText())) {
						btns.get(i).setBackground(white);// 将指定按键颜色设置为白色
					}
				}
			}
		});
		panel.add(textField, BorderLayout.CENTER);
		textField.setColumns(10);
	}
}
//例题18.26

実行結果は次のとおりです。

MouseEvent マウスイベント 

すべてのコンポーネントはマウス イベントを生成できます。MouseEvent クラスはマウス イベントのキャプチャを担当します。MouseListener インターフェイスを実装するリスナーをコンポーネントに追加することで、対応するマウス イベントを処理できます。
MouseListener インターフェイスには合計 5 つの抽象メソッドがあり、カーソルがコンポーネントに出入りするとき、マウス ボタンが押されるか離されるとき、クリック イベントが発生するときにトリガーされます。いわゆるクリック イベントとは、ボタンが押されてから放されることを意味します。コンポーネントの外に移動した後にキーを放した場合、クリック イベントはトリガーされないことに注意してください。 MouseListener インターフェイスの具体的な定義は次のとおりです。
 

パブリック インターフェイス MouseListener extends EventListener {

        Public void MouseEntered(MouseEvent e); // カーソルがコンポーネント内に移動するとトリガーされます

        Public void MousePressed(MouseEvent e); //マウスボタンが押されたときにトリガーされます

        Public void MouseLimited(MouseEvent e); //マウスボタンが放されたときにトリガーされます

        Public void MouseClicked(MouseEvent e); //クリックイベントが発生するとトリガーされる

        Public void MouseExited(MouseEvent e); // カーソルがコンポーネントの外に移動するとトリガーされます

上記の各抽象メソッドでは、MouseEvent クラスのオブジェクトが渡されます。 MouseEvent クラスでより一般的に使用されるメソッドを表 18.11 に示します。

 このイベントをトリガーしたキーを特定する必要がある場合は、表 18.12 の静的定数を使用して、getButton() メソッドによって返される int 型の値で表されるキーを特定できます。

例18.27

 
import java.awt.BorderLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
 
import javax.swing.JFrame;
import javax.swing.JLabel;
 
public class MouseEventDemo extends JFrame { // 继承窗体类JFrame
 
	public static void main(String args[]) {
		MouseEventDemo frame = new MouseEventDemo();
		frame.setVisible(true); // 设置窗体可见,默认为不可见
	}
 
	/**
	 * 判断按下的鼠标键,并输出相应提示
	 * 
	 * @param e 鼠标事件
	 */
	private void mouseOper(MouseEvent e) {
		int i = e.getButton();
		if(i==MouseEvent.BUTTON1)
			System.out.println("按下的是鼠标左键");
		else if(i==MouseEvent.BUTTON2)
			System.out.println("按下的是鼠标滚轮");
		else if(i==MouseEvent.BUTTON3)
			System.out.println("按下的是鼠标右键");
	}
 
	public MouseEventDemo() {
		super(); // 继承父类的构造方法
		setTitle("鼠标事件示例"); // 设置窗体的标题
		setBounds(100, 100, 500, 375); // 设置窗体的显示位置及大小
		// 设置窗体关闭按钮的动作为退出
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
		final JLabel label = new JLabel();
		label.addMouseListener(new MouseListener() {
			public void mouseEntered(MouseEvent e) {
				System.out.println("光标移入组件");
			}
			public void mousePressed(MouseEvent e) {
				System.out.print("鼠标按键被按下,");
				mouseOper(e);
			}
			public void mouseReleased(MouseEvent e) {
				System.out.print("鼠标按键被释放,");
				mouseOper(e);
			}
			public void mouseClicked(MouseEvent e) {
				System.out.print("单击了鼠标按键,");
				mouseOper(e);
				int clickCount = e.getClickCount();
				System.out.println("单击次数为"+clickCount+"下");
			}
			public void mouseExited(MouseEvent e) {
				System.out.println("光标移出组件");
			}
		});
		getContentPane().add(label, BorderLayout.CENTER);
	}
 
}

実行結果は次のとおりです。

 

おすすめ

転載: blog.csdn.net/2301_76549195/article/details/134345092