public class A extends javax.swing.JFrame {
public A() { initComponents(); }//コンストラクタ
// 【Generated Code】
private void initComponents() {//閉じる[×]ボタンで終了
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
pack();//最小サイズに
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {new A().setVisible(true);}});
}
}
ここで、背景が灰色の部分は編集できない(してはいけない)ことに注意
public class A extends javax.swing.JFrame {
public A() { initComponents(); }
private void initComponents() {
jLabel1 = new javax.swing.JLabel();//オブジェクトjLabel1を生成し
setDefaultCloseOperation(…);
jLabel1.setText("Hello!");//テキストプロパティを「Hello!」にし
//フレームの中央に置く
getContentPane().add(jLabel1,java.awt.BorderLayout.CENTER);
pack();
}
public static void main(String args[]) {…}
//JLabelクラスのオブジェクトjLabel1をprivateで宣言
private javax.swing.JLabel jLabel1;
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt){
// TODO add your handling code here:}
というイベントハンドラ(メソッド)の枠組みが現れるので // TODO add your handling code here:
jLabel1.setText("Clicked!");
public class A extends javax.swing.JFrame {
public A() { initComponents(); }
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jButton1 = new javax.swing.JButton();
setDefaultCloseOperation(…);
jLabel1.setText("Hello!");
getContentPane().add(jLabel1,java.awt.BorderLayout.CENTER);
jButton1.setText("jButton1");
jButton1.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
jButton1ActionPerformed(evt);}
});
getContentPane().add(jButton1,java.awt.BorderLayout.PAGE_START);
pack();
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt){
jLabel1.setText("Clicked!"); }
public static void main(String args[]) {…} private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
}
| 実習.以下の手順で示されたアプリを作成しよう |
|
1.この節で作成したフレームの下部にラベルを、中段の左、中央、右にボタンを配置する 2.ボタンのtextプロパティをそれぞれ、「開始」、「停止」、「終了」とする 3.開始(停止)ボタンがクリックされたら、ラベルに「開始(停止)ボタンが押されました」と表示させる 4.終了ボタンがクリックされたら、アプリケーションを終了させる(System.exit(0)を呼び出す) 5.ボタン等の、背景色(background)や文字色(foreground)、フォント(font)等のプロパティを適宜を設定し、initComponentsメソッド内にどのような命令文が追加されるか確認する |
| 部品 | プロパティ | イベント | メソッド |
| JButton | text | actionPerformed | String getText() |
| JLabel | text | --- | void setText(String s) |
| 実習.タブ付きページとラベルの用意 |
|
次の手順でフレーム上にラベルとタブ付きページを用意しよう。 0)新規ファイルでSwingGUIフォーム→JFrameフォームを選び、適切なクラス名を指定する 1)JFrameのレイアウトを標準の境界線レイアウト(BorderLayout)に変更する JFrame上で右クリック→レイアウトを設定→境界線レイアウト 2)JFrameの下部にラベルを配置し、変数名とテキストを適宜設定する パネルを右クリックし、変数名を変更... パネルを右クリックし、テキストを編集 3)JFrameの中央にタブ付ペイン(JTabbedPane)を配置する 4)タブ付ペイン上に必要枚数のパネル(JPanel)を配置する 配置したタブ付ペインを右クリック→パレットから追加→パネル 5)各パネルのタブタイトル、変数名を適宜変更する パネルを選択し、プロパティ→タブタイトル パネルを右クリックし、変数名を変更... 6)ページ(パネル)のレイアウトはフリーデザインのままでよい 注. NetBeansでタブ付きページを選択しているとき、タブ付きペイン(枠)を選択しているのか、パネル(ページ)を選択しているのか紛らわしいので注意せよ(左側のナビゲータ(インスペクタ)ウィンドウで確認できる)。 |
| 実習.以下の手順でラジオボタンのページを完成させよう |
|
1.ラジオボタンの配置とボタングループへの登録 1)9.1で準備したページ(例えば ラジオパネル)に、パレットからラジオボタン(JRadioButton) 3個を配置し、対象の右ボタンクリックから変数名とテキストを設定する。 2)ボタングループ(ButtonGroup)を配置する。ボタングループは非表示部品なので、ナビゲータ(インスペクタ)上の「他のコンポーネント」には表示されるが、デザインウィンドウ上には何も表示されないことに注意せよ。 3)各ラジオボタンのbuttonGroupプロパティを上で配置したボタングループに設定する。 4)「ファイルを実行(Shift+F6)」し、ラジオボタンの単一選択機能が働いていることを確認する。 2.ラジオボタンのイベント処理 1)各ラジオボタンのactionPerformedイベントを選択し、現れるハンドラ内に (ラベル名).setText((ラジオボタン名).getText()+"を選択");; と記述し、9.1で配置したラベルにラジオボタンのテキストを表示させる。 2)「ファイルを実行(Shift+F6)」し、正しく動いていることを確認する |
| 実習.以下の手順でチェックボックスのページを完成させよう |
|
1.チェックボックスの配置 1)9.1で準備したパネル(例えば チェックパネル)に、パレットからチェックボックス(JCheckBox) 3個を配置し、適宜変数名とテキスト設定する 2. チェックボックスのイベント処理 1)1つのチェックボックスのactionPerformedイベントを選択し、現れるハンドラ内に String 文=""; if ((チェックボックス1).isSelected()) 文+=(チェックボックス1).getText(); if ((チェックボックス2).isSelected()) 文+=(チェックボックス2).getText(); if ((チェックボックス3).isSelected()) 文+=(チェックボックス3).getText(); (ラベル名).setText(文+"が選択されています");と記述する。 2)1) で作成したイベントハンドラの名前を適宜修正する。 イベント欄の[…]をクリック→名前の変更 3)他のチェックボックスのactionPerformedイベントに同じハンドラを設定する チェックボックスのactionPerformedイベント欄で[…]をクリック →現れたハンドラ設定ウィンドウで(必要なら[削除]し)[追加]ボタンをクリック →新しいハンドラ名を2)で設定したハンドラ名とする |
| 実習.以下の手順でコンボボックスのページを作成せよ |
|
1.コンボボックスの配置とmodel設定 1)作成した適当なパネルにJComboBoxを配置し変数名を適宜変更する 2)コンボボックスのmodelプロパティの[…]をクリックし、現れたウィンドウで項目リストを適宜編集する。 2.actionPerformedイベントハンドラを、例えば次のように記述する。 (ラベル名).setText((コンボボックス名).getSelectedItem() +"が ComboBox で選択されました"); 3.「ファイルを実行(Shift+F6)」し、コンボボックスで選択した項目(item)が、ラベルに表示されることを確認する |
| 問.リストの追加 |
|
上の説明を参考に、コンボボックスのページにリスト(JList)を追加し、選択した項目がラベルに表示されるようにせよ。 注.NetBeansでJListを配置すると、自動的にJScrolPane(スクロールの枠)に載せた形で配置されるため、特に意識しなくても(必要に応じて)縦横のスクロールが表示される。確認せよ。 |
| 部品 | プロパティ | イベント | メソッド |
| JRadioButton | text | actionPerformed | String getText() |
| JCheckBox | text | actionPerformed | boolean isSelected(), String getText() |
| JComboBox | model | actionPerformed | String (getSelectedItem()+"") |
| JList | model | valueChanged | String (getSelectedValue()+"") |
| メソッド | 説明 |
| put(キー,値) | 対(キー,値)を登録する |
| containsKey(キー) | キーを持つ対を含めば真 |
| get(キー) | キーと対になる値を取得する |
| remove(キー) | キーを持つ対を削除する |
public class 認証器 extends java.util.HashMap{
認証器(){super();
put("yamasaki","0000" );//ユーザIDとパスワードの対を登録
put("saitou","1111" );//ユーザIDとパスワードの対を登録
}
//メソッド 認証(ユーザ名,パスワード):渡されたユーザ名とパスワードの照合
public boolean 認証(String ユーザ名, String パスワード){
return containsKey(ユーザ名) && パスワード.equals(get(ユーザ名));
}
}
| 実習.以下の手順で、ユーザ認証クラスを作成する |
|
1.クラス定義ファイルの作成 Java→Javaメインクラスを選び、クラス名を 認証器 とする。 (動作確認のため、メインクラスとして定義する) 2.前ページのクラス定義を参考に、 1)認証器クラスをHashMapの拡張(extends java.util.HashMap)として定義する 2)適当な ユーザ名 と パスワード の対を登録するコンストラクタを追加する 3)認証 メソッドを追加する 3.動作確認のため、mainメソッド内に例えば次のように記述する。
認証器 利用認証 = new 認証器();
System.out.println(利用認証.認証("yamasaki","0000"));
System.out.println(利用認証.認証("yamasaki","1111"));
4.「ファイルを実行」して、結果を確認する。 |
| 問.パスワード として文字配列をとる 認証メソッドを追加せよ(次節で必要) |
5.プログラムチップスを参考に、メソッドの空欄____を埋めて、追加せよ
public boolean 認証(String ユーザ名, ____ パスワード){
return containsKey(ユーザ名)
&& String._______(パスワード).equals(get(ユーザ名));
}
6.以下の命令文をmainメソッドに追加して、上のメソッドの動作確認をせよ
char パス配列[]={'0','0','0','0'};
System.out.println(利用認証.認証("yamasaki",パス配列));
|
| 実習.以下の手順で、ユーザ認証パネルを作成する |
|
1.9章と同様に、3枚のタブ付きパネルを作成し、変数名とタブテキストを適宜設定する。 2.オブジェクト 利用認証 の宣言と生成 プログラム最後尾に、NetBeansが自動生成したオブジェクト宣言部があるので、以下のように行を追加する。 // End of variables declaration private 認証器 利用認証 = new 認証器(); 3.ユーザ名入力のテキストフィールド(JTextField)とパスワード入力のパスワードフィールド(JPasswordField)、ラベルをパネルに追加し、変数名とテキストを適宜設定する 4.下の問のプログラムをパスワード入力のActionPerformedイベントハンドラに記述する 5.実行して結果を確認する |
| 問.空欄(認証結果のメッセージ内容)を埋めてハンドラを完成させよ。 |
String ユーザ名=(ユーザ名入力).getText(); //ユーザIDを取得
char パス配列[] =(パスワード入力).getPassword();//パスワードを取得
//認証成功
if(利用認証.認証(ユーザ名,パス配列)) (ラベル).setText(____);
//認証失敗
else (ラベル).setText(____);
jPasswordField1.setText("");
|
| 実習.以下の手順でキーイベント処理のページを作成する |
|
1.10.1で作成したタブ付きページ(パネル)に、テキスト領域とラベル 2個を追加し、変数名とテキストを適宜設定する 2.テキスト領域のKeyPressedイベントハンドラに次のように記述する
int キーコード=evt.getKeyCode();
String キー名=evt.getKeyText(キーコード);
(ラベル1).setText("キー名:"+キー名+" ("+キーコード+")");
3.テキスト領域のKeyTypedイベントハンドラに次のように記述する
char 文字=evt.getKeyChar();//入力された文字を取得
int 文字コード=0+文字;
(ラベル2).setText("文字:"+文字+" ("+文字コード+")");
4.「ファイルを実行(Shift+F6)」して、結果を確認せよ。 |
| 問.以下の問に答えよ |
|
1.getKeyCode()とgetKeyChar()の相違点を述べよ 2.(0+文字) の値は何か。また値がそうなる理由を述べよ |
int x1,y1,x2,y2; //ドラッグの開始座標(x1,y1)と現在座標(x2,y2)
public void paintComponent(java.awt.Graphics g){
//Graphicsオブジェクトは様々な描画機能を持つ
super.paintComponent(g);// 背景をクリアする
g.setColor(java.awt.Color.red);//赤色を設定
if (x1>x2) g.drawLine(x1,y1,x2,y2);//直線
else if (y1<y2) g.fillRect(x1,y1,x2-x1,y2-y1);//矩形
else g.drawOval(x1,y2,x2-x1,y1-y2);//楕円
}
| 実習.マウスによる描画可能なパネルクラスの定義 |
|
1.NetBeansで新規ファイル→SwingGUIフォーム→JPanelフォームを選ぶ。 クラス名はデフォルトで NewJPanel となる。問題がなければそのまま[終了] 2.ソース中の適切な位置、例えば // End of variables declaration の直後に前ページの変数宣言とpaintComponentメソッドを挿入する。 3.パネルのMousePressedイベントハンドラに次のように記述する x1=evt.getX(); y1=evt.getY();//マウスのXY座標を取得 4.パネルのMouseDraggedイベントハンドラに次のように記述する x2=evt.getX(); y2=evt.getY();//マウスのXY座標を取得し repaint();//paintComponent()で(再)描画 5.パネル部品は単独では実行できない。[構築]→「"NewJPanel.java"をコンパイル F9」でコンパイルしてエラーがあったら修正しておく。 |
| 実習.以下の手順で描画機能を持つパネルを組み込もう |
|
1.タブ付きページを用意してなければ、JPanelを追加する。 2.パネルの[コード]中のカスタム作成コードの[…]ボタンを押し、現れたエディタ上で次のように記述する。 new NewJPanel(); これによって、パネルがNewJPanelクラスのオブジェクトとして生成される 注.パネル(JPanel)とそれが載っているタブ付枠(JTabbedPane)を混同しないようにしよう。上記の命令をタブ付枠のカスタム作成コードに記述してしまうと、
3.「ファイルを実行 Shift+F6」して正しく働くことを確認する。 4.描く図形を、直線および塗りつぶされていない矩形および塗つぶされている楕円に変えよ。 |
| 部品・クラス | プロパ ティ | イベント | メソッド |
| JTextField | text | actionPerformed | String getText() |
| JPasswordField | text | actionPerformed | char[] getPassword() |
| (JTextArea) | --- | ketPressed keyTyped | int getKeyCode() String getKeyText(int code) char getKeyChar() |
| (JPanel) | --- | mousePressed mouseDragged | int getX(), int getY() |
| java.awt.Graphics | --- | --- | void setColor(java.awt.Color c) void drawLine(x1,y1,x2,y2) void drawRect(x1.y1,w,h) void drawOval(x1.y1,w,h) void fillRect(x1.y1,w,h) void fillOval(x1.y1,w,h) |
public class カウンタ extends javax.swing.JFrame {
public カウンタ() { initComponents(); }//コンストラクタ
private void initComponents() {//コンストラクタの本体:編集不可
カウント = new javax.swing.JButton();
数ラベル = new javax.swing.JLabel();
setDefaultCloseOperation(…);
//ボタンのプロパティ設定とイベントハンドラ登録、配置
カウント.setText("カウント");
カウント.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
カウントActionPerformed(evt);}
});
getContentPane().add(カウント,java.awt.BorderLayout.LINE_END);
//ラベルのプロパティ設定と配置
数ラベル.setText("0");
getContentPane().add(数ラベル, java.awt.BorderLayout.CENTER);
pack();
}
//ボタンのイベントハンドラの実体
private void カウントActionPerformed(java.awt.event.ActionEvent evt){
数ラベル.setText(Integer.parseInt(数ラベル.getText())+1+"");
}
public static void main(String args[]){
java.awt.EventQueue.invokeLater(new Runnable(){
public void run() {new NewJFrame().setVisible(true);}
});
}
//使用部品の宣言
private javax.swing.JButton カウント;
private javax.swing.JLabel 数ラベル;
}
import javax.swing.*; import java.awt.*; import java.awt.event.*;などのインポート文をプログラムの頭に記述すると、それぞれ javax.swing.、java.awt.、java.awt.event. を省略し、例えば、
| 実習.import文の追加 |
| 前節のプログラムの最初に、上で説明したimport文を挿入せよ |
クリア.addActionListener( evt -> {
数ラベル.setText("0");
});
この文はJavaのラムダ式を用いて、以下のプログラムと同等の働きをする。
クリア.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
クリアActionPerformed(evt);}
});
//クリアボタンのイベントハンドラの実体
private void クリアActionPerformed(java.awt.event.ActionEvent evt){
数ラベル.setText("0");
}
| 実習.クリアボタンの追加 |
以下のプログラムを参考に、上記の文を記述してクリアボタンを追加せよ。
private JButton クリア = new JButton("クリア");
/** Creates new form カウンタ... 3行*/
public カウンタ() { initComponents();
//initComponentは直接編集できないので、以下に記述
getContentPane().add(クリア, BorderLayout.LINE_START);
クリア.addActionListener( evt -> {
数ラベル.setText("0");
});
}
|
| コラム.Javaのラムダ式 | ||||||||||
(変数リスト) -> {定義本体} という形をとる。Javaのラムダ式は関数インターフェースの実装として使われ、推測可能な括弧や型定義を省力した簡潔で分りやすい記述ができる。 ハンドラ記述
クリア.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
数ラベル.setText("0");
}});
の場合、addActionListenerの変数はメソッドactionPerformed(ActionEvent evt)を持つActionListenerなので、それらを省略した記述ができる。
クリア.addActionListener( evt -> {
数ラベル.setText("0");
});
|
||||||||||
for (int i=0; i<=9; i++){
数字[i]=new JButton(i+"");//ボタン配列要素の生成とテキスト設定
ツールバー.add(数字[i]);//ツールバーにボタンを配置
数字[i].addActionListener( evt -> {//ハンドラの本体
for(int k=0; k<=9; k++) if(evt.getSource()==数字[k])
数ラベル.setText((数ラベル.getText()+k).replaceFirst("^0+", ""));
});
}
ポイントは、ボタン配列(JButton 数字[])で実現することにより、10個のボタン(数字[0]~数字[9])の生成・配置・ハンドラ登録をまとめて(for文で)記述できる点にある。その場合、10個のボタンの各々で異なる数字を付加する必要があるが、各々に異なるハンドラは登録できない。それを、イベントの発生源を取得するgetSource()メソッドが可能にしている。| 実習.数字ボタンの追加 |
| 上の説明にしたがって、ツールバーと10個の数字ボタンを配置し、ボタンクリックで数字を付加できるように、プログラムに命令文を追加せよ。 |
| 実習.準備(クラス名等は例示なので適宜設定せよ) |
|
簡易エディタのために新たにプロジェクトとメインのプログラムファイルを作成しよう。NetBeansを起動したら 1.新規プロジェクトの作成 ・ファイル→新規プロジェクト→Java→Javaアプリケーション→[次へ] ・プロジェクト名:簡易エディタ プロジェクトの場所:講義用フォルダー 主クラスを作成のチェックをはずして [終了] 2.新規ファイルの作成 ・ファイル→新規ファイル→JavaGUIフォーム→JFrameフォーム→[次へ] ・クラス名:簡易エディタ [終了] 3.主クラスファイルの設定 ・プロジェクトを右クリック→プロパティ→実行 主クラスに上で作成したクラスを指定し、[了解] これによって、「プロジェクトを実行(F6)」で指定した主クラスが翻訳・実行される |
| 実習.部品配置とプロパティ設定(変数名等は例示なので適宜設定せよ) |
|
1.フレームのレイアウトを境界線レイアウト(BorderLayout)に設定 JFrame上で右クリック→レイアウトを設定→境界線レイアウト 2.部品配置とプロパティ設定 ・テキストエリア(JTextArea)を中央に配置し変数名「編集領域」と設定 ・メニューバーを配置 ・メニューの追加(3個) メニューバーを右クリック→メニューの追加 メニューの変数名と textをそれぞれ「編集」、「書式」、「ヘルプ」と設定 ・メニュー項目の追加方法 メニューを右クリック→パレットから追加→メニュー項目 以下のメニュー項目を追加し、変数名と textを以下のように設定 編集メニューに3項目追加:「切取」、「コピー」、「貼付」 書式メニューに1項目追加:「折返し」 ヘルプメニューに1項目追加:「バージョン」 |
| 実習.actionPerformedイベントハンドラの作成 |
|
1.編集メニューの各項目 メニュー項目「切取」のactionPerformedイベントを「切取ハンドラ」という名前で登録し次のように記述する(灰色部はイベント登録で作成させる) private void 切取ハンドラ(java.awt.event.ActionEvent evt) { 編集領域.cut(); }「コピー」(copy())や「貼付」(paste())も同様に記述する。 2.メニュー項目「折返し」 private void 折返しハンドラ(java.awt.event.ActionEvent evt) { 編集領域.setLineWrap(! 編集領域.getLineWrap()); }3.メニュー項目「バージョン」 「バージョン情報」ダイアローグを表示させるために以下のように記述する。 ダイアローグのタイプやタイトル、メッセージ内容は適宜書き換えてみよう。 private void バージョンハンドラ(java.awt.event.ActionEvent evt) { javax.swing.JOptionPane.showMessageDialog(this, "Version 1\n Hideki Yamasaki\n 2019/6",//メッセージ "簡易エディタ", //タイトル javax.swing.JOptionPane.INFORMATION_MESSAGE); //タイプ } |
| コラム.オブジェクトのプロパティへのアクセス |
| オブジェクトのプロパティは、通常、直接アクセスを禁じて、用意されている読取メソッド【getプロパティ名()】と設定メソッド【setプロパティ名()】を介して行う。したがって、値を変えられては困るプロパティには設定メソッドが提供されない。 |
| コラム.名前(オブジェクト名・メソッド名)の変更 |
上の課題にある編集ボタンを作成する際、これまでと同じやり方をすると、メニュー項目用とボタン用でまったく同じ動作をするハンドラを2つ作ることになる。これは無駄なので、両者で共通のメソッドを利用する手順を「切取」を例に説明する。
|
| コラム.メニュー項目へのシュートカット設定手順 |
| 設置したメニュー項目にはショートカット欄があり、そこをダブルクリックすると Acceleratorウィンドウがを開く。例えば Ctrl+Z を設定するには、仮想キーで VK_Z を選び □Ctrl にチェックを入れればよい。 |
private void 書出(java.io.File ファイル,javax.swing.JTextArea 編集領域){
try{//PrintWriterを作成してJTextAreaの内容をまとめて書出す
java.io.PrintWriter 版ライタ =
new java.io.PrintWriter(
new java.io.BufferedWriter(
new java.io.FileWriter(ファイル)));
版ライタ.write(編集領域.getText());
版ライタ.close();
}catch(Exception 例外){
javax.swing.JOptionPane.showMessageDialog(this,
"IOエラー","簡易エディタ",javax.swing.JOptionPane.ERROR_MESSAGE);
}
}
注.実は、PrintWriterはFileから直接生成できるので
private void 読込(java.io.File ファイル,javax.swing.JTextArea 編集領域){
try{//BufferedReaderを作成して1行ずつ読込んではJTextAreaに追加
java.io.BufferedReader 行リーダ =
new java.io.BufferedReader(
new java.io.FileReader(ファイル));
編集領域.setText("");
for(String 行;
(行=行リーダ.readLine())!=null;//読込んだ行がnullでない間
編集領域.append(行+"\n")){ }//行(+改行) を編集領域に追加
行リーダ.close();
}catch(Exception 例外){
javax.swing.JOptionPane.showMessageDialog(this,
"IOエラー","簡易エディタ",javax.swing.JOptionPane.ERROR_MESSAGE);
}
}
注.Java7から追加されたクラスを使えば、まとめて読込むこともできる。| コラム.オブジェクトの作成 |
|
あるクラスのオブジェクトは new クラス名(・); で作成される。さらに、他で使うためにそのオブジェクトに名前を付ける場合は クラス名 オブジェクト名 = new クラス名(・); とする。 また、例題のプログラムでクラス名の前に java.io. 等とあるのは、そのクラスが属する(定義されている)パッケージの指定である。 |
| コラム.例外(エラー)処理 |
入力処理などでは、読み込みに関わるエラーが生じる可能性があり、その対策を講じなければならない。これを例外処理といい、次の形式をとる。
try {
//例外(エラー)が発生する可能性のある部分
} catch (例外のクラス 例外) {
//例外に対する処理
}
こうすると、try部で例外(エラー)が発生したとき(だけ)catch部の例外処理が行われ、その後、try-catch部の次から計算を継続する。 |
private void 新規ハンドラ(java.awt.event.ActionEvent evt) { ファイル=null; setTitle("簡易テキストエディタ 無題.txt"); 編集領域.setText(""); }
private void 開くハンドラ(java.awt.event.ActionEvent evt) { if (ファイル窓.showOpenDialog(this) ==javax.swing.JFileChooser.APPROVE_OPTION){ ファイル=ファイル窓.getSelectedFile(); setTitle("簡易テキストエディタ "+ファイル.getName()); 読込(ファイル,編集領域); } }
| 問.「名付け保存」と「保存」のハンドラを以下の要領で作成せよ |
1.「開く」のハンドラを参考に空欄_____を埋めよ
private void 名付け保存ハンドラ(java.awt.event.ActionEvent evt) { if (ファイル窓.showSaveDialog(this) ==javax.swing.JFileChooser.APPROVE_OPTION){ ファイル =__________.____________; setTitle("簡易テキストエディタ " +___________); ______________________; } } 2.上の説明を参考にメニュー項目「保存」のハンドラを作成せよ private void 保存ハンドラ(java.awt.event.ActionEvent evt) { if (ファイル==null) ___________________; else _______________________; } |
以上の説明を参考に、簡易エディタに「保存」を含めたファイル入出力機能を追加したプログラムを作成しよう。
| コラム.if文とelse文:条件分岐 | ||||||||||||
|
if (条件式) {・・・} と書くと、「条件式が成り立つときだけ {…} の内部を実行せよ」という意味になる。条件式は必ず括弧の中に入れなければならない。else文はif文の直後に else {・・・} と書いて「直前のif文の条件式が成り立たなければ {・・・} の内部を実行せよ」という意味になる。 注.{・・・}の中が1文だけのときは、中括弧 { と }を省略してもよい。
|
//UndoManager 取消管理器 の生成
private javax.swing.undo.UndoManager
取消管理器=new javax.swing.undo.UndoManager();
//取消可能操作を発生時に 取消管理器 に記録するクラス 操作聴取路 を定義
private class 操作聴取路 implements
javax.swing.event.UndoableEditListener {
public void undoableEditHappened(
javax.swing.event.UndoableEditEvent 操作){
取消管理器.addEdit(操作.getEdit()); //編集操作の記録
}
}
(2)操作聴取路 を編集領域の文書に追加する命令を簡易エディタのコンストラクタ内に追加すると、編集領域 での取消可能操作が 取消管理器 に記録されるようになる。
public 簡易エディタ() {
initComponents();
編集領域.getDocument().addUndoableEditListener(new 操作聴取路());
}
(3)上記の 準備のもとに、取消と復活のメニュー項目を作成し、それらのイベントハンドラ(メソッド)にそれぞれ
if (取消管理器.canUndo()) 取消管理器.undo();
if (取消管理器.canRedo()) 取消管理器.redo();
と記述すればよい。
編集領域.setFont(new java.awt.Font(
"HGP行書体",//フォント名
java.awt.Font.BOLD+java.awt.Font.ITALIC, //スタイル
24 ));//サイズ
のように呼ぶ。編集領域.setFont(new java.awt.Font( "HGP行書体", //編集領域.getFont().getFontName(), 編集領域.getFont().getStyle(), 編集領域.getFont().getSize() ));とすればよい。
編集領域.setForeground(色窓.showDialog(this,
"文字色",java.awt.Color.black));
変種領域.setBackground(色窓.showDialog(this,
"背景色",java.awt.Color.white));
ファイル窓.setFileFilter(new javax.swing.filechooser.
FileNameExtensionFilter("テキストファイル", "txt"));
ファイル窓.addChoosableFileFilter(new javax.swing.filechooser.
FileNameExtensionFilter("HTMLファイル", "html", "htm"));
ファイル窓.setSelectedFile(new java.io.File(
java.text.DateFormat.getDateInstance(java.text.DateFormat.FULL).
format(new java.util.Date())+".txt"));//日付.txtをファイル名に設定
質問等は yamasaki.hideki@ouj.ac.jp までメールで。