プロ2 > 資料 > 第7章
第7回:GUI部品による入出力
目標
GUIを用いたプログラミングができる.
例外処理ができる.
7.1 GUIとGUI部品
GUI(Graphical User Interface)とは,コンピュータの画面にボタンや入力欄などが表示され,それらをマウス等で操作するようなユーザインタフェースである.
多くのGUIプログラムでは(p.133に示されるような)ボタン,メニュー,入力欄などの決まった形のGUI部品(GUI controls)が画面に表示され,それらを通じてプログラムを操作する.
オブジェクト指向プログラミングではGUI部品の一つ一つをオブジェクトとして扱う.
GUI部品はライブラリに含まれているので,ユーザがプログラムする必要がなく,プログラムが短くなる.paintComponent()や基本的なイベントハンドラを書く必要がない.
部品はadd()メソッドで追加される.setBounds()メソッドで位置や大きさを指定できる.
【参考】setLayout(マネージャ名)メソッドを利用すると部品の配置は自動で行われる.
7.2 GUIのデザイン
使いやすいGUIをデザインするには,以下の配慮が必要である.
どのような機能を持つプログラムなのか明確であること.
提供されている機能を使おうとした時,どのように操作すればよいのか明確であること.
各機能を使う際の操作が容易であること.
7.3 GUI部品に動作をつける
入力イベントに対する動作は,イベントハンドラを持ったアダプタオブジェクトを作り,addActionListener()メソッドで登録しておく.
パネル(JPanel)にテキストフィールド(JTextField),ボタン(JButton),ラベル(JLabel)を配置している.
setBoundsメソッドで位置と大きさを指定できる.
ボタンにはイベントハンドラ(ActionListener)を付加している.ボタンが押されるとactionPerformedが実行される.
import java.awt.event.*;
import javax.swing.*;
public class Sample72 extends JPanel {
JTextField f1 = new JTextField();
JButton b1 = new JButton("素数か素数でないか判定" );
JLabel l1 = new JLabel("整数を入力してボタンを押す" );
public Sample72 () {
setLayout(null );
add(f1);
f1.setBounds(50 , 50 , 120 , 30 );
add(b1);
b1.setBounds(50 , 100 , 250 , 30 );
add(l1);
l1.setBounds(50 , 150 , 250 , 30 );
b1.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent evt) {
int n = Integer.parseInt(f1.getText());
boolean prime = true ;
for (int i = 2 ; i < n; ++i) {
if (n % i == 0 ) {
prime = false ;
}
}
l1.setText(n + (prime ? "は素数。" : "は合成数。" ));
f1.setText("" );
}
});
}
public static void main (String[] args) {
JFrame app = new JFrame();
app.add(new Sample72());
app.setSize(400 , 300 );
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.setVisible(true );
}
}
補足: ?:演算子
?:演算子は,
論理式 ? 文1 : 文2
の形式で記述し,「論理式」が真(true)のときは「文1」が,偽(false)のときは「文2」が実行される.
以下のメソッドは同じ意味である.
public String test1 (boolean b) {
String s = b ? "ABC" : "DEF" ;
return s;
}
public String test2 (boolean b) {
String s;
if (b)
s = "ABC" ;
else
s = "DEF" ;
return s;
}
7.4 例外処理
Javaでは,データ等に対する操作が想定外であった場合には,その種類に応じた例外(exception)が発生する.
例外を受け止めて処理をするために,try~catch構文を利用する.例外が発生する可能性のある部分をtryで括り,その処理をcatchの中に記述する.catchは例外の種類におじて複数付加することができる.
import java.awt.event.*;
import javax.swing.*;
public class Sample72b extends JPanel {
JTextField f1 = new JTextField();
JButton b1 = new JButton("素数か素数でないか判定" );
JLabel l1 = new JLabel("整数を入力してボタンを押す" );
public Sample72b () {
setLayout(null );
add(f1);
f1.setBounds(50 , 50 , 120 , 30 );
add(b1);
b1.setBounds(50 , 100 , 250 , 30 );
add(l1);
l1.setBounds(50 , 150 , 250 , 30 );
b1.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent evt) {
try {
int n = Integer.parseInt(f1.getText());
boolean prime = true ;
for (int i = 2 ; i < n; ++i) {
if (n % i == 0 ) {
prime = false ;
}
}
l1.setText(n + (prime ? "は素数。" : "は合成数。" ));
f1.setText("" );
} catch (Exception ex) {
l1.setText("問題がありました。再度どうぞ。" );
}
}
});
}
public static void main (String[] args) {
JFrame app = new JFrame();
app.add(new Sample72b());
app.setSize(400 , 300 );
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.setVisible(true );
}
}
補足:レイアウトマネージャ
GridLayout(n,m)を用いると,n*m個の要素に対しては,n行m列のレイアウトになる. それ以外の場合,n行にしたければGridLayout(n,0),m列にしたければGridLayout(0,m)とする.参考ページ .
パネルの中にパネルを配置することで複雑なレイアウトを実現できる.
import java.awt.*;
import javax.swing.*;
class ButtonSampleGrid3 extends JPanel {
JPanel panel, panel1;
Button pushButton[] = new Button[4 ];
TextField textfield;
public static void main (String[] args) {
JFrame app = new JFrame();
app.add(new ButtonSampleGrid3());
app.setSize(240 , 240 );
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.setVisible(true );
}
ButtonSampleGrid3() {
panel = new JPanel();
panel.setLayout(new GridLayout(2 , 2 ));
for (int i = 0 ; i < 4 ; i++) {
pushButton[i] = new Button("ボタン" + (i + 1 ));
panel.add(pushButton[i]);
}
textfield = new TextField(20 );
textfield.setText("テキストフィールド" );
textfield.setEditable(false );
panel1 = new JPanel();
panel1.setLayout(new GridLayout(2 , 1 ));
panel1.add(textfield);
panel1.add(panel);
add(panel1);
}
}
ykitamura@kwansei.ac.jp