Lecture2019
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[Lecture]]
//#contents
*マルチメディアプログラミング実習 2019年度後期 [#d33b7775]
**今後の予定 [#de7840d4]
-10月24日 椎尾学会出張のため休講
-11月7日 椎尾病欠のため休講(すみませんでした)
-12月26日 休講
-1月16日 月曜授業日のため授業なし
-1月23日 最終授業日
**冬休みの自習と宿題の案内 [#v0c32ec4]
[[こちら:http://is.ocha.ac.jp/~siio/index.php?LectureMMPH...
**マルチメディアプログラミングの最終課題 [#fa431919]
-課題:お絵描きプログラムを作成してさらに取扱説明書を作成...
--この課題のヒントは[[こちらをみてください:http://is.ocha...
-提出状況はこちらです
--http://is.ocha.ac.jp/~siio/?JavaReport
*** 提出課題として最低やってほしいこと [#hd791dc3]
-一筆書き状態と、ポインタのずれを直してください
-ペンの太さをメニューで変えられるようにしてください
-ペンの色をメニューとカラーパレットで変えられるようにして...
-消しゴム機能を追加してください
-ウィンドウの大きさを変えても絵が消えてしまわないようにする
(ダブルバッファを使う)
*** 機能拡張:以下のことができれば加点します [#ibf935ab]
-絵や写真のファイルを取り込めるようにする
-いろいろな効果のペンを作る(たとえばペンの動きに従って文...
-絵をファイルへ書き出す機能を作る
-他の絵データをスタンプのように押す機能
-コピーアンドペースト(難しいと思いますが)
-undo (やりなおし、一つ前に行った操作のキャンセル)(結構...
-メニューバーだけでなく、スライダ、ボタン、別ウィンドウ(...
-そのほか、世の中のお絵描きプログラムにありそうな機能を実...
機能拡張の詳細はSimpleDrawの
//-http://is.ocha.ac.jp/~siio/index.php?SimpleDraw#extra
- http://is.ocha.ac.jp/~siio/index.php?LectureMMP09#extra
を見てください。上のページでは、
-機能の拡充
-使いやすさの追求
の2通りの拡張を書いてあります。どちらの方針で進めていただ...
説明書に、工夫したところを書いておいてください。
*** 取扱説明書の作り方 [#j3398d0e]
-ApplicationsからMicrosoft Office 2011/Microsoft Wordもし...
-せっかくですので作った機能はぜんぶここで説明してください...
-スクリーンキャプチャした図も入れてください。図は次のよう...
--スクリーンキャプチャしたいところで、コマンド(リンゴマ...
--もしくは、コマンド(リンゴマーク)+シフト+4を押すとマ...
--もしくは、コマンド(リンゴマーク)+シフト+4を押し、さ...
--以上の操作で、デスクトップにピクチャファイルができます...
--もしくは、デスクトップのピクチャファイルをダブルクリッ...
-Control キーを押しながらキーボードショートカットを押すと...
-がんばったところ、大変だったところなどを書いていただいて...
-------------------
**2020年1月9日 [#n8f68fa5]
***宿題提出 [#s0b6149e]
[[こちら:http://is.ocha.ac.jp/~siio/index.php?LectureMMPH...
***お絵かきプログラム [#ff5bf25f]
最終課題のお絵かきプログラムについて説明します。
----------------
**2019年12月19日 [#ka00e5c5]
**(演習)上のお絵描きプログラムを改良してください [#m40056...
上のプログラムでは,描画するとゴミが出ます.
これを出ないように改良してください.
+上のプログラムでは、マウスポインターの位置と、描かれる線...
+上のプログラムでは,描画するとゴミが出ます. (前回描き...
一筆書きを解消するヒント
-マウスのクリックで線を引く最初の座標を指定します.
--マウスのクリックを受け取れるようにMouse Listenerもimple...
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/awt/ev...
//http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/...
このプログラムのjavaとclassファイルをフォルダに入れて,学...
**Eclipseを使ってみよう [#vf7b5de5]
http://gyazo.com/4383db7fb81f9eacbf5cc959ff77a33d.png
便利です。ぜひ使ってみてください。タイプミスが激減するは...
-Eclipseの警告を消す方法
private static final long serialVersionUID = 42L;
という変数を定義しておきます。
-----------
** 線を引く簡単なプログラム [#pac2b7d5]
JPanelのサブクラスを作りました。
import javax.swing.JPanel;
import java.awt.Graphics;
public class DrawPanel extends JPanel {
public void drawLine(int x1, int y1, int x2, int y2){
Graphics g = this.getGraphics();
g.drawLine(x1, y1, x2, y2);
}
}
こちらはメインのプログラム。JFrameのサブクラスで、これに...
リスナーになっているので、こちらでマウスなどのイベントを...
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
public class SimpleDraw extends JFrame implements MouseM...
int lastx=0, lasty=0, newx, newy;
DrawPanel panel;
public void mouseMoved(MouseEvent arg0) {
}
public void mouseDragged(MouseEvent arg0) {
newx=arg0.getX();
newy=arg0.getY();
panel.drawLine(lastx,lasty,newx,newy);
lastx=newx;
lasty=newy;
}
private void init() {
this.setTitle("Simple Draw");
this.setSize(300, 200);
this.addMouseMotionListener(this);
panel=new DrawPanel();
this.getContentPane().add(panel);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SimpleDraw frame=new SimpleDraw();
frame.init();
}
}
----------------
***マウスイベント [#cc8c3961]
マウスイベントを受け取るには、Mouse ListenerやMouse Motio...
以下のようにするとイベントをうけとれるます。
まずはMouse Motion Listenerを試してみましょう。
マニュアル
- https://docs.oracle.com/javase/jp/8/docs/api/java/awt/e...
によると、実装しないといけないメソッドはmouse Draggedとmo...
- void mouseDragged(MouseEvent e)
コンポーネント上でマウス・ボタンを押してドラッグすると呼...
- void mouseMoved(MouseEvent e)
ボタンを押さずにマウス・カーソルをコンポーネント上に移動...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class MouseTest extends JFrame implements MouseMo...
public void mouseDragged(MouseEvent e) {
System.out.println("mouse dragged!");
}
public void mouseMoved(MouseEvent e) {
System.out.println("mouse moved!");
}
public static void main(String[] args) {
MouseTest test = new MouseTest();
test.setTitle("MouseTest");
test.addMouseMotionListener(test);
test.setSize(400,300);
test.setVisible(true);
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
次に、Mouse Listenerも実装してみましょう。マニュアル
- https://docs.oracle.com/javase/jp/7/api/java/awt/event/...
によると、
- void mouseClicked(MouseEvent e)
コンポーネント上でマウスボタンをクリック (押してから離す)...
- void mouseEntered(MouseEvent e)
コンポーネントにマウスが入ると呼び出されます。
- void mouseExited(MouseEvent e)
コンポーネントからマウスが出ると呼び出されます。
- void mousePressed(MouseEvent e)
コンポーネント上でマウスボタンが押されると呼び出されます。
- void mouseReleased(MouseEvent e)
コンポーネント上でマウスボタンが離されると呼び出されます。
これを追加します。宣言で
public class MouseTest extends JFrame implements MouseLi...
として、またmainに
test.addMouseListener(test);
を追加します。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class MouseTest extends JFrame implements MouseLi...
public void mouseClicked(MouseEvent e) {
System.out.println("mouse clicked!");
}
public void mouseEntered(MouseEvent e) {
System.out.println("mouse entered!");
}
public void mouseExited(MouseEvent e) {
System.out.println("mouse exited!");
}
public void mousePressed(MouseEvent e) {
System.out.println("mouse pressed!");
}
public void mouseReleased(MouseEvent e) {
System.out.println("mouse released!");
}
public void mouseDragged(MouseEvent e) {
System.out.println("mouse dragged!");
}
public void mouseMoved(MouseEvent e) {
System.out.println("mouse moved!");
}
public static void main(String[] args) {
MouseTest test = new MouseTest();
test.setTitle("MouseTest");
test.addMouseListener(test);
test.addMouseMotionListener(test);
test.setSize(400,300);
test.setVisible(true);
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
マウスイベントが発生した時のマウスの座標を知ることもでき...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class MouseTest extends JFrame implements MouseLi...
public void mouseClicked(MouseEvent e) {
System.out.println("mouse clicked!");
}
public void mouseEntered(MouseEvent e) {
System.out.println("mouse entered!");
}
public void mouseExited(MouseEvent e) {
System.out.println("mouse exited!");
}
public void mousePressed(MouseEvent e) {
System.out.println("mouse pressed!");
}
public void mouseReleased(MouseEvent e) {
System.out.println("mouse released!");
}
public void mouseDragged(MouseEvent e) {
System.out.println("mouse dragged to " + e.getX() + "...
}
public void mouseMoved(MouseEvent e) {
System.out.println("mouse moved!");
}
public static void main(String[] args) {
MouseTest test = new MouseTest();
test.setTitle("MouseTest");
test.addMouseListener(test);
test.addMouseMotionListener(test);
test.setSize(400,300);
test.setVisible(true);
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
-----------------
***項目をリストする [#m5682174]
コピペして動かしてみてください。
#ref(LectureMMP07/list.png)
import java.awt.*;
import javax.swing.*;
public class JListSample extends JFrame {
JListSample(String title) {
setTitle(title);
String[] data = {"Iced Coffee", "Iced Tea...
JList<String> list = new JList<String>(d...
JScrollPane scroll = new JScrollPane(list);
scroll.setPreferredSize(new Dimension(200...
JPanel panel = new JPanel();
Container container = getContentPane();
container.add(scroll);
}
public static void main(String[] args) {
JListSample sample = new JListSample("Lis...
sample.pack();
sample.setVisible(true);
sample.setDefaultCloseOperation(JFrame.EX...
}
}
***メニューバーを出す [#v6405eed]
http://gyazo.com/dd4e103c011682b3a78b9ed0c8d5134b.png
まずはシンプルなプルダウンメニューを作ってみましょう。
このプログラムは何もしません。
http://is.ocha.ac.jp/~siio/gyazo/JMenuSample1.png
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class JMenuSample extends JFrame implements Actio...
public void initialize() {
this.setTitle("MenuSample");
JMenuBar menubar = new JMenuBar();
JMenu menu = new JMenu("menu");
JMenuItem item1 = new JMenuItem("Sandwiches");
JMenuItem item2 = new JMenuItem("Side Orders");
JMenuItem item3 = new JMenuItem("Drinks");
menu.add(item1);
menu.add(item2);
menu.add(item3);
menubar.add(menu);
this.setJMenuBar(menubar);
this.setSize(400,200);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e){
}
public static void main(String[] args) {
JMenuSample sample = new JMenuSample();
sample.initialize();
}
}
メニューにはメニューを追加することもできます。
上でitem3をメニューに変更すると、これにitemを追加できます。
http://is.ocha.ac.jp/~siio/gyazo/JMenuSample2.png
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class JMenuSample extends JFrame implements Actio...
public void initialize() {
this.setTitle("MenuSample");
JMenuBar menubar = new JMenuBar();
JMenu menu = new JMenu("menu");
JMenuItem item1 = new JMenuItem("Sandwiches");
JMenuItem item2 = new JMenuItem("Side Orders");
JMenu item3 = new JMenu("Drinks");
menu.add(item1);
menu.add(item2);
menu.add(item3);
JMenuItem subitem1 = new JMenuItem("Iced Coffee");
JMenuItem subitem2 = new JMenuItem("Iced Tea");
item3.add(subitem1);
item3.add(subitem2);
menubar.add(menu);
this.setJMenuBar(menubar);
this.setSize(400,200);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e){
}
}
public static void main(String[] args) {
JMenuSample sample = new JMenuSample();
sample.initialize();
}
}
それぞれのitemに、フレーム自身をaction Listenerとして登録...
ここでは、メニューアイテムにcommandという情報をつけて、Ac...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class JMenuSample extends JFrame implements Actio...
public void initialize() {
this.setTitle("MenuSample");
JMenuBar menubar = new JMenuBar();
JMenu menu = new JMenu("menu");
JMenuItem item1 = new JMenuItem("Sandwiches");
item1.addActionListener(this);
item1.setActionCommand("Sandwiches");
JMenuItem item2 = new JMenuItem("Side Orders");
item2.addActionListener(this);
item2.setActionCommand("Side Orders");
JMenu item3 = new JMenu("Drinks");
menu.add(item1);
menu.add(item2);
menu.add(item3);
JMenuItem subitem1 = new JMenuItem("Iced Coffee");
subitem1.addActionListener(this);
subitem1.setActionCommand("Iced Coffee");
JMenuItem subitem2 = new JMenuItem("Iced Tea");
subitem2.addActionListener(this);
subitem2.setActionCommand("Iced Tea");
item3.add(subitem1);
item3.add(subitem2);
menubar.add(menu);
this.setJMenuBar(menubar);
this.setSize(400,200);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e){
String command = e.getActionCommand();
if(command != null){
System.out.println(command);
}
}
public static void main(String[] args) {
JMenuSample sample = new JMenuSample();
sample.initialize();
}
}
***演習:メニューを色々追加してみてください。(メニュー項...
//演習ができそうにないという人は、飛ばして、次に進んでく...
http://gyazo.com/2d9c3b6534e7b87fcd3ec22be00d5fed.png
他のメニューの追加も試してみましょう。例えばお支払いメニ...
http://is.ocha.ac.jp/~siio/gyazo/JMenuSample3.png
***Color Chooserを使う [#g2bdfc10]
次をコピペして動かしてみてください。色を選択するパネルが...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class JColorChooserSample extends JFrame implemen...
JButton button;
JColorChooserSample(String title){
setTitle(title);
button = new JButton("choose color");
button.addActionListener(this);
JPanel panel = new JPanel();
panel.add(button);
Container container = getContentPane();
container.add(panel);
}
public void actionPerformed(ActionEvent e){
JColorChooser colorchooser = new JColorCh...
Color color = colorchooser.showDialog(thi...
//button.setBackground(color);
button.setForeground(color);
}
public static void main(String[] args){
JColorChooserSample sample = new JColorCh...
sample.pack();
sample.setVisible(true);
sample.setDefaultCloseOperation(JFrame.EX...
}
}
**2019年12月12日 [#e418d9e5]
***テキストフィールドを使う [#x3cf24f2]
次のプログラムは、テキストフィールド2個とボタン1個を表示...
動作を確認してください。テキストフィールドに文字を入れて...
イベントハンドラーが全く実装されていないので、ボタンを押...
#ref(LectureMMP07/textfield1.png)
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class JTextFieldSample extends JFrame {
JButton button;
JTextField textleft, textright;
public void initialize() {
button = new JButton("left to right");
textleft= new JTextField(10);
textright= new JTextField(10);
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(textleft, BorderLayout.WEST);
panel.add(textright, BorderLayout.EAST);
panel.add(button, BorderLayout.SOUTH);
this.getContentPane().add(panel);
this.setTitle("JTextFieldSample");
this.pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLO...
this.setVisible(true);
}
public static void main(String[] args){
JTextFieldSample sample = new JTextFieldSample();
sample.initialize();
}
}
演習:このプログラムで、left to rightボタンを押した時に、...
ヒント:JTextFieldのマニュアルを見て、テキストをゲットし...
#ref(LectureMMP07/textfield1.png)
https://docs.oracle.com/javase/jp/8/docs/api/index.html
ヒント:
getText()とsetText("xxx")を使います。
解答例:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class JTextFieldSample extends JFrame implements ...
JButton button;
JTextField textleft, textright;
public void initialize() {
button = new JButton("left to right");
button.addActionListener(this);
textleft= new JTextField(10);
textright= new JTextField(10);
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(textleft, BorderLayout.WEST);
panel.add(textright, BorderLayout.EAST);
panel.add(button, BorderLayout.SOUTH);
this.getContentPane().add(panel);
this.setTitle("JTextFieldSample");
this.pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLO...
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
textright.setText(textleft.getText());
textleft.setText("");
}
public static void main(String[] args){
JTextFieldSample sample = new JTextFieldSample();
sample.initialize();
}
}
演習:このプログラムに、右のテキストフィールドをクリアす...
https://i.gyazo.com/999f1e766551a994186cc3d159bde0bf.png
ヒント:4個のアイテムをパネルにつけることになります。2 x ...
panel.setLayout(new GridLayout(2,2));
この後、テキストフィールドとボタンをaddしていけば、左上か...
本日のレポート:クリアボタンのあるテキストフィールドサン...
解答例:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class JTextFieldSample extends JFrame implements ...
JButton button, clearButton;
JTextField textleft, textright;
public void initialize() {
button = new JButton("left to right");
button.addActionListener(this);
clearButton = new JButton("clear");
clearButton.addActionListener(this);
textleft= new JTextField(10);
textright= new JTextField(10);
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(2,2));
panel.add(textleft);
panel.add(textright);
panel.add(button);
panel.add(clearButton);
this.getContentPane().add(panel);
this.setTitle("JTextFieldSample");
this.pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLO...
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==(button)){
textright.setText(textleft.getText());
textleft.setText("");
}else{
textright.setText("");
}
}
public static void main(String[] args){
JTextFieldSample sample = new JTextFieldSample();
sample.initialize();
}
}
---------------
**第13章 様々なコンポーネントとレイアウト [#qb662dcc]
***複雑なボタンの配置例 [#g43d30cb]
ボタンを多数配置した例です。
#ref(LectureMMP07/complicated.png)
下がプログラムです。動かしてみましょう。長いのでコピペし...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class ComplicatedLayoutSample extends JFrame impl...
public void initialize() {
JPanel panel1 = new JPanel();
JPanel panel2= new JPanel();
JPanel panel3= new JPanel();
JPanel panel4= new JPanel();
JPanel panel5= new JPanel();
panel1.setLayout(new FlowLayout());
for (int i=1; i<=3; i++) {
JButton btn = new JButton("NORTH" + i);
btn.addActionListener(this);
panel1.add(btn);
}
panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXI...
for (int i=1; i<=3; i++) {
JButton btn = new JButton("WEST" + i);
btn.addActionListener(this);
panel2.add(btn);
}
panel3.setLayout(new GridLayout(3,2));
for (int i=1; i<=6; i++) {
JButton btn = new JButton("CENTER" + i);
btn.addActionListener(this);
panel3.add(btn);
}
panel4.setLayout(new BorderLayout());
JButton btn1 = new JButton("EAST1");
btn1.addActionListener(this);
panel4.add(btn1, BorderLayout.NORTH);
JButton btn2 = new JButton("EAST2");
btn2.addActionListener(this);
panel4.add(btn2, BorderLayout.SOUTH);
panel5.setLayout(new BoxLayout(panel5, BoxLayout.X_AXI...
for (int i=1; i<=4; i++) {
JButton btn = new JButton("SOUTN" + i);
btn.addActionListener(this);
panel5.add(btn);
}
Container container = this.getContentPane();
container.add(panel1,BorderLayout.NORTH);
container.add(panel2,BorderLayout.WEST);
container.add(panel3,BorderLayout.CENTER);
container.add(panel4,BorderLayout.EAST);
container.add(panel5,BorderLayout.SOUTH);
this.setSize(400,200);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
System.out.println( ((JButton)e.getSource()).getText()...
}
public static void main(String[] args) {
ComplicatedLayoutSample cls = new ComplicatedLayoutSam...
cls.initialize();
}
}
コピペしてしまいましたが、動作はしっかり確認しましょう。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class ComplicatedLayoutSample extends JFrame impl...
Action ListenerをインプレメントしたJFrameサブクラスです。
public void initialize() {
JPanel panel1 = new JPanel();
JPanel panel2= new JPanel();
JPanel panel3= new JPanel();
JPanel panel4= new JPanel();
JPanel panel5= new JPanel();
5個のパネルを用意しています。動作例を見るとわかりますが、...
panel1.setLayout(new FlowLayout());
for (int i=1; i<=3; i++) {
JButton btn = new JButton("NORTH" + i);
btn.addActionListener(this);
panel1.add(btn);
}
最初のパネルは、「北側」に貼り付けるパネルです。(ウィン...
ここにNORTH + 番号の名前のボタンを3個作り、アクションリス...
panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXI...
for (int i=1; i<=3; i++) {
JButton btn = new JButton("WEST" + i);
btn.addActionListener(this);
panel2.add(btn);
}
panel3.setLayout(new GridLayout(3,2));
for (int i=1; i<=6; i++) {
JButton btn = new JButton("CENTER" + i);
btn.addActionListener(this);
panel3.add(btn);
}
panel4.setLayout(new BorderLayout());
JButton btn1 = new JButton("EAST1");
btn1.addActionListener(this);
panel4.add(btn1, BorderLayout.NORTH);
JButton btn2 = new JButton("EAST2");
btn2.addActionListener(this);
panel4.add(btn2, BorderLayout.SOUTH);
panel5.setLayout(new BoxLayout(panel5, BoxLayout.X_AXI...
for (int i=1; i<=4; i++) {
JButton btn = new JButton("SOUTN" + i);
btn.addActionListener(this);
panel5.add(btn);
}
西側パネル、中央パネル、東側パネル、南側パネルにボタンを...
Container container = this.getContentPane();
container.add(panel1,BorderLayout.NORTH);
container.add(panel2,BorderLayout.WEST);
container.add(panel3,BorderLayout.CENTER);
container.add(panel4,BorderLayout.EAST);
container.add(panel5,BorderLayout.SOUTH);
次に、フレームのコンテナーを取り寄せて、これに五枚のパネ...
this.setSize(400,200);
this.setVisible(true);
}
あとはサイズを調整しているだけです。
public void actionPerformed(ActionEvent e) {
System.out.println( ((JButton)e.getSource()).getText()...
}
イベントリスナーのためのメソッドです。ボタンに書かれた名...
public static void main(String[] args) {
ComplicatedLayoutSample cls = new ComplicatedLayoutSam...
cls.initialize();
}
}
こちらはいつものメインプログラムです。
-----------------
***ボタンのレイアウト [#v426213f]
#ref(LectureMMP06/5buttons.png)
以下のプログラムで5個のボタンをレイアウトできます。
パネルに、Border Layourのインスタンスを設定しています。
また、パネルにaddする時に、Border Layoutクラスのクラス変...
これで東西南北中央に配置されます。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class BorderLayoutSample extends JFrame {
public void initialize() {
this.setTitle("Simple Window");
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(new JButton("WEST"),BorderLayou...
panel.add(new JButton("CENTER"),BorderLay...
panel.add(new JButton("EAST"),BorderLayou...
panel.add(new JButton("NORTH"),BorderLayo...
panel.add(new JButton("SOUTH"),BorderLayo...
Container container = this.getContentPane...
container.add(panel);
this.pack();
setDefaultCloseOperation(JFrame.EXIT_ON_C...
setVisible(true);
}
public static void main (String args[]) {
BorderLayoutSample f = new BorderLayoutSa...
f.initialize();
}
}
演習:このプログラムがボタンのイベントを処理するように変...
#ref(LectureMMP06/borderlayout.png)
ヒント:
((JButton)e.getSource()).getText()
でボタンの文字を取得できます。
解答例:
イベントハンドラーでボタンの名前を表示しています。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class BorderLayoutSample extends JFrame implement...
public void initialize() {
JButton[] button;
this.setTitle("Simple Window");
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
button = new JButton[5];
panel.add(button[0]=new JButton("WEST"),B...
panel.add(button[1]=new JButton("CENTER")...
panel.add(button[2]=new JButton("EAST"),B...
panel.add(button[3]=new JButton("NORTH"),...
panel.add(button[4]=new JButton("SOUTH"),...
for(int i=0; i < button.length; i++) {
button[i].addActionListener(this);
}
Container container = this.getContentPane...
container.add(panel);
this.pack();
setDefaultCloseOperation(JFrame.EXIT_ON_C...
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
System.out.println(((JButton)e.getSource(...
}
public static void main (String args[]) {
BorderLayoutSample f = new BorderLayoutSa...
f.initialize();
}
}
解答例2:
イベントハンドラーでボタンに割り当てられたコマンドを表示...
上記の例よりは複雑ですが、コマンドを使うメリットはありま...
この例ではメリットを活かせていませんが、
コマンドを割り当てると、ボタンの名前を変更しても影響が出...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class BorderLayoutSample extends JFrame implement...
public void initialize() {
JButton[] button;
this.setTitle("Simple Window");
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
button = new JButton[5];
panel.add(button[0]=new JButton("WEST"),B...
panel.add(button[1]=new JButton("CENTER")...
panel.add(button[2]=new JButton("EAST"),B...
panel.add(button[3]=new JButton("NORTH"),...
panel.add(button[4]=new JButton("SOUTH"),...
for(int i=0; i < button.length; i++) {
button[i].addActionListener(this);
button[i].setActionCommand(button...
}
Container container = this.getContentPane...
container.add(panel);
this.pack();
setDefaultCloseOperation(JFrame.EXIT_ON_C...
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
System.out.println(e.getActionCommand());
}
public static void main (String args[]) {
BorderLayoutSample f = new BorderLayoutSa...
f.initialize();
}
}
演習:このプログラムを参考にして、
上で作った二つのボタンのプログラム、Simple Buttonに対して...
演習のヒント
bt1 = new JButton("button1");
bt2 = new JButton("button2");
panel.setLayout(new FlowLayout(FlowLayout.RIGHT));
// bt1.setActionCommand("this is b1");
// bt2.setActionCommand("this is b2");
FlowLayoutにはCENTER, LEFT, RIGHTなどの揃え方の指定があり...
panel.setLayout(new FlowLayout(FlowLayout.CENTER));
panel.setLayout(new FlowLayout(FlowLayout.LEFT));
------------------
演習:button2のAction Listenerとしても、自分自身を登録し...
button2.addActionListener(this);
この結果、button1でもbutton2でも、どちらも押されればHello...
***Actionの識別 [#s45f3f97]
button1を押した時はHelloと表示され、button2を押した時はGo...
http://gyazo.com/67d27d0588f4dd5d11410e1107165994.png
ボタンごとに違うインスタンスをadd Action Listenerで追加す...
今回の例のように同じインスタンス(ここではthis)をリスナ...
このメソッドで受け取る引数はActio Eventのインスタンスです。
このインスタンスは、発生したイベントの情報を持っています。
Action Eventにはどういうインスタンス変数・メソッドがある...
https://docs.oracle.com/javase/jp/8/docs/api/index.html
今回は、この中のget Source()メソッドを使いましょう。
このメソッドで、イベントを発生したインスタンスがわかりま...
正確には、イベントを発生したインスタンスへの参照がわかり...
なので、それがbutton1だったのか、button2だったのかをif文...
その結果、HelloかGoodbyeを表示すれば良いです。
ただし、今のプログラムでは、変数button1, button2はinitial...
ヒント(最初の6行です)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SimpleButton extends JFrame implements Acti...
JButton button1, button2;
public void initialize () {
演習:このヒントを元に、button1を押した時はHelloと表示さ...
解答例:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SimpleButton extends JFrame implements Acti...
JButton button1, button2;
public void initialize () {
this.setTitle("私が作った最初の窓");
JPanel panel = new JPanel();
button1 = new JButton("button1");
button2 = new JButton("button2");
button1.addActionListener(this);
button2.addActionListener(this);
panel.add(button1);
panel.add(button2);
Container container = this.getContentPane();
container.add(panel);
this.pack();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed (ActionEvent e) {
if(e.getSource()==button1)
System.out.println("Hello");
else
System.out.println("Goodbye");
}
public static void main(String argv[]) {
SimpleButton sw = new SimpleButton();
sw.initialize();
}
}
ここではボタンを区別するために、インスタンス(への参照)...
一つは、ボタンのテキスト(ボタンの上に表示されている文字...
ボタンのテキストは、get Text()メソッドで入手できます。
以下のように変更すると、ボタンのテキストが表示されるよう...
ボタンに、HelloとGoodbyeを表示しておけば、それらが表示さ...
ボタンのテキストを文字列比較して、処理を変えることも可能...
public void actionPerformed(ActionEvent e){
System.out.println(((JButton)e.getSource...
}
もう一つは、ボタンにコマンドを書く方法です。
ボタンにsetActionCommand(String)を定義しておくと、getActi...
例えば、
button1.setActionCommand("hello");
としておけば、actionPerformedの中で
e.getActionCommand();
で文字列を得られます。なので、例えば、
public void actionPerformed(ActionEvent e){
System.out.println(e.getActionCommand());
}
でコマンド部分を印刷できます。コマンドを文字列比較して、...
---------
**2019年12月5日 [#r6c560a9]
**第12章 Swing [#n78c2cf0]
SwingはJavaのパッケージで、GUIを構築するための数多くのcla...
***歴史(AWTとの違い) [#f1351d32]
初期のJavaでは、AWT (Abstract Window Toolkit) というパッ...
***クラスJFrame [#t7348676]
まずはJFrameというSwingのクラスを使います。Frameは枠のこ...
JはJavaのJです。
以下のリンクからJFrameクラスを選択して、何ができるかざっ...
https://docs.oracle.com/javase/jp/8/docs/api/index.html
- 次に簡単なウィンドウを出してみましょう。
授業の最初で作ったウィンドウを出すプログラムです。
import javax.swing.JFrame;
public class SimpleWindow {
public static void main(String argv[]) {
JFrame f = new JFrame("私が作った最初の窓...
f.setSize(200,100);
f.setVisible(true);
}
}
このままだと、ウィンドウを閉じてもプログラムは終了しませ...
ウィンドウを閉じた時に、プログラムを終了するかしないかは...
ウィンドウを閉じるとプログラムが終了するようにしてみまし...
import javax.swing.JFrame;
public class SimpleWindow {
public static void main(String argv[]) {
JFrame f = new JFrame("私が作った最初の窓...
f.setSize(200,100);
f.setDefaultCloseOperation(JFrame.EXIT_ON...
f.setVisible(true);
}
}
このプログラムをよくみていきましょう。
mainの最初の行で、JFrameのコンストラクタを呼び出して、イ...
引数付きのコンストラクタを使っています。Stringの引数を使...
作ったインスタンスはJFrameを参照する変数 f に代入されてい...
mainの2行目では、JFrameのインスタンスメソッドであるsetSi...
mainの最後の行では、setVisible()メソッドを呼んでいます。...
*** JFrameを継承するプログラミング [#j767173a]
アプリケーションで使うウィンドウを作る時の流儀の一つに、...
import javax.swing.JFrame;
public class SimpleWindow extends JFrame {
public void initialize () {
this.setTitle("私が作った最初の窓");
this.setSize(200,100);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main (String argv[]) {
SimpleWindow sw = new SimpleWindow();
sw.initialize();
}
}
このプログラムでは、JFrameを継承して、サブクラスとしてSim...
なので、SimpleWindowのインスタンスは、JFrameの機能を全て...
別のプログラムからSimpleWindowのインスタンスを作って表示...
mainでは、自分自身のインスタンスを作って、それへの参照をs...
そしてinitialize()というインスタンスメソッドを呼んでいま...
initialize()は今の所SimpleWindowで新たに定義した唯一のメ...
その名の通り、自分自身の初期化を行うつもりで命名しました。
コンストラクタとして実装しても良いのですが、結構複雑な仕...
別のメソッドにしました。ちなみに、他のオブジェクト指向言...
newした後に、init()とかinitialize()とかのメソッドを呼ぶ方...
ここではそれを真似しました。
initialize()の中で、ウィンドウのタイトルを決めて、サイズ...
***ラベルを表示するウィンドウ [#dc55da2c]
このままではウィンドウが空っぽなので、文字を表示してみま...
文字を表示するクラスにJLabelがあります。その名の通りラベ...
以下のリンクからJLabelクラスを選択して、何ができるかざっ...
https://docs.oracle.com/javase/jp/8/docs/api/index.html
基本的な使い方は以下です。まずは、インスタンスを作ります...
JLabel label = new JLabel("Hello!");
ところで、JFrameで作ったインスタンスは、Containerというク...
Container content = this.getContentPane();
で、自分自身のコンテントペーンを返してくれます。
これに対して、上記で作ったラベルインスタンスをaddすること...
content.add(label);
上記の、継承を使ったプログラムによるウィンドウの中に、
Hello!という文字を出してみよう。
上で紹介した3行を、initialize()メソッドに加えれば文字を...
解答例:
import javax.swing.*;
import java.awt.*;
public class SimpleWindow extends JFrame {
public void initialize () {
this.setTitle("私が作った最初の窓");
JLabel label = new JLabel("Hello!");
Container content = this.getContentPane();
content.add(label);
this.setSize(200,100);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String argv[]) {
SimpleWindow sw = new SimpleWindow();
sw.initialize();
}
}
コンテンツの大きさに合わせてウィンドウサイズを変更する機...
上記のプログラムではsetSize()で変更していますが、これの代...
this.pack();
というメソッドを呼び出してみましょう。以下のようになるは...
http://gyazo.com/c6efe47de19436f7564660377fe8b98c.png
解答例:
import javax.swing.*;
import java.awt.*;
public class SimpleWindow extends JFrame {
public void initialize () {
this.setTitle("私が作った最初の窓");
JLabel label = new JLabel("Hello!");
Container content = this.getContentPane();
content.add(label);
this.pack();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String argv[]) {
SimpleWindow sw = new SimpleWindow();
sw.initialize();
}
}
***ボタンを1個表示するウィンドウ [#ied43afe]
今度はウィンドウにボタンを表示してみましょう。
ボタンなので、多分JButtonというクラスがありそうです。
以下から探して、何ができるかざっと見ておきましょう。
https://docs.oracle.com/javase/jp/8/docs/api/index.html
上記のプログラムのJLabelのところをJButtonにすればだいたい...
解答例:
import javax.swing.*;
import java.awt.*;
public class SimpleWindow extends JFrame {
public void initialize () {
this.setTitle("私が作った最初の窓");
JButton button = new JButton("Hello!");
Container content = this.getContentPane();
content.add(button);
this.pack();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String argv[]) {
SimpleWindow sw = new SimpleWindow();
sw.initialize();
}
}
***ボタンを2個表示するウィンドウ [#cb6cf696]
上のプログラムのように、
getContentPane()で得られたContainerに直接ボタンを貼付ける...
しかし、貼付けられるのは一つのボタンだけのようです。
2個以上のボタンを貼り付けるためには、JPanel(パネル、板...
これに複数のボタンを貼り付け(addする)、
そのパネルとJFrameのcontentに貼り付けます。
こんな感じのイメージです。
http://gyazo.com/03c28df2419065241b8736b7b69d7fd3.png
2個のボタンを出してみましょう。
手順としては、
+JPanelのインスタンスを作る(パネル)
+JButtonのインスタンスを2個作る(ボタン)
+パネルにボタンをadd()する
+JFrameのContent Paneを取り寄せる
+Content Paneにパネルをadd()する
です。(順番は多少前後しても構いません)
http://gyazo.com/4c3086ae9b6b5434d2ea741369f731c5.png
解答例:
import javax.swing.*;
import java.awt.*;
public class SimpleButton extends JFrame {
public void initialize () {
this.setTitle("私が作った最初の窓");
JPanel panel = new JPanel();
JButton button1 = new JButton("button1");
JButton button2 = new JButton("button2");
panel.add(button1);
panel.add(button2);
Container container = this.getContentPane();
container.add(panel);
this.pack();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String argv[]) {
SimpleButton sw = new SimpleButton();
sw.initialize();
}
}
***イベントハンドラー [#pdede994]
これからがGUIプログラミングの重要なところです。
GUIプログラミングでは、ユーザがマウスをクリックしたり、ボ...
現在のプログラムでは,ボタンを押しても何もおこりません.
ボタンが押されたイベントに対応するイベントハンドラーが無...
ボタンが押されたイベントを受け取るためには,
+Action Listenerをimplementしたクラスを作る
+そのインスタンスを作る
+これをボタンにaddActionListener()で登録する
必要があります.このインスタンスが、イベントを受け取るイ...
上の、ボタンが2つあるプログラムで、button1が押された時に...
ボタンのイベントを受け取るインスタンスは、新しく作成して...
ここではSimpleWindowから作ったインスタンスでイベントを受...
現在、SimpleWindowはJFrameを継承していますが、これに加え...
Action Listenerをインプレメントすることは、
Action Listenerが持っているメソッドを全て用意していますと...
この場合、そのメソッドは、actionPerformed()というメソッド...
なので、これを用意します。そこではHelloと表示することにし...
さらに、button1のAction Listenerとして、Simple Windowのイ...
これは、button1にアクションが発生したら、こちらのインスタ...
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SimpleButton extends JFrame implements Acti...
public void initialize () {
this.setTitle("私が作った最初の窓");
JPanel panel = new JPanel();
JButton button1 = new JButton("button1");
JButton button2 = new JButton("button2");
button1.addActionListener(this);
panel.add(button1);
panel.add(button2);
Container container = this.getContentPane();
container.add(panel);
this.pack();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed (ActionEvent e) {
System.out.println("Hello");
}
public static void main(String argv[]) {
SimpleButton sw = new SimpleButton();
sw.initialize();
}
}
これで、button1を押した時にHelloと表示されるようになりま...
button2を押しても、何もおきません。Action Listenerが登録...
***本日のレポート [#f632a648]
ボタンをクリックするとHelloと表示するプログラムのjavaとcl...
---------------
***http://www.ocha.ac.jp/の内容を表示するプログラムを書い...
http://gyazo.com/13044fdd9d372118a1f6fe93896eadb3.png
ヒント1
以下のリンクからURLクラスを選択して、調べましょう。
https://docs.oracle.com/javase/jp/8/docs/api/index.html
ヒント2
import java.net.*;
が必要です。
URL targetURL = new URL("http://www.ocha.ac.jp/");
でURLクラスのインスタンスが得られる。
InputStream istream = targetURL.openStream();
でこれからInputStreamのインスタンスが得られる。
InputStreamReader isreader = new InputStreamReader(istre...
でこれからInputStreamReaderのインスタンスが得られる。
BufferedReader breader = new BufferedReader( isreader );
でこれからBufferedReader のインスタンスが得られる。
ヒント3
import java.io.*;
import java.net.*;
public class URLTest {
public static void main (String argv[]) {
try {
ここにプログラムを書く
} catch (IOException e) {
System.out.println("error...");
}
}
}
ヒント4:
import java.io.*;
import java.net.*;
public class URLTest {
public static void main (String argv[]) {
try {
URL targetURL = new URL("http://www.ocha.ac.jp/");
InputStream istream = targetURL.openStream();
InputStreamReader isreader = new InputStreamReader(is...
BufferedReader breader = new BufferedReader( isreade...
ここで一行ずつ読み込む
} catch (IOException e) {
System.out.println("error...");
}
}
}
解答例:
import java.io.*;
import java.net.*;
public class URLTest {
public static void main (String argv[]) {
try {
URL targetURL = new URL("http://www.ocha.ac.jp/");
InputStream istream = targetURL.openStream();
InputStreamReader isreader = new InputStreamReader(is...
BufferedReader breader = new BufferedReader( isreade...
String line;
while((line=breader.readLine()) != null) System.out.p...
} catch (IOException e) {
System.out.println("error...");
}
}
}
***写真ファイルのダウンロード [#edb3e256]
http://is.ocha.ac.jp/~siio/cat.jpg
をダウンロードして、cat.jpgというファイルを作るプログラム...
データはテキストじゃなくて、バイナリーです。
ヒント1:
InputStreamのインスタンスに対してread()メソッドを使うと1...
1バイトのデータを書き出すなら、FileOutputStreamだけで可能...
ヒント2:
import java.io.*;
import java.net.*;
public class URLJpeg {
public static void main (String argv[]) {
try {
URL targetURL = new URL("http://is.ocha.ac.jp/~siio/c...
InputStream istream = targetURL.openStream();
FileOutputStream fout = new FileOutputStream("cat.jpg...
というインスタンスを作って、
istream.read()
で読んで、
fout.write(1バイト)
で書き出します。
解答例
import java.io.*;
import java.net.*;
//http://is.ocha.ac.jp/~siio/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログ...
public class URLJpeg {
public static void main (String argv[]) {
try {
URL targetURL = new URL("http://is.ocha.ac.jp/~siio/c...
InputStream istream = targetURL.openStream();
FileOutputStream fout = new FileOutputStream("cat.jpg...
int aData;
while((aData = istream.read()) != -1) fout.write(aDa...
istream.close();
fout.close();
} catch (IOException e) {
System.out.println("error...");
}
}
}
---------------------
**2019年11月28日:入出力 [#gc7c41bb]
**第11章 入出力 [#hb3a05b8]
**標準入出力 [#u09d26a5]
標準入出力には、
- キーボードからプログラムへの標準入力
- プログラムからディスプレイへの標準出力
- エラー出力
の3種類があります。これらはJavaのクラス変数として定義さ...
- System.in キーボードからプログラムへの標準入力
- System.out プログラムからディスプレイへの標準出力
- System.err エラー出力
それぞれの型は、
- System.in は Input Stream型
- System.out は Print Stream型
- System.err は Print Stream型
です。使えるメソッドはこちらで確認できます。
https://docs.oracle.com/javase/jp/8/docs/api/index.html
***標準入力から読み込んだ文字列をそのままディスプレイに表...
import java.io.*;
public class StandardIOTest {
public static void main(String[] args) {
try {
//System.inからInputStreamReaderを作り、それからBuffe...
InputStreamReader ireader = new InputStreamReader (Sy...
BufferedReader breaderK = new BufferedReader(ireader);
System.out.println("文字列を入力してリターンを押して...
String line = breaderK.readLine();
System.out.println("あなたが入力した文字列" + line);
}
catch(IOException e) {
System.out.println(e);
}
}
}
***演習 [#nd7bbb43]
キーボードから1行入力された文字列から writer.txtという名...
完成した人から、このプログラムのjavaとclassを出席番号+ロ...
//http://gyazo.com/f9aee7f492d574f870e85e2022df374c.png
e100:java siio$ java KeyToFile
Hello, これはテストです。
Hello, これはテストです。
e100:java siio$ cat writer.txt
Hello, これはテストです。
ヒント
import java.io.*;
public class KeyToFile {
public static void main(String[] args) {
try {
ここにプログラムを書く
}
catch(IOException e) {
System.out.println(e);
}
}
}
---------------------
**文字ストリーム [#x25291f2]
文字を読み書きするのが文字ストリームです。文字に適した処...
ReaderとWriterというクラスのグループがあります。
***文字列の書き出し [#a85525d6]
File Writerを使うと文字列を書き出すことができます。
close, flush, writeなどのメソッドがあります。
こちらで機能を確認しましょう。
https://docs.oracle.com/javase/jp/8/docs/api/index.html
また、Print Writerというクラスでは、System Out Printlnの...
Javaのいろいろなデータを書き出すのに便利です。
***printlnで書き出すプログラム [#efb2dbc9]
writer.txtというファイルに、
int x = 2020;
String s = "Multimedia Programming 実習";
というJavaの変数を、printlnで書き出すプログラムを作ってく...
//Print Writerをコンストラクトするためには、File Writerの...
import java.io.*;
public class PrintWriterTest{
public static void main(String[] args) {
try {
//writer.txtというファイルを作って文字を書き込む
PrintWriter pwriter = new PrintWriter("writer.txt");
pwriter.println(2020);
pwriter.println("Multimedia Programming 実習");
pwriter.close();
}
catch (IOException e) {
System.out.println(e);
}
}
}
作ったファイルを hexdump してみてください
$ hexdump writer.txt
0000000 32 30 32 30 0a 4d 75 6c 74 69 6d 65 64 69 61 20
0000010 50 72 6f 67 72 61 6d 6d 69 6e 67 20 e5 ae 9f e7
0000020 bf 92 0a
0000023
hexdump -cでキャラクタ表示にもなります。
$ hexdump -c writer.txt
0000000 2 0 2 0 \n M u l t i m e ...
0000010 P r o g r a m m i n g ...
0000020 ? 222 \n ...
0000023
2020という数値は、int型なのですが、ASCII文字列に変換され...
「Multimedia Programming 実習」は、もともとが文字列なので...
なので、文字列を書き出している部分は、File Writerの機能を...
import java.io.*;
public class PrintWriterTest{
public static void main(String[] args) {
try {
//writer.txtというファイルを作って文字を書き込む
FileWriter fwriter = new FileWriter("writer.txt");
PrintWriter pwriter = new PrintWriter(fwriter);
pwriter.println(2020);
//pwriter.println("Java教科書");
fwriter.write("Multimedia Programming 実習");
pwriter.close();
}
catch (IOException e) {
System.out.println(e);
}
}
}
***read Lineで改行コードまでを読み込む [#y3262833]
File ReaderはFile Writerと同様に文字列を読み込みます。
読み込む文字数を指定して読み込むことも可能です。
さらに便利なクラスがBuffered Readerで、こちらは改行文字ま...
こちらで機能を確認しましょう。
https://docs.oracle.com/javase/jp/8/docs/api/index.html
Buffered ReaderもFile Readerのインスタンスから作りますの...
writer.txtというテキストファイルがあるとして、これから1...
public class BufferedReaderTest{
public static void main(String[] args) {
try {
FileReader freader = new FileReader("writer.txt");
BufferedReader breader = new BufferedReader(freader);
String tmp;
while( (tmp=breader.readLine() ) != null) {
System.out.println(tmp);
}
breader.close();
}
catch (IOException e) {
System.out.println(e);
}
}
}
このプログラムを参考にして、
先のPrint Writer Testに書き足して、
書き込んだデータを読み出して画面に表示するプログラムを作...
ヒント:
import java.io.*;
public class PrintWriterTest{
public static void main(String[] args) {
try {
//writer.txtというファイルを作って文字を書き込む
PrintWriter pwriter = new PrintWriter("writer.txt");
pwriter.println(2020);
pwriter.println("Multimedia Programming 実習");
pwriter.close();
ここに書き足す
}
catch (IOException e) {
System.out.println(e);
}
}
}
解答例:
import java.io.*;
public class PrintWriterTest{
public static void main(String[] args) {
try {
//writer.txtというファイルを作って文字を書き込む
PrintWriter pwriter = new PrintWriter("writer.txt");
pwriter.println(2020);
pwriter.println("Multimedia Programming 実習");
pwriter.close();
//writer.txtのファイルの中身をSystem.out.printlnで表示...
FileReader freader = new FileReader("writer.txt");
BufferedReader breader = new BufferedReader(freader);
String tmp;
while( (tmp=breader.readLine() ) != null) {
System.out.println(tmp);
}
breader.close();
}
catch (IOException e) {
System.out.println(e);
}
}
}
---------------
Javaの入出力は、ファイル、ネットワーク、キーボード、ディ...
(ファイル、ネットワーク、キーボード)
|
| 入力ストリーム
|
V
(Javaプログラム)
|
| 出力ストリーム
|
V
(ファイル、ネットワーク、ディスプレイ)
**バイトストリーム [#h69eaef6]
データを入出力するのがバイトストリームです。
ここでは、
- File Output Stream
- Data Output Stream
- File Input Stream
- Data Input Stream
を使ってみます。
*** File Output Streamを使ってバイト単位で書き出し [#e74b...
こちらで機能を確認しましょう。
https://docs.oracle.com/javase/jp/8/docs/api/index.html
基本的なインスタンスメソッドは、writeとcloseです。writeに...
write(int b)
は、int型の引数の下位1バイトを書き出します。以下のプログ...
import java.io.*;
public class FoutTest {
public static void main(String[] args) {
try {
FileOutputStream fout = new FileOutputStream("fout.da...
fout.write(1234);
fout.close();
}
catch (IOException e) {
System.out.println(e);
}
}
}
これでfout.datという名前のファイルができあがるはずです。 ...
hexdump fout.dat
してみてください
$ hexdump fout.dat
0000000 d2
0000001
1234は0x4d2だったのでその下1バイトが書き込まれました。
***Data Output StreamでJava整数型データを出力する [#l6a1b...
こちらで機能を確認しましょう。
https://docs.oracle.com/javase/jp/8/docs/api/index.html
Javaのいろいろなデータ型を書き出すことができます。
int, long, short, float, double, booleanなどのデータを書...
以下では、int型データを書き出しています。
なお、Data Output StreamはFile Output Streamの機能を利用...
Data Output Streamのコンストラクトには、File Output Strea...
なので2段階のコンストラクト作業になります。
import java.io.*;
public class DoutTest {
public static void main (String[] args) {
try {
FileOutputStream fout = new FileOutputStream("dout.da...
DataOutputStream dout = new DataOutputStream(fout);
dout.writeInt(100);
dout.close();
}catch (Exception e) {
System.out.println(e);
}
}
}
これでdout.datという名前のファイルができあがるはずです。 ...
hexdump dout.dat
してみてください
e100:java siio$ hexdump dout.dat
0000000 00 00 00 64
0000004
int型は4バイトなので4バイトのファイルが出来上がっていま...
***整数を入出力する例 [#j899e2e7]
File/Data Output Streamにはそれぞれ対応したFile/Data Inpu...
こちらで機能を確認しましょう。
https://docs.oracle.com/javase/jp/8/docs/api/index.html
Javaのint型のデータで100をファイルに書いて、これを読み込...
import java.io.*;
public class DoutTest {
public static void main (String[] args) {
try {
FileOutputStream fout = new FileOutputStream("dout.da...
DataOutputStream dout = new DataOutputStream(fout);
dout.writeInt(100);
dout.close();
FileInputStream finput = new FileInputStream("dout.da...
DataInputStream dinput = new DataInputStream(finput);
System.out.println(dinput.readInt());
dinput.close();
}catch (Exception e) {
System.out.println(e);
}
}
}
***演習 [#c9909a95]
1から100までのint型の数値をwirteIntメソッドでファイルに書...
作ったファイルを
hexdump dout.dat
してみてください
解答例
import java.io.*;
public class DoutTest {
public static void main (String[] args) {
int i;
try {
FileOutputStream fout = new FileOutputStream ("dout.d...
DataOutputStream dout = new DataOutputStream(fout);
for(i=1;i<101;i++) dout.writeInt(i);
dout.close();
FileInputStream fin = new FileInputStream ("dout.dat");
DataInputStream din = new DataInputStream(fin);
for(i=1;i<101;i++) System.out.println(din.readInt());
din.close();
} catch (FileNotFoundException e) {
System.out.println(e);
} catch (IOException e) {
System.out.println(e);
}
}
}
-------------
**2019年11月21日: エラー、String、コレクション[#mf116c61]
***本日のレポート [#n970e36c]
EtoJ.javaとEtoJ.classを出席番号+名前のフォルダーにコピー...
***Hash Map [#ac67b323]
https://docs.oracle.com/javase/jp/8/docs/api/index.html
2つのインスタンスのマッッピング(対応付け)の集まりを保持...
import java.util.*;
public class EtoJ{
public static void main(String args[]) {
HashMap<String,String> map = new HashMap<String,String>...
map.put("apple","りんご");
map.put("banana","バナナ");
...
}
}
このプログラムで、mapインスタンスからkeyに対応するvalueを...
map.get("apple");
などとします。
このプログラムを拡張して、以下のように動作する英語ー日本...
[e100:?/Documents/java] siio% java EtoJ banana
バナナ
[e100:?/Documents/java] siio% java EtoJ apple
りんご
[e100:?/Documents/java] siio% java EtoJ
Please input an English word
------------
***Hash Set [#h59a37b5]
https://docs.oracle.com/javase/jp/8/docs/api/index.html
Linked Listと同様にインスタンスの集まりを保持するデータ構...
(element 1) ---> (element 2) ---> (element 3) ---> ... (...
だだし、同一要素を重複して保持しません。
import java.util.*;
public class HashSetTest{
public static void main(String args[]){
HashSet<String> set = new HashSet<String>();
String name1="Alice";
String name2="Bob";
String name3="Cindy";
//setにname1をaddしてください
//setにname2をaddしてください
//setにname3をaddしてください
//setに再びname1をaddしてみてください。その時の戻り値 (b...
//setの内容をIteratorを使って全部表示してください。
}
}
解答例:
import java.util.*;
public class HashSetTest{
public static void main(String args[]){
HashSet<String> set = new HashSet<String>();
String name1="Alice";
String name2="Bob";
String name3="Cindy";
//name1,2,3を追加
set.add(name1);
set.add(name2);
set.add(name3);
//name1の再度追加を試みる。失敗
System.out.println(set.add(name1));
Iterator it = set.iterator();
while(it.hasNext())
System.out.println(it.next());
}
}
***Linked List [#n28a2bc2]
https://docs.oracle.com/javase/jp/8/docs/api/index.html
要素があって、次の要素へのポインターを持っているような、...
(element 1) ---> (element 2) ---> (element 3) ---> ... ...
次のプログラムを作ってLinked Listのメソッドを使ってみまし...
定義とコンストラクタで<String>と書くのは、要素がStringの...
昔のJavaでは不要だったのですが、今のバージョンではこのよ...
import java.util.*;
public class LinkedListTest{
public static void main(String[] args) {
LinkedList<String> list = new LinkedList...
String name1="ALICE";
String name2="BOB";
//listにname1をaddしてください
//listにname2をaddしてください
//listの要素数を取得して表示してください
//listから最初の要素をgetFirstで取り出して表示してください
//listからget(1)してその結果を表示してください
String name3="CINDY";
String name4="DAVE";
//listにname3をaddしてください。
//listからname1を削除してください(remove)
//listにname4をaddFirstしてください。
//この結果、"DAVE" --> "BOB" --> "CINDY"となると思います。
//listの全要素にアクセスするには、Iteratorインスタンスを...
//以下のようにして全要素を表示してください。
Iterator it = list.iterator();
while(it.hasNext()) {
String st = (String)it.next();
System.out.println(st);
}
//toArrayメソッドで配列を作ることもできます
//以下のようにして全要素を表示してください。
Object[] names = list.toArray();
for(Object s: names) System.out.println(s);
}
}
解答例:
Import java.util.*;
public class LinkedListTest{
public static void main(String args[]){
LinkedList<String> list = new LinkedList<String>();
String name1 = "ALICE";
String name2 = "BOB";
list.add(name1);
list.add(name2);
System.out.println(list.size());
System.out.println(list.getFirst());
System.out.println(list.get(1));
String name3 = "CINDY";
String name4 = "DAVE";
list.add(name3);
list.remove(name1);
list.addFirst(name4);
Iterator it = list.iterator();
while(it.hasNext()) System.out.println(it.next());
Object[] names = list.toArray();
for(Object s: names) System.out.println(s);
}
}
解答例(丁寧版):
import java.util.*;
public class LinkedListTest{
public static void main(String[] args) {
LinkedList<String> list = new LinkedList...
String name1="ALICE";
String name2="BOB";
list.add(name1);
list.add(name2);
String firstname=list.getFirst();
String secondname=list.get(1);
System.out.println("listの要素数は" + li...
System.out.println("listの最初の要素は" ...
String name3="CINDY";
String name4="DAVE";
list.add(name3);
list.remove(name1);
list.addFirst(name4);
Iterator it = list.iterator();
System.out.println("要素の走査");
while(it.hasNext()){
String st = (String)it.next();
System.out.println(st);
}
System.out.println("要素の走査 by toArra...
Object[] names = list.toArray();
for(Object s: names) System.out.println(...
}
}
----------
**第10章 Stringクラスとコレクションフレームワーク [#w938...
以下のリンクからStringクラスを選択して、何ができるかざっ...
https://docs.oracle.com/javase/jp/8/docs/api/index.html
***Stringのメソッドをいくつか使ってみましょう [#v7994c3d]
public class TestString {
public static void main (String argue[]) {
String str = "Hello Java World";
//このstrを表示してください(System out.printlnを使...
//strの長さを表示してください(.lengthを使う))
//strの3要素目の文字を表示してください
//最初にaが現れる位置を表示してください
//最後の文字aが現れる位置を表示してください
//辞書式で比較してstrと次のstr2のどちらが先に現れる...
String str2="Hello World";
//strの6要素目から始まる部分文字列を作り表示して表示...
//int型をString型に変換してください。
int v2020=2020;
String s2020 = String.valueOf(v2020);
}
}
解答例:
public class TestString{
public static void main(String args[]){
String str = "Hello Java World";
System.out.println(str);
System.out.println(str.length());
System.out.println(str.charAt(3));
System.out.println(str.indexOf('a'));
String str2 = "Hello World";
System.out.println(str.compareTo(str2));
System.out.println(str2.compareTo(str));
System.out.println(str.substring(6));
int v2020=2020;
String s2020 = String.valueOf(v2020);
System.out.println(s2020);
}
}
***最初の引数(文字列)を表示するプログラムを作る。クラス...
public class TestString {
public static void main(String argv[]) {
System.out.println(argv[0]);
}
}
***演習1:最初の引数(文字列)を逆に出力するプログラムを...
[e100:?/Documents/java] siio% java TestString ochanomizu
ochanomizu
uzimonahco
[e100:?/Documents/java] siio%
さらには、引数がない場合は引数入力を促すことを表示してみ...
[e100:?/Documents/java] siio% java TestString
please input a word
[e100:?/Documents/java] siio%
解答例:
public class TestString {
public static void main (String argv[]) {
try{
System.out.println(argv[0]);
int len = argv[0].length();
for(int i = len - 1; i>=0; i--) {
System.out.print(argv[0].charAt(i));
}
System.out.println();
}
catch (Exception e) {
System.out.println("please input a word");
}
}
}
----------
C言語では、エラーが出そうな処理をする場合は、エラーが発生...
現代的な言語では、プログラムの処理をブロックでまとめて、...
Javaの多くのメソッドが標準的なエラー処理をサポートしてい...
次のプログラムを作って試してください。
引数が2個あることを前提としています。
なので、引数が少ないとエラーが出ます。確認してください。
public class TestException {
public static void main(String argv[]){
System.out.println(argv[0]+" "+argv[1]);
System.out.println("Nice to meet you.");
}
}
エラーが出る可能性のある場所をtryでくくっておき、
エラーが出たらそれを捕捉する処置をcatchで指定します。
public class TestException {
public static void main(String argv[]){
try{
System.out.println(argv[0]+" "+argv[1]);
System.out.println("Nice to meet you.");
}
catch (Exception e) {
System.out.println("please input 2 words.");
}
}
}
-------------
**2019年11月14日:継承 [#ifca9b32]
***本日のレポート [#w6a5e3c7]
作成したOsaifuUSD.javaとOsaifuUSD.classをいつものように出...
***実行時の型 [#h051144d]
サブクラスもちゃんとしたクラスですので、インスタンスを作...
例えば、ParentというクラスからChildというサブクラスを作っ...
Child x = new Child();
として使います。ここで親のクラスの変数に代入することもで...
Parent y = new Child();
しかし、親のインスタンスを、子の型の変数には代入できませ...
Child z = new Parent(); //これはできない
仕組みを考えれば理由は明白です。サブクラスは、スーパーク...
instanceofという演算子があります。上記の例では、
if ( x instanceof Child) {}
if ( x instanceof Parent) {{}
とするとifの中の判定はどちらもtrueです。あるクラスのイン...
***抽象クラス [#eece29ff]
抽象クラスは、インスタンスを作れないクラスです。
いくつかのクラスの上位概念をまとめる役割があります。
例えば、犬クラス、猫クラスというクラスがあって、それらの...
その世界では、犬や猫のインスタンスは作れても、動物のイン...
としたら、動物クラスは抽象クラスになります。
定義のオプションにabstractと書きます。
abstract class Animal {}
この授業で抽象クラスを作成することはないと思いますが、マ...
Readerは抽象クラスです。下のリンクからReaderを探してみて...
https://docs.oracle.com/javase/jp/8/docs/api/index.html
***抽象メソッド [#v050fd26]
抽象クラスと同様に、特定のメソッドがabstractと定義される...
public abstract void xxxx();
***finalクラス [#tf82758d]
クラスの定義にfinalをつけることができます。これ以上継承し...
final class XXXX {}
メソッドの定義につけることもできます。サブクラスでオーバ...
public final void XXXX(){}
***インタフェース [#k5d21dd0]
抽象クラスに似ていますがクラスではないので、インスタンス...
抽象メソッドと定数だけが定義されています。
この授業でインタフェースを定義することはないと思いますが...
インタフェースには空のメソッドが定義されています。
そのメソッドを実装していますという宣言にimplementsという...
例えば、MovableとErasableというインタフェースが定義されて...
クラスの定義で、これらを実装しているという宣言は、以下の...
class MyShape implements Movable, Erasable {}
このクラスでは、Movable, Erasableで定義されているメソッド...
ややこしいですが、後の授業で、実例がたくさん出てきますの...
Mouse Listenerはインタフェースの例です。下のリンクから探...
https://docs.oracle.com/javase/jp/8/docs/api/index.html
***小テスト練習 [#g4c60a6e]
次回またはその次くらいの授業で、小テストを行います。
以下の内容が理解できるように、整理しておいてください。
以下のプログラムの中で、
クラス、インスタンス、サブクラス、スーパクラス、クラスメ...
インスタンス化、継承がどこで行われているのか確認してくだ...
(importで始まる一行目はまだ説明していない内容なので小テス...
import javax.swing.JFrame;
public class SampleWindow extends JFrame {
public static void main(String args[]) {
SampleWindow w = new SampleWindow();
w.setVisible(true);
}
}
-----------------
***オーバーライド [#ad8de445]
サブクラスに、スーパークラスと同じ名前と引数のメソッドを...
これをオーバライドト言います。
一つのクラスの中で、名前が同じメソッドを定義することをオ...
似ていますが、オーバーライドは、引数のパターンも同じです。
スーパークラスのメソッドを置き換えるものです。
ここでは、スーパークラスのprint()メソッドをサブクラスでオ...
***スーパークラスのメソッドの呼び出し [#d39dcf0b]
オーバーライドすると、通常(thisが使われる場合)はサブク...
つまりサブクラスの定義の中で、
print();
this.print();
はどちらもサブクラスのprint()が呼び出されます。
でも、明示的にスーパークラスで定義された方のメソッドを実...
その場合は、メソッドを呼び出すときにsuperと追記します。以...
super.print();
*** OsaifuUSDクラスの改造(2) [#sa44f577]
OsaifuUSDにprint()メソッドを追加して、
円表示の次の行に ( xxx USD ) と残高をUSD表示するようにし...
円表示を行う部分はスーパークラスOsaifuのインスタンスメソ...
http://gyazo.com/39a7b24a8c45e15ac55693592c2eb7cf.png
-解答例
public void print() {
super.print();
System.out.println("( " + (okane / 90) + " usd )" );
}
-----------------
*** OsaifuUSDクラスの改造(1) [#g8c0b7a2]
入出金のメソッドの中で、親の入出金メソッドを活用してみま...
public class OsaifuUSD extends Osaifu {
public int outUSD(int usd) {
return ( out( use * 90) / 90 );
}
public void inUSD(int usd) {
in( usd * 90 );
}
…
}
このプログラムの中のoutメソッドとinメソッドは、親のクラス...
outメソッドで残金がマイナスにならないように処理してあれば...
親のメソッドを呼ぶことを明示的に書くためにsuper.をつかっ...
public class OsaifuUSD extends Osaifu {
public int outUSD(int usd) {
return ( super.out( use * 90) / 90 );
}
public void inUSD(int usd) {
super.in( usd * 90 );
}
…
}
------------
**第8章 継承 [#ka97b6ac]
*** Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう [...
-OsaifuUSDクラスはアメリカで買い物をするときに便利な、ア...
-あたらしく追加するメソッドは以下です
-- void inUSD(int x) xドルをお財布に入金します。このと...
-- int outUSD(int x) xドルをお財布から出金します。この...
--1ドルは90円にしてください(今とはかけ離れた値ですが、サ...
//-スーパークラスのメソッドを上書きするメソッドは以下です
//-- void print() お財布の残高を円とドルで表示します
-OsaifuUSDクラスをテストするmain()メソッドでは次のことを...
-- OsaifuUSDインスタンスを一つ作ってそれをsaifu1という名...
-- OsaifuUSDインスタンスをもう一つ作ってそれをsaifu2とい...
--saifu1に1000円入金する
--saifu2に5ドル入金する
--saifu1とsaifu2が持っている金額を印刷する
--saifu1から2ドル出金してそれをsaifu2に入金する
--saifu1とsaifu2が持っている金額を印刷する
-動作例
http://gyazo.com/f51ea5895aaab32bb30b9a940d91515d.png
-ヒント:一行目はこれ
public class OsaifuUSD extends Osaifu {
-ヒント:mainはこんな感じ
public static void main(String argv[]) {
OsaifuUSD saifu1= new OsaifuUSD();
OsaifuUSD saifu2=new OsaifuUSD();
saifu1.in(1000);
saifu2.inUSD(5);
saifu1.print();
saifu2.print();
saifu2.inUSD(saifu1.outUSD(2));
saifu1.print();
saifu2.print();
}
-解答例
一番シンプルな解答例です。残高がマイナスになることは考慮...
public class OsaifuUSD extends Osaifu {
public int outUSD(int usd) {
okane-=usd * 90;
return usd;
}
public void inUSD(int usd) {
okane+=usd * 90;
}
public static void main(String argv[]) {
OsaifuUSD saifu1 = new OsaifuUSD();
OsaifuUSD saifu2 = new OsaifuUSD();
saifu1.in(1000);
saifu2.inUSD(5);
saifu1.print();
saifu2.print();
saifu2.inUSD(saifu1.outUSD(2));
saifu1.print();
saifu2.print();
}
}
大昔の授業で使ったプログラムを使い続けているので、為替レ...
多分現在の為替レートとはかけ離れています。
(スクリーンショットを撮りなおすのが面倒なので、古いレー...
為替レートを変数として持たせるとしたら、どうしたら良いで...
- インスタンス変数
- クラス変数
のどちらにするか、考えてみましょう。
[解答]インスタンスで共通の情報ですので、おそらくクラス...
------------------
オブジェクト指向言語では、クラスを拡張するいくつかの方法...
Javaなどで一般的な手法は、継承です。引き継ぐということで...
すでにあるクラスの機能を拡張して、新しいクラスを作ること...
拡張する部分は新しく作るのですが、拡張しない部分は、古い...
通常は、古いクラスをコピーして、機能拡張して新しいクラス...
でも、古いクラスの方も、そのまま使われ続けて、改良され続...
そこで継承を使います。
例えば、たい焼きの焼き型で説明します。
とても気に入った焼き型があるけど、しっぽに模様がないのだ...
そこで、現在の焼き型を親として、継承する新しい焼き型を作...
継承したクラスで定義すると、それだけが差分として使われま...
なので、しっぽの模様だけ定義しておけば、あとは全て親の機...
子クラスの中身は、極端な場合、空っぽでも良いです。定義さ...
ということで、
別のクラスを継承することで、
差分だけを書いて機能を拡張していくことができます。
http://gyazo.com/2c8ef14d8be63b9fc18c58d79f2f3879.png
-------------
***インスタンスの参照 [#mb6379b9]
Point pt1 = new Point(10,20);
Point pt2 = pt1;
Point pt3 = new Point(10,20);
この時、
if(pt1 == pt2)
という判断をするとこれはtrueになります。
しかし
if(pt1 == pt3)
という判断をすると結果はfalsです。
参照先が同じなのか、その中のインスタンス変数が同じなのか...
if( ( pt1.x == pt3.x) && (pt1.y == pt3.y) )
のようにします。
***ガーベージコレクションとファイナライザ [#w0dec2d2]
C言語ではmallocでメモリー確保した後、これを使わなくなった...
インスタンスが破棄されるときに、何か特別な処置をしてほし...
***クラス変数の初期化 [#g403bd1b]
先に述べたように、インスタンス変数は、コンストラクタで初...
一つは、定義する場所で初期化できます。
public class TestStatic [
static int x = 10;
y = 20;
ここでxはクラス変数で、yはインスタンス変数です。どちらも...
複雑な初期化をしたい場合は、staticイニシャライザを使用し...
例えば、10個の要素からなる配列を用意して、それの内容を添...
public class TestStatic {
static int[] array;
static {
array = new int[10];
for (int I = 0; I < array.length; I++) array[I] ...
}
***final変数 [#c013ec29]
変数の宣言にfinalをつけると、その変数の値が変更の対象にな...
final static double PI = 3.14159265;
-------------------
*** コンストラクタ [#y0f882f5]
コンストラクタはインスタンスが生成される時に自動的に呼び...
public class Point{
int x, y;
Point() { x = y = 0; }
Point(int pix, int pty) {
x = ptx; y= pty;
}
省略
}
インスタンスを生成する際の演算子newのあとに指定するのは、...
Point pt1 = new Point();
Point pt2 = new Point(10, 20);
これで、最初のコンストラクタと、2番目のコンストラクタが...
コンストラクタから他のメソッドを呼び出すことも可能です。...
Point(int pix, int pty) {
set(ptx, pty);
}
void set(int ptx, int pty) {
this.x = ptx; this.y = pty;
}
コンストラクタの中でコンストラクタを呼び出すこともできま...
Point() {
this(0, 0);
}
これはコンストラクタPoint (x, y)を呼び出しています。this...
*** Osaifuクラスにコンストラクタを追加してみよう [#a8a56d...
-Osaifu() で残金0のインスタンスを作る
-Osaifu(int x) で引数を残金の初期値としたインスタンスを作る
ことができるコンストラクタを作りましょう。
これをmainから呼んで、上記のプログラムと同じことをするた...
Osaifu saifu1 = new Osaifu(1000);//インスタンスを作る
//最初の保持金額を1000円にする
Osaifu saifu2 = new Osaifu(500);//インスタンスを作る
//最初の保持金額を500円にする
とすれば良いです。
***今日の提出課題 [#y418f281]
Osaifu.javaとclassを前回と同様にフォルダにコピーして、圧...
***コンストラクタ解答編 [#w62499a7]
以下のコンストラクタを作ることになります。
Osaifu() { okane = 0; }
Osaifu(int x) { okane = x; }
これは以下のように書いても良いです。
Osaifu() { this(0); }
Osaifu(int x) { okane = x; }
-------------------
--解答例
double distance ( int ptx, int pty, int ptz ) {
int dx = ptx - this.x;
int dy = pty - this.y;
int dz = ptz - this.z;
return Math.sqrt(dx * dx + dy * dy + dz * dz);
}
double distance ( Point3D p ) {
return this.distance(p.getx(), p.gety(), p.getz());
}
**第7章 クラスとオブジェクトの操作 [#k1b96e7b]
*** 他の点との距離を返すメソッドの例を説明しました [#xfa5...
double distance ( int ptx, int pty ) {
int dx = ptx - this.x;
int dy = pty - this.y;
return Math.sqrt(dx * dx + dy * dy);
}
double distance ( Point p ) {
return this.distance(p.getx(), p.gety());
}
distanceという名前は同じでも、引数の違いで、異なる動作を...
*** Osaifuクラスを作ってみよう [#i9df5c2e]
-Osaifuクラスからはインスタンスがたくさん作られる
--Osaifuクラスはお財布の設計図/工場、ここから実際のお財...
--工場出荷時の残金は0円だけど、その後、いろいろな値になる...
--ということで残金はインスタンス変数とすべきだろう
-Osaifuクラスには次のメソッド、変数が必要だろう
--残金を表すインスタンス変数 int okane
--お金を入金するインスタンスメソッド void in(int x);
--お金を出金するインスタンスメソッド int out(int x); 戻...
--残金を印刷するインスタンスメソッドがあってもよいだろう ...
http://gyazo.com/bd6eaafd220dc7ff791288089f293b28.png
-Osaifuクラスをテストするmain()メソッドでは次のことをやっ...
-- Osaifuインスタンスを一つ作ってそれをsaifu1という名前に...
-- Osaifuインスタンスをもう一つ作ってそれをsaifu2という名...
--saifu1に1000円入金する
--saifu2に500円入金する
--saifu1とsaifu2が持っている金額を印刷する
--saifu1から200円出金してそれをsaifu2に入金する
--saifu1とsaifu2が持っている金額を印刷する
public static void main(String argv[]) {
Osaifu saifu1 = new Osaifu();
Osaifu saifu2 = new Osaifu();
saifu1.in(1000);
saifu2.in(500);
saifu1.print();
saifu2.print();
saifu2.in(saifu1.out(200));
saifu1.print();
saifu2.print();
}
http://gyazo.com/c618901458edc1ba338cab87d2810157.png
-Osaifu.java 解答編
public class Osaifu {
int okane;
public void in (int x) { okane += x; }
public int out(int x) { okane -= x; return x; }
public void print() {
System.out.println( "okane = " + okane +" yen");
}
public static void main(String argv[]) {
Osaifu saifu1 = new Osaifu();
Osaifu saifu2 = new Osaifu();
saifu1.in(1000);
saifu2.in(500);
saifu1.print();
saifu2.print();
saifu2.in(saifu1.out(200));
saifu1.print();
saifu2.print();
}
}
--このプログラムでは残金がマイナスになってしまってもかま...
--このためには、例えばoutメソッドを以下のようにすれば良い
public int out(int x) {
if(x < okane ) {
okane = okane -x;
return x;
} else {
int nokori = okane;
okane =0;
return nokori;
}
}
-------------------
***変数には直接アクセスしないのが賢い設計 [#udb9cbfb]
C言語の構造体のように変数にアクセスできます。
でも、オブジェクト指向の設計では、外部からは極力変数にア...
変数にアクセスするには、アクセス用のメソッドを使うのが良...
これにより、
変数の型などを将来変更してもメソッドの書き換えで対応でき...
修飾子をprivateにすると、クラスの外からアクセスできなくな...
そして、アクセス用のメソッドを書いておきます。
例えば、Pointクラスでしたら以下のようにします。
public class Point {
private int x, y;
void set(int newx, int newy) {this.x=newx; this.y=newy;}
int getx() { return this.x;}
int gety() { return this.y;}
void print () {
System.out.println(this.x + ", " + this.y);
}
public static void main(String argv[]) {
Point pt1= new Point();
Point pt2 = new Point();
pt1.set(10,20);
pt2.set(-pt1.getx(), -pt1.gety());
pt1.print();
pt2.print();
}
}
-演習5
Point3Dのメソッドを充実させて次のmain()メソッドで
10, 20, 30
-10, -20, -30
という結果が出るようにしましょう
public static void main(String argv[]) {
Point3D pt1 = new Point3D();
Point3D pt2 = new Point3D();
pt1.set(10, 20, 30);//インスタンス変数を...
pt2.set(-pt1.getx(), -pt1.gety(), -pt1.ge...
pt1.print();//インスタンスメソッド呼出
pt2.print();
}
***指定された座標との距離を返すメソッドdistance() [#sab2f...
print()メソッドの他に、もう少し複雑な計算をするメソッドを...
double distance ( int ptx, int pty ) {
int dx = ptx - this.x;
int dy = pty - this.y;
return Math.sqrt(dx * dx + dy * dy );
}
今度は、座標ではなくて、他のPointインスタンスを引数にして...
double distance ( Point p ) {
int dx = p.getx() - this.x;
int dy = p.gety() - this.y;
return Math.sqrt(dx * dx + dy * dy );
}
この2つのメソッドは、どちらもPointクラスに実装することが...
違う関数ですので、片方のdistanceの中から、もう一方のdista...
double distance ( int ptx, int pty ) {
int dx = ptx - this.x;
int dy = pty - this.y;
return Math.sqrt(dx * dx + dy * dy );
}
double distance ( Point p ) {
return this.distance(p.getx(), p.gety());
}
-演習6
Point3Dに、
- 他の座標との距離を返すメソッド double distance ( int pt...
- 他のPoint3Dインスタンスとの距離を返すメソッド double di...
次のmain()メソッドで
10, 20, 30
-10, -20, -30
74.83314773547883
という結果が出るようにしましょう
public static void main(String argv[]) {
Point3D pt1 = new Point3D();
Point3D pt2 = new Point3D();
pt1.set(10, 20, 30);//インスタンス変数を...
pt2.set(-pt1.getx(), -pt1.gety(), -pt1.ge...
pt1.print();//インスタンスメソッド呼出
pt2.print();
System.out.println(pt1.distance(pt2));
}
----------------
***自分自身のメンバーへのアクセスthis [#ra357870]
クラス変数、クラスメソッド、インスタンス変数、インスタン...
Math.PI
でクラスMathのクラス変数のPIにアクセスできます(円周率が...
インスタンスならば、クラスからインスタンスを生成した後で...
Point pt1 = new Point();
pt1.print();
このようにメンバーにアクセスするには、そのメンバーが属し...
public class Point {
int x, y;
void print() {
System.out.println(x + ", " + y);
}
}
と、書いてあります。インスタンスメソッドのprint()の中で、...
これをインスタンスの名前を指定して書くことはできるでしょ...
public class Point {
int x, y;
void print() {
System.out.println(this.x + ", " + this.y);
}
}
と書くこともできます。メソッドの中で一時的に宣言した変数...
***public static void main の説明 [#ba29c5fb]
修飾子の説明:
- staticとついているのがクラス変数、クラスメソッドです
- staticが付いていないのがインスタンス変数、インスタンス...
- publicはすべてのクラスからアクセス可能
- protectedはサブクラスからアクセス可能(後で説明します)
- privateはそのクラスの中からのみアクセス可能
などから、今までお馴染みの、
public static void main (String args[]) {}
は、どいういう意味だったでしょうか?考えてみてください。
- これはクラスメソッドです(staticなので。これが一番重要...
- これは値を返しません(void)
- これはどのクラスからでもアクセスできます(publicなので...
さらに説明すると、クラスメソッドmainは特別なメソッドで、j...
-javaコマンドは、引数のクラスのクラスメソッドmainを実行し...
--staticと付いているのがクラス変数、クラスメソッドの印です
-今作ったPointクラスにもクラスメソッドmainを実装すれば自...
***クラスの中に自分自身のインスタンスをテストするクラスメ...
public class Point {
int x, y;
void print () {
System.out.println(this.x + ", " + this.y);
}
public static void main(String args[]) {
Point pt1 = new Point(); //自分自身からイ...
Point pt2 = new Point(); //自分自身からも...
pt1.x = 10;
pt1.y = 20;
pt2.x = - pt1.x;
pt2.y = - pt1.y;
pt1.print();
pt2.print();
}
}
これで、java Pointコマンドで、テストすることができます。
やっていることは、少しややこしいので、しっかり確認してく...
クラスメソッドの中で、自分が定義した方法で、インスタンス...
-演習4
クラスPoint3Dに自分自身をテストするクラスメソッドmainを作...
http://gyazo.com/bdef2ab8e69f7f6e62273c2d67d7af2e.png
public static void main(String args[]) {
Point3D pt1 = new Point3D(); //自分自身か...
Point3D pt2 = new Point3D(); //自分自身か...
pt1.x = 10;
pt1.y = 20;
pt1.z = 30;
pt2.x = - pt1.x;
pt2.y = - pt1.y;
pt2.z = - pt1.z;
pt1.print();
pt2.print();
}
--------------
***クラス変数・メソッドとインスタンス変数・メソッド [#h86...
変数とメソッドの定義に使われる修飾子や戻り値の表現は、C言...
- 戻り値がなければvoidと書きます
- 戻り値があればその型を書きます。
以下はとても重要です。
- staticとついているのがクラス変数、クラスメソッドです。...
- staticが付いていないのがインスタンス変数、インスタンス...
(インスタンスを作らないと呼び出せません)
クラス変数にはクラス名を指定してピリオドでアクセスします...
class MathTest {
public static void main (String args[]) {
System.out.println(Math.PI);
}
}
またMath.random()クラスメソッドで乱数が得られます。以前の...
インスタンス変数はインスタンスを作ってからアクセスします...
Point pt1 = new Point();
pt1.print();
としてアクセスできます。クラスメソッドではありませんので...
そのほかの修飾子は、あとで説明しますが、アクセス制御だけ...
- publicはすべてのクラスからアクセス可能
- protectedはサブクラスからアクセス可能(後で説明します)
- privateはそのクラスの中からのみアクセス可能
です。
--------------------------
まずは前回の復習をします。
-クラスは型、インスタンスはそれから作られたもの
--クラスがたいやきの焼き型だとすると、インスタンスはそれ...
--クラスは設計図でインスタンスはそれから作られたもの
-クラスとインスタンスそれぞれにメソッドと変数がある
--クラス変数 例:何個のインスタンスを作ったか?
--クラスメソッド 例:インスタンスを作れ
--インスタンス変数 例:ひとつのたいやきの重さ
--インスタンスメソッド 例:たいやきをxxグラム食べる
http://gyazo.com/bbdd3587977a172f7fa7f00c4f5787e0.png
***すごく簡単なクラスの例 [#kbcf21cf]
整数型のインスタンス変数を2個だけ持つクラスです。C言語の...
public class Point {
int x, y;
}
先のPoint型のクラスにインスタンスメソッドを1個追加しまし...
public class Point {
int x, y;
void print() {
System.out.println(x + ", " + y);
}
}
***インスタンスの生成 [#cc06a50c]
クラスからインスタンスを作ることをインスタンス化またはイ...
先のPointクラスとは別の、テスト用クラスTestPointを用意し...
Pointクラスは別のファイルで定義されていることになりますが...
public class TestPoint {
public static void main(String args[]) {
Point pt1 = new Point();
Point pt2 = new Point();
}
}
配列の時と同じくnewコマンドが使われています。new Point()...
インスタンスのインスタンス変数、インスタンスメソッド(こ...
pt1とpt2のインスタンス変数に値を代入して、インスタンスメ...
public class TestPoint {
public static void main(String args[]) {
Point pt1 = new Point();
Point pt2 = new Point();
pt1.x = 10;
pt1.y = 20;
pt2.x = - pt1.x;
pt2.y = - pt1.y;
pt1.print();
pt2.print();
}
}
この結果、10, 20と-10, -20が表示されます。
- この後、以下の演習をやってもらいました。
TestPoint3Dというクラスを作って、その中のmain関数で、
先に作ったPoint3Dクラスからインスタンスを2個作り、それぞ...
以下のような実行結果が出るようにしてください
http://gyazo.com/deeb78a70a724a01ce76945235d42ab8.png
--------------------
**以下は、前回以前の授業の内容です。 [#iafdd8f4]
**2019年10月17日 [#d30d7432]
***インスタンスの生成 [#cc06a50c]
クラスからインスタンスを作ることをインスタンス化またはイ...
先のPointクラスとは別の、テスト用クラスTestPointを用意し...
Pointクラスは別のファイルで定義されていることになりますが...
public class TestPoint {
public static void main(String args[]) {
Point pt1 = new Point();
Point pt2 = new Point();
}
}
配列の時と同じくnewコマンドが使われています。new Point()...
インスタンスのインスタンス変数、インスタンスメソッド(こ...
pt1とpt2のインスタンス変数に値を代入して、インスタンスメ...
public class TestPoint {
public static void main(String args[]) {
Point pt1 = new Point();
Point pt2 = new Point();
pt1.x = 10;
pt1.y = 20;
pt2.x = - pt1.x;
pt2.y = - pt1.y;
pt1.print();
pt2.print();
}
}
この結果、10, 20と-10, -20が表示されます。
- 演習3
TestPoint3Dというクラスを作って、その中のmain関数で、
先に作ったPoint3Dクラスからインスタンスを2個作り、それぞ...
以下のような実行結果が出るようにしてください
http://gyazo.com/deeb78a70a724a01ce76945235d42ab8.png
-----------
**第6章「クラスの基礎」 [#ncf7b7be]
***すごく簡単なクラスの例 [#vbf621fd]
整数型のインスタンス変数を2個だけ持つクラスです。C言語の...
public class Point {
int x, y;
}
- 演習1
3次元の座標x,y,zを表現するクラスPoint3Dを定義してください...
x,y,zはそれぞれint型とします。定義したらコンパイルしてく...
先のPoint型のクラスにインスタンスメソッドを1個追加します...
public class Point {
int x, y;
void print() {
System.out.println(x + ", " + y);
}
}
- 演習2
先のクラスPoint3Dのインスタンスの持つ座標x,y,zが10,20,30...
--------
***クラスとインスタンスの説明をします。よく聞いてください...
まとめです:
-クラスは型、インスタンスはそれから作られたもの
--クラスがたいやきの焼き型だとすると、インスタンスはそれ...
--クラスは設計図でインスタンスはそれから作られたもの
-クラスとインスタンスそれぞれにメソッドと変数がある
--クラス変数 例:何個のインスタンスを作ったか?
--クラスメソッド 例:インスタンスを作れ
--インスタンス変数 例:ひとつのたいやきの重さ
--インスタンスメソッド 例:たいやきをxxグラム食べる
http://gyazo.com/bbdd3587977a172f7fa7f00c4f5787e0.png
-------------
-演習4
mainの引数argsは、Stringの配列で、コマンドラインで起動し...
コマンドの後に続けた書いた文字が入っています。
args[0], args[1], args[2] .... をすべてfor-each文で
表示するプログラムを書いてみましょう。
この時、以下のように、args[]の文字をすべてfor-each文で+つ...
javac ArgsTest2 cat dog cow fox
cat + dog + cow + fox
public class ArgsTest2 {
public static void main(String args[]) {
boolean isFirstWord = true;
for(String s: args) {
if(false == isFirstWord) {
System.out.print(" + ");
}
isFirstWord = false;
System.out.print(s);
}
System.out.println();
}
}
***for-each文 [#cd4a2794]
for-each文は、Cにはなかったです。練習しましょう。
for(型 変数名: 式) {}
int型の4個の配列は、以下のように宣言できます。
int[] array;
array = new int[4]
これを1行で表現して、さらに初期値をいれてしまうこともで...
int[] array = new int[]{1,2,3,4};
- 演習3
int[] array = new int[]{1,2,3,4};
で宣言した配列の中身を、for-each文で順番に表示せよ。ヒン...
for(int x: array) {}
です。
解答例:
class ArrayTest {
public static void main (String args[]) {
int[] array = new int[]{1,2,3,4};
for (int x: array) {
System.out.println(x);
}
}
}
--------------
***for文 [#ac566ee5]
for文もC言語と同じです。
for(初期設定; 条件; 再設定) {}
-演習2-1
10万円を今の1年もの定期預金の年利で複利で運用した時、元利...
for文で、2項目目に20万円を超える条件を書いて、年数と金額...
http://gyazo.com/1733defca0c709c41c69ea729320ab61.png
for( year = 1; <ここに条件>; year++) {
解答例:
class Kinri {
public static void main (String args[]) {
double okane=100000;
int year;
for(year=1; okane < 200000; year++) {
okane = okane * 1.002;
System.out.println("year = " + year + " okane= " + ok...
year++;
}
}
}
-演習2-2
break文で直近のループを抜け出せます。上の問題を無限ループ...
***while文 [#odd3e1de]
while文もC言語と同じです。
while(条件) {}
-演習2-3
上の問題をwhile文で書き直してみましょう。
--------------
-演習1
100点満点のテストの得点から、ABCDの成績を表示するプログラ...
その準備のために、
0から100までの乱数を10個表示するプログラムを作ります。
public class Score {
public static void main (String argv[]) {
int i,a;
for(i=0;i<10;i++) {
a=(int)(Math.random() * 100);
System.out.println(a);
}
}
}
Math.random()は、Mathクラスのクラスメソッドであるrandom()...
System.out.println()などと同じく、大文字で始まる単語はク...
次にこの乱数を100点満点の点数とみなして、成績ABCDを表示す...
成績の基準は、80点以上がA, 60点以上80点未満がB, 40点以上6...
動作例を以下に示します。
http://gyazo.com/829b04a7fc82cdfe9dd0dfa650af873e.png
解答例1:
public class Score {
public static void main(String args[]) {
int i,a;
char score;
for(i=0;i<10;i++){
a= (int)(Math.random() * 100);
if(a>=80) score='A';
else if(a>=60) score='B';
else if(a>=40) score='C';
else score='D';
System.out.println(a + " " + score);
}
}
}
解答例2:
public class Score {
public static void main (String argv[]) {
int i,a;
for(i=0;i<10;i++) {
a=(int)(Math.random() * 100);
System.out.print(a + " ");
if(a<40) System.out.println("D");
else if(a<60) System.out.println("C");
else if(a<80) System.out.println("B");
else System.out.println("A");
}
}
}
-----------
**第5章「制御構造」 [#p54c6568]
制御構造も大半はC言語と同じです。
***if文、else文、else-if文 [#s3bd1b3d]
if文もC言語と同じです。
- if文
if (a==0) b=100;
if (a==0) {
b=100;
}
- if-else文
if (a==0) {
b=100;
}else{
b=10;
}
- else-if文
if (a>100) {
}else if (a>10){
}else{
}
--------------
***第4章「演算子」 [#p4a8e735]
//--演習4.2をやってみよう
演算子はほとんどC言語と同じです。復習しましょう。
変数には算術演算子が使えます。算術演算子はC言語と同じです。
+-*/%
です。%は剰余です。
5 % 2
は1です。
代入演算子は=です。
算術演算子と代入演算子を組み合わせることもできます。
a += 1;
は
a = a + 1;
と同じ意味です。
インクレメント、デクレメント演算子もCと同様です。
a = 1;
b = a++;
は、bが1、aが2になります。
a = 1;
b = ++a;
は、a, bどちらも2になります。
関係演算子もC言語と同じです。
<, >, <=, >=, ==, !=
論理演算子もC言語と同じです。
&&, ||, !
Javaではbooleanにしか論理演算できないので、&, | だけでもo...
ビット演算し、シフト演算子もC言語と同じです。
&, |, ^, ~, <<, >>, >>>
1 << 2
は4になります。
キャストもあります。C言語と同じです。
long b=1234;
int a = (int)b;
***文字列 [#t32f75c4]
C言語では文字列はただのバイト変数の配列でした。最後の値が...
Javaでは文字列は、Stringクラスのインスタンスです。
なんのことかは後の授業で説明しますが、処理をする関数を内...
なので、いろいろな操作が可能です。
文字列は""で括ります。
"Hello Java World!"
printlnできます。
System.out.println("Hello Java World!");
足し算もできます。
System.out.println("This is " + "a test.");
変数にも代入できます。変数の種類はStringです。オブジェク...
String world = "Hello Java World!";
-演習6
最初に作ったHello.javaプログラムを、String変数 worldとい...
解答例:
class Hello {
public static void main (String args[]) {
String world = "hello java world!";
System.out.println(world);
}
}
-演習7
--コマンドの引数はarg[0], arg[1] ... などにString型の配列...
--二つの引数を与えたときに、それが+でつないで表示されるプ...
http://gyazo.com/8159f78165e17781a7110de3763c833c.png
ヒント
--以下は引数一つを表示するだけのサンプルです。これをもと...
--arg[0]とarg[1]をprintlnの中で+でつないで表示すれば良い...
class ArgsTest {
public static void main (String args[]) {
System.out.println(args[0]);
}
}
できてしまった人は以下をお願いします。
このプログラムで、引数が2個未満の場合はエラーになります。
2個未満の場合には、2個引数を描いてくださいというメッセ...
.length関数でargsの長さを知ることができます。
if文はC言語と同じです。
if(args.length < 2) {
} else {
}
というように書けます。
--------------
***配列 [#e846fded]
C言語では小規模な配列を使う場合、静的に確保した配列をよく...
Javaでは、システムからメモリー確保して動的に確保した配列...
C言語でもmalloc()関数でメモリーを確保したことがあると思い...
例えばint型の変数3個分のメモリを確保して、それをint型を示...
//C言語での例です:
int *p;
*p = (int *)malloc(sizeof(int)*3);
Javaでも同じことをやります。
システムにお願いして、必要な量の配列を格納するメモリー領...
まずは配列の変数を定義して、次にnewコマンドで必要なメモリ...
int[] x; (配列を参照する変数を定義する)
x = new int[3]; (int3個ぶんのメモリー領域をnewコマン...
こうすると、プログラムの中からx[0]=1;とかx[2]=x[0];などと...
1行でまとめて書くこともあります。
int[] x = new int[3];
演習3
要素が100個のintの配列x[0]からx[99]を作って、それに1,2,3,...
ヒント:
class Vartest {
public static void main (String args[]) {
//配列を定義します。
//(略)
//for文で値を入れます
for(int i=0; i<100; i++) {
//(略)
}
//for文で表示します
for(int i=0; i<100; i++) { //(略)
}
}
---------------------
**第3章「変数」 [#xc22f04b]
***Javaにおける基本データ型 [#n3c4e251]
-整数型
--byte (1バイト。-128から127)
--short (2バイト。-32,768から32767)
--int (4バイト。-2,147,483,648から2,147,483,647)
--long (8バイト。明確に数値で指定する場合は、x = 20L; の...
--char (1文字を表す。メモリー上のサイズは色々。''でくくる...
-浮動小数点型
--float (4バイトで表す浮動小数点。重力加速度なら9.80665の...
--double (8バイトで表す高精度な浮動小数点。光速なら2.9979...
-論理型
--boolean (trueかfalseのどちらかの値をとる。 x = true; な...
C言語と違い、整数型のサイズが明確に決められました。char型...
-演習1
先に作ったHello.javaを参考にVartest.javaというプログラム...
以下では、byte型変数を定義して、それを表示しています。
変数名は変えても良いです。
printlnの中では、文字列を連結しています。Javaでは文字列を...
class Vartest {
public static void main (String args[]) {
int x = 42;
System.out.println("byte value x =" + x);
}
}
これをもとに、short, int, long, char, float, double boole...
class Vartest {
public static void main (String args[]) {
byte x= 42;
int x1= 123456;
char name = '椎';
System.out.println("byte value x =" + x);
System.out.println("int value x1 =" + x1);
System.out.println("char value name =" + name);
}
}
解答例:
class Vartest {
public static void main (String args[]) {
byte x_byte = 42;
int x_int = 12345;
short x_short = 123;
long x_long = 12345678;
char x_char = '椎';
float x_float = 123.4f;
double x_double = 3.14d;
boolean x_boolean = true;
System.out.println("byte value x_byte = " + x_byt...
System.out.println("short value x_short = " + x_s...
System.out.println("int value x_int = " + x_int);
System.out.println("long value x_long = " + x_lon...
System.out.println("char value x_char = " + x_cha...
System.out.println("float value x_float = " + x_f...
System.out.println("double value x_double = " + x...
System.out.println("boolean value x_boolean = " +...
}
}
-演習2
以下のように、整数型の変数に文字を代入して値を表示すると...
あなたのイニシャルを表す英文字の文字コードを表示するプロ...
int myInitialCode1 = 'S', myInitialCode2 = '椎';
System.out.println(myInitialCode1);
System.out.println(myInitialCode2);
------------------
- 次に簡単なウィンドウを出してみましょう。
授業の最後の方で紹介する,Swingというフレームワークを使っ...
import javax.swing.JFrame;
public class SimpleWindow {
public static void main(String argv[]) {
JFrame f = new JFrame("私が作った最初の窓...
f.setSize(200,100);
// f.setDefaultCloseOperation(JFrame.EXIT_...
f.setVisible(true);
}
}
これをSimpleWindow.javaという名前で保存して、
javac SimpleWindow.java
java SimpleWindow
とタイプしてコンパイル/実行します。
このプログラムは,ウィンドウのクローズボタンを押しても終...
プログラムを停止するには,ターミナルでコントロール-cを押...
#ref(How2Java/simplewindow.png)
*** 超簡単なプログラム(hello world)を作ってみる [#v4ccc293]
- ターミナルから、vi Hello.javaとかemacs Hello.javaとかpi...
もしくは、cotEditerを起動して作成します。
- ここで、以下のようなプログラムを書いてみます。
class Hello {
public static void main (String args[]) {
System.out.println("hello java world!");
}
}
http://is.ocha.ac.jp/~siio/gyazo/20121004010107.png
- これをHello.javaという名前で保存します。lsやcatコマンド...
$ ls
Hello.java
$ cat Hello.java
class Hello {
public static void main (String args[]) {
System.out.println("hello java world!");
}
}
今は、Hello.javaファイルが一つしかありません。これをコン...
$ javac Hello.java (コンパイルする)
コンパイルに成功するとHello.classというファイルができて...
$ ls
Hello.class Hello.java
これはjavaコマンドで動作します。javaはインタープリータで...
$ java Hello (実行する。.javaなどの拡張子は不要)
hello java world! (結果)
----------
**javaのマニュアル [#beafbfad]
//http://sdc.sun.co.jp/java/docs/j2se/1.5.0/ja/docs/ja/ap...
//http://java.sun.com/javase/ja/6/docs/ja/api/index.html
//http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html
//http://docs.oracle.com/javase/jp/6/api/
http://docs.oracle.com/javase/jp/8/docs/api/index.html
***参考図書(去年までは教科書でした) [#d5f8ad25]
http://gyazo.com/de3288074dae1c75f6df4ef3c0b9b3d4.png
http://www.amazon.co.jp/dp/4883732258/
前半はこの内容で進めますので、手元にあると便利です。
*** この講義の目的 [#l5592b29]
+Javaでプログラムする
+オブジェクト指向の概念を理解してプログラミングする
+GUIプログラミングをする
*** この講義の順序 [#gcf48d66]
+Javaになれる(C言語などのプログラミング手法の復習)
+オブジェクト指向について理解する
+GUIプログラミングについて理解する(イベント駆動)
+お絵描きプログラムを作ってみる
*** 成績評価 [#c732dbb9]
+お絵描きプログラムの完成度,作り込み
+毎回の宿題の達成(参考程度)
+出席状況(参考程度)
***単位を出す条件 [#k4e326f7]
//**欠席状況
+ 最終課題のお絵描きプログラムで最低限お願いした機能を実...
+ 3/4以上出席してください。(欠席は3回まで)欠席4回で自動...
(公欠、忌引などは欠席にしませんので連絡ください。病欠、電...
//欠席3回以下なら不可にはなりませんが、成績が下がるかもし...
//以下に欠席状況を示します。
//ので、心当たり無ければ連絡ください。
//(病欠、公欠、忌引などは0になっているはずですが間違って...
***授業用のフォルダを作る [#l5df9663]
授業の内容を入れておくフォルダを作ってください。Documents...
***出席表明アプリケーション [#s026a135]
以下のアプリケーションで、授業開始に出席表明してもらいま...
- http://is.ocha.ac.jp/~siio/IamAttending.zip
#ref(http://is.ocha.ac.jp/~siio/gyazo/b1128c100d39263a848...
- ダウンロードしてzipを開くと、フォルダになっているかもし...
- 初めて起動する時は、右クリックして、「開く」ボタンを選...
- 今後の授業でも最初に使いますのでわかりやすいところに置...
//|学籍番号|10/4|10/11|10/25|11/8|11/15|11/22|11/29|12/6|...
//|1720501|0|0|0|0|0|0|0|0|0|0|0|0|
** 出来上がったプログラムの提出方法 [#bd9cbbf8]
- フォルダを作ってその中にjavaファイルとclassファイル
//と、取扱説明書ファイルと、それ以外に必要なファイルがも...
を入れてください。
フォルダの中のclassファイルをダブルクリックしたらプログラ...
-このフォルダに名前を付けてください。フォルダの名前は、「...
-このフォルダを圧縮してください
--フォルダを選択してファイルメニューから圧縮を選択します
-圧縮したファイルを以下の手順で
/home/isstaff/siio/Public/Drop Box/.
に提出してください。ターミナル.appからなら
cp 123456siioitiro.zip /home/isstaff/siio/Public/Drop\ Box
としてください。ファインダーからなら、メニューから「移動...
以下のように入力して、移動ボタンを押して、そこに現れるド...
http://is.ocha.ac.jp/~siio/gyazo/dropbox.png
--書き込み専用なので確認できないけどokですかという意味の...
-レポート提出用フォルダは書き込み専用で見ることができませ...
//-授業中でしたら、[[ココを見ると:http://is.ocha.ac.jp/~s...
-同じ名前のフォルダを投げ込むと、エラーになります。という...
*ヒューマンインタフェース2019年度前期 [#o618d6d1]
**ヒューマンインタフェースのレポート [#fa42ea61]
提出は任意です.もし良いレポートを提出いただけたら出席点...
-締め切り2019年8月31日土曜日
-形式分量:A4, ページ数は1-2ページ程度
-提出先・提出方法:PDFにしてsiio@is.ocha.ac.jpまでメール...
-メール表題:ヒューマンインタフェースレポート: 17205XX
メールの標題は「ヒューマンインタフェースレポート: 17205XX...
提出いただいた方はこのページでお知らせします。提出してし...
(提出を確認出来るよう締め切りより早めに提出していただくこ...
//提出状況は、この下に、学籍番号と受理日で案内します。
//もし、学籍番号が公表されたくない場合は、確認用の秘密の...
//学籍番号の代わりにその名前を使います。
//|学籍番号|受理日|
//| 1720505 |2019年8月30日|
//| 1720514 |2019年8月31日|
//| 1720525 |2019年8月26日|
//| 1720529 |2019年8月24日|
//| 1720535 |2019年8月31日|
//| 1720543 |2019年8月31日|
//| sunny |2019年8月31日|
//sunny = 1720534
//|1620515|2018年8月|
//|1620520|2018年8月|
***レポートの課題 [#c9d0add0]
-身の回りの携帯機器、家電製品、機械製品、コンピュータソフ...
-そして、それがなぜ使いにくいのかを、 授業で説明した、 制...
-また,自分ならこのように設計して使いやすくするというアイ...
**出席状況 [#te5cda59]
学部「ヒューマンインタフェース」は出席重視の授業です.そ...
//しておきます.
欠席回数は成績に大きく影響しますので、間違いありましたら...
//公欠届のある日は出席としてあります。
//|学籍番号|4月12日|4月19日|5月17日|5月24日|5月31日|6月7...
//|1620415|出|出|欠|出|出|欠|欠|欠|出|出|出|出|出|4不可|
//|1620501|出|出|出|出|出|出|出|出|出|出|出|出|出|0|
** 講義開催予定 [#p8ec1788]
-4/11
-4/18
-4/25
-4/27 休講(出張)
-5/9 休講(学会出張)
-5/16
-5/23
-5/30
-6/6
-6/13
-6/20
-6/27
-7/4
-7/11 休講
-7/18
-7/25
-8/1 試験週間のため授業はありません
**宿題 [#pb8621ca]
下のリンク先のソースコードをコンパイルして、応答速度を図...
http://is.ocha.ac.jp/~siio/index.php?CSL11HCI#k497ebbd
//**宿題 [#x69779a5]
//
//***GUI黎明期のPC性能を調べてください(2018.4.19) [#ba9db...
//-GUI黎明期PCのCPU名、CPUクロック、メモリ容量、画素数を...
//--現在,Windows を使っている人は,最初の Windows が出荷さ...
//--Mac OS Xを使っている人は,1984に出荷された最初の Macin...
//-今あなたが使っているコンピュータと比較してください.
//-次回の授業(5/17)最初に配布するA5サイズの用紙に各自で記...
//**宿題
//
//***人の反応速度を測定するプログラムを作って測定してくだ...
//-連休明けの授業(5/15)の開始時に、A4, 1枚(両面印刷でも可...
//--用紙の上辺に学籍番号、学年、氏名を1行で書いておいてく...
//-C 言語では,次のようなプログラムで、”hit now”という文字...
//--http://is.ocha.ac.jp/~siio/hci/hitnow.c
//--このプログラムは固定時間(5秒)後にhit nowが表示され...
//-これによりあなたの応答速度を複数回実測して、人の応答速...
//-また個人差や年齢などで結果は変わるかもしれません。周り...
//-また何度も測定することで、習熟して速度が向上したり、そ...
//--そのような現象が観察できたら、これも報告してください...
**教科書 [#ta8dbb5f]
http://ec2.images-amazon.com/images/I/51SsP4P1UiL._SL500_...
http://www.amazon.co.jp/dp/4781912605/
**授業資料 [#s6bf1fc3]
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c1...
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c2...
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c3...
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c4...
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c5...
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c6...
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c7...
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c8...
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c9...
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c1...
(授業開始直前や直後に差し替えされている可能性があります。)
**教科書サポートページ [#b385f64d]
-http://is.ocha.ac.jp/~siio/index.php?CSL11HCI
//**宿題:ボタンを押すたびに点灯/消灯を繰り返す(トグル...
//
//以下は、Arduinoの2ピンに接続された押しボタンスイッチを...
//ちなみにHIGHとLOWはintの値で、int型の変数で保存すること...
//
// int outpin=13; //An LED is connected to ping 13
// int inpin=2; //A switch is connected to pin 2
//
// void setup() {
// // initialize the digital pin as an output and input.
// pinMode(outpin, OUTPUT);
// pinMode(inpin, INPUT);
// }
//
// void loop() {
// if ( digitalRead(inpin) == HIGH) {
// digitalWrite(outpin, LOW); // set the LED on
// }
// else {
// digitalWrite(outpin, HIGH); // set the LED off
// }
// delay(30); // wait for 30 msecond
// }
//**宿題:人の反応速度を測定するプログラムを作って測定し...
//-連休明けの授業(5/8)の開始時に、A5, 1枚に書いて提出して...
//-C 言語では,次のようなプログラムで、”hit now”という文字...
//--http://is.ocha.ac.jp/~siio/hci/hitnow.c
//--このプログラムは固定時間(5秒)後にhit nowが表示され...
//-- 乱数を使って表示までの時間を変える改良をしてもらって...
//-これによりあなたの応答速度を実測して、人の応答速度が 3...
//
//
------
このページについてのお問い合わせはsiio@is.ocha.ac.jpまで。
終了行:
[[Lecture]]
//#contents
*マルチメディアプログラミング実習 2019年度後期 [#d33b7775]
**今後の予定 [#de7840d4]
-10月24日 椎尾学会出張のため休講
-11月7日 椎尾病欠のため休講(すみませんでした)
-12月26日 休講
-1月16日 月曜授業日のため授業なし
-1月23日 最終授業日
**冬休みの自習と宿題の案内 [#v0c32ec4]
[[こちら:http://is.ocha.ac.jp/~siio/index.php?LectureMMPH...
**マルチメディアプログラミングの最終課題 [#fa431919]
-課題:お絵描きプログラムを作成してさらに取扱説明書を作成...
--この課題のヒントは[[こちらをみてください:http://is.ocha...
-提出状況はこちらです
--http://is.ocha.ac.jp/~siio/?JavaReport
*** 提出課題として最低やってほしいこと [#hd791dc3]
-一筆書き状態と、ポインタのずれを直してください
-ペンの太さをメニューで変えられるようにしてください
-ペンの色をメニューとカラーパレットで変えられるようにして...
-消しゴム機能を追加してください
-ウィンドウの大きさを変えても絵が消えてしまわないようにする
(ダブルバッファを使う)
*** 機能拡張:以下のことができれば加点します [#ibf935ab]
-絵や写真のファイルを取り込めるようにする
-いろいろな効果のペンを作る(たとえばペンの動きに従って文...
-絵をファイルへ書き出す機能を作る
-他の絵データをスタンプのように押す機能
-コピーアンドペースト(難しいと思いますが)
-undo (やりなおし、一つ前に行った操作のキャンセル)(結構...
-メニューバーだけでなく、スライダ、ボタン、別ウィンドウ(...
-そのほか、世の中のお絵描きプログラムにありそうな機能を実...
機能拡張の詳細はSimpleDrawの
//-http://is.ocha.ac.jp/~siio/index.php?SimpleDraw#extra
- http://is.ocha.ac.jp/~siio/index.php?LectureMMP09#extra
を見てください。上のページでは、
-機能の拡充
-使いやすさの追求
の2通りの拡張を書いてあります。どちらの方針で進めていただ...
説明書に、工夫したところを書いておいてください。
*** 取扱説明書の作り方 [#j3398d0e]
-ApplicationsからMicrosoft Office 2011/Microsoft Wordもし...
-せっかくですので作った機能はぜんぶここで説明してください...
-スクリーンキャプチャした図も入れてください。図は次のよう...
--スクリーンキャプチャしたいところで、コマンド(リンゴマ...
--もしくは、コマンド(リンゴマーク)+シフト+4を押すとマ...
--もしくは、コマンド(リンゴマーク)+シフト+4を押し、さ...
--以上の操作で、デスクトップにピクチャファイルができます...
--もしくは、デスクトップのピクチャファイルをダブルクリッ...
-Control キーを押しながらキーボードショートカットを押すと...
-がんばったところ、大変だったところなどを書いていただいて...
-------------------
**2020年1月9日 [#n8f68fa5]
***宿題提出 [#s0b6149e]
[[こちら:http://is.ocha.ac.jp/~siio/index.php?LectureMMPH...
***お絵かきプログラム [#ff5bf25f]
最終課題のお絵かきプログラムについて説明します。
----------------
**2019年12月19日 [#ka00e5c5]
**(演習)上のお絵描きプログラムを改良してください [#m40056...
上のプログラムでは,描画するとゴミが出ます.
これを出ないように改良してください.
+上のプログラムでは、マウスポインターの位置と、描かれる線...
+上のプログラムでは,描画するとゴミが出ます. (前回描き...
一筆書きを解消するヒント
-マウスのクリックで線を引く最初の座標を指定します.
--マウスのクリックを受け取れるようにMouse Listenerもimple...
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/awt/ev...
//http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/...
このプログラムのjavaとclassファイルをフォルダに入れて,学...
**Eclipseを使ってみよう [#vf7b5de5]
http://gyazo.com/4383db7fb81f9eacbf5cc959ff77a33d.png
便利です。ぜひ使ってみてください。タイプミスが激減するは...
-Eclipseの警告を消す方法
private static final long serialVersionUID = 42L;
という変数を定義しておきます。
-----------
** 線を引く簡単なプログラム [#pac2b7d5]
JPanelのサブクラスを作りました。
import javax.swing.JPanel;
import java.awt.Graphics;
public class DrawPanel extends JPanel {
public void drawLine(int x1, int y1, int x2, int y2){
Graphics g = this.getGraphics();
g.drawLine(x1, y1, x2, y2);
}
}
こちらはメインのプログラム。JFrameのサブクラスで、これに...
リスナーになっているので、こちらでマウスなどのイベントを...
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
public class SimpleDraw extends JFrame implements MouseM...
int lastx=0, lasty=0, newx, newy;
DrawPanel panel;
public void mouseMoved(MouseEvent arg0) {
}
public void mouseDragged(MouseEvent arg0) {
newx=arg0.getX();
newy=arg0.getY();
panel.drawLine(lastx,lasty,newx,newy);
lastx=newx;
lasty=newy;
}
private void init() {
this.setTitle("Simple Draw");
this.setSize(300, 200);
this.addMouseMotionListener(this);
panel=new DrawPanel();
this.getContentPane().add(panel);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SimpleDraw frame=new SimpleDraw();
frame.init();
}
}
----------------
***マウスイベント [#cc8c3961]
マウスイベントを受け取るには、Mouse ListenerやMouse Motio...
以下のようにするとイベントをうけとれるます。
まずはMouse Motion Listenerを試してみましょう。
マニュアル
- https://docs.oracle.com/javase/jp/8/docs/api/java/awt/e...
によると、実装しないといけないメソッドはmouse Draggedとmo...
- void mouseDragged(MouseEvent e)
コンポーネント上でマウス・ボタンを押してドラッグすると呼...
- void mouseMoved(MouseEvent e)
ボタンを押さずにマウス・カーソルをコンポーネント上に移動...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class MouseTest extends JFrame implements MouseMo...
public void mouseDragged(MouseEvent e) {
System.out.println("mouse dragged!");
}
public void mouseMoved(MouseEvent e) {
System.out.println("mouse moved!");
}
public static void main(String[] args) {
MouseTest test = new MouseTest();
test.setTitle("MouseTest");
test.addMouseMotionListener(test);
test.setSize(400,300);
test.setVisible(true);
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
次に、Mouse Listenerも実装してみましょう。マニュアル
- https://docs.oracle.com/javase/jp/7/api/java/awt/event/...
によると、
- void mouseClicked(MouseEvent e)
コンポーネント上でマウスボタンをクリック (押してから離す)...
- void mouseEntered(MouseEvent e)
コンポーネントにマウスが入ると呼び出されます。
- void mouseExited(MouseEvent e)
コンポーネントからマウスが出ると呼び出されます。
- void mousePressed(MouseEvent e)
コンポーネント上でマウスボタンが押されると呼び出されます。
- void mouseReleased(MouseEvent e)
コンポーネント上でマウスボタンが離されると呼び出されます。
これを追加します。宣言で
public class MouseTest extends JFrame implements MouseLi...
として、またmainに
test.addMouseListener(test);
を追加します。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class MouseTest extends JFrame implements MouseLi...
public void mouseClicked(MouseEvent e) {
System.out.println("mouse clicked!");
}
public void mouseEntered(MouseEvent e) {
System.out.println("mouse entered!");
}
public void mouseExited(MouseEvent e) {
System.out.println("mouse exited!");
}
public void mousePressed(MouseEvent e) {
System.out.println("mouse pressed!");
}
public void mouseReleased(MouseEvent e) {
System.out.println("mouse released!");
}
public void mouseDragged(MouseEvent e) {
System.out.println("mouse dragged!");
}
public void mouseMoved(MouseEvent e) {
System.out.println("mouse moved!");
}
public static void main(String[] args) {
MouseTest test = new MouseTest();
test.setTitle("MouseTest");
test.addMouseListener(test);
test.addMouseMotionListener(test);
test.setSize(400,300);
test.setVisible(true);
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
マウスイベントが発生した時のマウスの座標を知ることもでき...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class MouseTest extends JFrame implements MouseLi...
public void mouseClicked(MouseEvent e) {
System.out.println("mouse clicked!");
}
public void mouseEntered(MouseEvent e) {
System.out.println("mouse entered!");
}
public void mouseExited(MouseEvent e) {
System.out.println("mouse exited!");
}
public void mousePressed(MouseEvent e) {
System.out.println("mouse pressed!");
}
public void mouseReleased(MouseEvent e) {
System.out.println("mouse released!");
}
public void mouseDragged(MouseEvent e) {
System.out.println("mouse dragged to " + e.getX() + "...
}
public void mouseMoved(MouseEvent e) {
System.out.println("mouse moved!");
}
public static void main(String[] args) {
MouseTest test = new MouseTest();
test.setTitle("MouseTest");
test.addMouseListener(test);
test.addMouseMotionListener(test);
test.setSize(400,300);
test.setVisible(true);
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
-----------------
***項目をリストする [#m5682174]
コピペして動かしてみてください。
#ref(LectureMMP07/list.png)
import java.awt.*;
import javax.swing.*;
public class JListSample extends JFrame {
JListSample(String title) {
setTitle(title);
String[] data = {"Iced Coffee", "Iced Tea...
JList<String> list = new JList<String>(d...
JScrollPane scroll = new JScrollPane(list);
scroll.setPreferredSize(new Dimension(200...
JPanel panel = new JPanel();
Container container = getContentPane();
container.add(scroll);
}
public static void main(String[] args) {
JListSample sample = new JListSample("Lis...
sample.pack();
sample.setVisible(true);
sample.setDefaultCloseOperation(JFrame.EX...
}
}
***メニューバーを出す [#v6405eed]
http://gyazo.com/dd4e103c011682b3a78b9ed0c8d5134b.png
まずはシンプルなプルダウンメニューを作ってみましょう。
このプログラムは何もしません。
http://is.ocha.ac.jp/~siio/gyazo/JMenuSample1.png
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class JMenuSample extends JFrame implements Actio...
public void initialize() {
this.setTitle("MenuSample");
JMenuBar menubar = new JMenuBar();
JMenu menu = new JMenu("menu");
JMenuItem item1 = new JMenuItem("Sandwiches");
JMenuItem item2 = new JMenuItem("Side Orders");
JMenuItem item3 = new JMenuItem("Drinks");
menu.add(item1);
menu.add(item2);
menu.add(item3);
menubar.add(menu);
this.setJMenuBar(menubar);
this.setSize(400,200);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e){
}
public static void main(String[] args) {
JMenuSample sample = new JMenuSample();
sample.initialize();
}
}
メニューにはメニューを追加することもできます。
上でitem3をメニューに変更すると、これにitemを追加できます。
http://is.ocha.ac.jp/~siio/gyazo/JMenuSample2.png
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class JMenuSample extends JFrame implements Actio...
public void initialize() {
this.setTitle("MenuSample");
JMenuBar menubar = new JMenuBar();
JMenu menu = new JMenu("menu");
JMenuItem item1 = new JMenuItem("Sandwiches");
JMenuItem item2 = new JMenuItem("Side Orders");
JMenu item3 = new JMenu("Drinks");
menu.add(item1);
menu.add(item2);
menu.add(item3);
JMenuItem subitem1 = new JMenuItem("Iced Coffee");
JMenuItem subitem2 = new JMenuItem("Iced Tea");
item3.add(subitem1);
item3.add(subitem2);
menubar.add(menu);
this.setJMenuBar(menubar);
this.setSize(400,200);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e){
}
}
public static void main(String[] args) {
JMenuSample sample = new JMenuSample();
sample.initialize();
}
}
それぞれのitemに、フレーム自身をaction Listenerとして登録...
ここでは、メニューアイテムにcommandという情報をつけて、Ac...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class JMenuSample extends JFrame implements Actio...
public void initialize() {
this.setTitle("MenuSample");
JMenuBar menubar = new JMenuBar();
JMenu menu = new JMenu("menu");
JMenuItem item1 = new JMenuItem("Sandwiches");
item1.addActionListener(this);
item1.setActionCommand("Sandwiches");
JMenuItem item2 = new JMenuItem("Side Orders");
item2.addActionListener(this);
item2.setActionCommand("Side Orders");
JMenu item3 = new JMenu("Drinks");
menu.add(item1);
menu.add(item2);
menu.add(item3);
JMenuItem subitem1 = new JMenuItem("Iced Coffee");
subitem1.addActionListener(this);
subitem1.setActionCommand("Iced Coffee");
JMenuItem subitem2 = new JMenuItem("Iced Tea");
subitem2.addActionListener(this);
subitem2.setActionCommand("Iced Tea");
item3.add(subitem1);
item3.add(subitem2);
menubar.add(menu);
this.setJMenuBar(menubar);
this.setSize(400,200);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e){
String command = e.getActionCommand();
if(command != null){
System.out.println(command);
}
}
public static void main(String[] args) {
JMenuSample sample = new JMenuSample();
sample.initialize();
}
}
***演習:メニューを色々追加してみてください。(メニュー項...
//演習ができそうにないという人は、飛ばして、次に進んでく...
http://gyazo.com/2d9c3b6534e7b87fcd3ec22be00d5fed.png
他のメニューの追加も試してみましょう。例えばお支払いメニ...
http://is.ocha.ac.jp/~siio/gyazo/JMenuSample3.png
***Color Chooserを使う [#g2bdfc10]
次をコピペして動かしてみてください。色を選択するパネルが...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class JColorChooserSample extends JFrame implemen...
JButton button;
JColorChooserSample(String title){
setTitle(title);
button = new JButton("choose color");
button.addActionListener(this);
JPanel panel = new JPanel();
panel.add(button);
Container container = getContentPane();
container.add(panel);
}
public void actionPerformed(ActionEvent e){
JColorChooser colorchooser = new JColorCh...
Color color = colorchooser.showDialog(thi...
//button.setBackground(color);
button.setForeground(color);
}
public static void main(String[] args){
JColorChooserSample sample = new JColorCh...
sample.pack();
sample.setVisible(true);
sample.setDefaultCloseOperation(JFrame.EX...
}
}
**2019年12月12日 [#e418d9e5]
***テキストフィールドを使う [#x3cf24f2]
次のプログラムは、テキストフィールド2個とボタン1個を表示...
動作を確認してください。テキストフィールドに文字を入れて...
イベントハンドラーが全く実装されていないので、ボタンを押...
#ref(LectureMMP07/textfield1.png)
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class JTextFieldSample extends JFrame {
JButton button;
JTextField textleft, textright;
public void initialize() {
button = new JButton("left to right");
textleft= new JTextField(10);
textright= new JTextField(10);
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(textleft, BorderLayout.WEST);
panel.add(textright, BorderLayout.EAST);
panel.add(button, BorderLayout.SOUTH);
this.getContentPane().add(panel);
this.setTitle("JTextFieldSample");
this.pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLO...
this.setVisible(true);
}
public static void main(String[] args){
JTextFieldSample sample = new JTextFieldSample();
sample.initialize();
}
}
演習:このプログラムで、left to rightボタンを押した時に、...
ヒント:JTextFieldのマニュアルを見て、テキストをゲットし...
#ref(LectureMMP07/textfield1.png)
https://docs.oracle.com/javase/jp/8/docs/api/index.html
ヒント:
getText()とsetText("xxx")を使います。
解答例:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class JTextFieldSample extends JFrame implements ...
JButton button;
JTextField textleft, textright;
public void initialize() {
button = new JButton("left to right");
button.addActionListener(this);
textleft= new JTextField(10);
textright= new JTextField(10);
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(textleft, BorderLayout.WEST);
panel.add(textright, BorderLayout.EAST);
panel.add(button, BorderLayout.SOUTH);
this.getContentPane().add(panel);
this.setTitle("JTextFieldSample");
this.pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLO...
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
textright.setText(textleft.getText());
textleft.setText("");
}
public static void main(String[] args){
JTextFieldSample sample = new JTextFieldSample();
sample.initialize();
}
}
演習:このプログラムに、右のテキストフィールドをクリアす...
https://i.gyazo.com/999f1e766551a994186cc3d159bde0bf.png
ヒント:4個のアイテムをパネルにつけることになります。2 x ...
panel.setLayout(new GridLayout(2,2));
この後、テキストフィールドとボタンをaddしていけば、左上か...
本日のレポート:クリアボタンのあるテキストフィールドサン...
解答例:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class JTextFieldSample extends JFrame implements ...
JButton button, clearButton;
JTextField textleft, textright;
public void initialize() {
button = new JButton("left to right");
button.addActionListener(this);
clearButton = new JButton("clear");
clearButton.addActionListener(this);
textleft= new JTextField(10);
textright= new JTextField(10);
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(2,2));
panel.add(textleft);
panel.add(textright);
panel.add(button);
panel.add(clearButton);
this.getContentPane().add(panel);
this.setTitle("JTextFieldSample");
this.pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLO...
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==(button)){
textright.setText(textleft.getText());
textleft.setText("");
}else{
textright.setText("");
}
}
public static void main(String[] args){
JTextFieldSample sample = new JTextFieldSample();
sample.initialize();
}
}
---------------
**第13章 様々なコンポーネントとレイアウト [#qb662dcc]
***複雑なボタンの配置例 [#g43d30cb]
ボタンを多数配置した例です。
#ref(LectureMMP07/complicated.png)
下がプログラムです。動かしてみましょう。長いのでコピペし...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class ComplicatedLayoutSample extends JFrame impl...
public void initialize() {
JPanel panel1 = new JPanel();
JPanel panel2= new JPanel();
JPanel panel3= new JPanel();
JPanel panel4= new JPanel();
JPanel panel5= new JPanel();
panel1.setLayout(new FlowLayout());
for (int i=1; i<=3; i++) {
JButton btn = new JButton("NORTH" + i);
btn.addActionListener(this);
panel1.add(btn);
}
panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXI...
for (int i=1; i<=3; i++) {
JButton btn = new JButton("WEST" + i);
btn.addActionListener(this);
panel2.add(btn);
}
panel3.setLayout(new GridLayout(3,2));
for (int i=1; i<=6; i++) {
JButton btn = new JButton("CENTER" + i);
btn.addActionListener(this);
panel3.add(btn);
}
panel4.setLayout(new BorderLayout());
JButton btn1 = new JButton("EAST1");
btn1.addActionListener(this);
panel4.add(btn1, BorderLayout.NORTH);
JButton btn2 = new JButton("EAST2");
btn2.addActionListener(this);
panel4.add(btn2, BorderLayout.SOUTH);
panel5.setLayout(new BoxLayout(panel5, BoxLayout.X_AXI...
for (int i=1; i<=4; i++) {
JButton btn = new JButton("SOUTN" + i);
btn.addActionListener(this);
panel5.add(btn);
}
Container container = this.getContentPane();
container.add(panel1,BorderLayout.NORTH);
container.add(panel2,BorderLayout.WEST);
container.add(panel3,BorderLayout.CENTER);
container.add(panel4,BorderLayout.EAST);
container.add(panel5,BorderLayout.SOUTH);
this.setSize(400,200);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
System.out.println( ((JButton)e.getSource()).getText()...
}
public static void main(String[] args) {
ComplicatedLayoutSample cls = new ComplicatedLayoutSam...
cls.initialize();
}
}
コピペしてしまいましたが、動作はしっかり確認しましょう。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class ComplicatedLayoutSample extends JFrame impl...
Action ListenerをインプレメントしたJFrameサブクラスです。
public void initialize() {
JPanel panel1 = new JPanel();
JPanel panel2= new JPanel();
JPanel panel3= new JPanel();
JPanel panel4= new JPanel();
JPanel panel5= new JPanel();
5個のパネルを用意しています。動作例を見るとわかりますが、...
panel1.setLayout(new FlowLayout());
for (int i=1; i<=3; i++) {
JButton btn = new JButton("NORTH" + i);
btn.addActionListener(this);
panel1.add(btn);
}
最初のパネルは、「北側」に貼り付けるパネルです。(ウィン...
ここにNORTH + 番号の名前のボタンを3個作り、アクションリス...
panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXI...
for (int i=1; i<=3; i++) {
JButton btn = new JButton("WEST" + i);
btn.addActionListener(this);
panel2.add(btn);
}
panel3.setLayout(new GridLayout(3,2));
for (int i=1; i<=6; i++) {
JButton btn = new JButton("CENTER" + i);
btn.addActionListener(this);
panel3.add(btn);
}
panel4.setLayout(new BorderLayout());
JButton btn1 = new JButton("EAST1");
btn1.addActionListener(this);
panel4.add(btn1, BorderLayout.NORTH);
JButton btn2 = new JButton("EAST2");
btn2.addActionListener(this);
panel4.add(btn2, BorderLayout.SOUTH);
panel5.setLayout(new BoxLayout(panel5, BoxLayout.X_AXI...
for (int i=1; i<=4; i++) {
JButton btn = new JButton("SOUTN" + i);
btn.addActionListener(this);
panel5.add(btn);
}
西側パネル、中央パネル、東側パネル、南側パネルにボタンを...
Container container = this.getContentPane();
container.add(panel1,BorderLayout.NORTH);
container.add(panel2,BorderLayout.WEST);
container.add(panel3,BorderLayout.CENTER);
container.add(panel4,BorderLayout.EAST);
container.add(panel5,BorderLayout.SOUTH);
次に、フレームのコンテナーを取り寄せて、これに五枚のパネ...
this.setSize(400,200);
this.setVisible(true);
}
あとはサイズを調整しているだけです。
public void actionPerformed(ActionEvent e) {
System.out.println( ((JButton)e.getSource()).getText()...
}
イベントリスナーのためのメソッドです。ボタンに書かれた名...
public static void main(String[] args) {
ComplicatedLayoutSample cls = new ComplicatedLayoutSam...
cls.initialize();
}
}
こちらはいつものメインプログラムです。
-----------------
***ボタンのレイアウト [#v426213f]
#ref(LectureMMP06/5buttons.png)
以下のプログラムで5個のボタンをレイアウトできます。
パネルに、Border Layourのインスタンスを設定しています。
また、パネルにaddする時に、Border Layoutクラスのクラス変...
これで東西南北中央に配置されます。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class BorderLayoutSample extends JFrame {
public void initialize() {
this.setTitle("Simple Window");
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(new JButton("WEST"),BorderLayou...
panel.add(new JButton("CENTER"),BorderLay...
panel.add(new JButton("EAST"),BorderLayou...
panel.add(new JButton("NORTH"),BorderLayo...
panel.add(new JButton("SOUTH"),BorderLayo...
Container container = this.getContentPane...
container.add(panel);
this.pack();
setDefaultCloseOperation(JFrame.EXIT_ON_C...
setVisible(true);
}
public static void main (String args[]) {
BorderLayoutSample f = new BorderLayoutSa...
f.initialize();
}
}
演習:このプログラムがボタンのイベントを処理するように変...
#ref(LectureMMP06/borderlayout.png)
ヒント:
((JButton)e.getSource()).getText()
でボタンの文字を取得できます。
解答例:
イベントハンドラーでボタンの名前を表示しています。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class BorderLayoutSample extends JFrame implement...
public void initialize() {
JButton[] button;
this.setTitle("Simple Window");
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
button = new JButton[5];
panel.add(button[0]=new JButton("WEST"),B...
panel.add(button[1]=new JButton("CENTER")...
panel.add(button[2]=new JButton("EAST"),B...
panel.add(button[3]=new JButton("NORTH"),...
panel.add(button[4]=new JButton("SOUTH"),...
for(int i=0; i < button.length; i++) {
button[i].addActionListener(this);
}
Container container = this.getContentPane...
container.add(panel);
this.pack();
setDefaultCloseOperation(JFrame.EXIT_ON_C...
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
System.out.println(((JButton)e.getSource(...
}
public static void main (String args[]) {
BorderLayoutSample f = new BorderLayoutSa...
f.initialize();
}
}
解答例2:
イベントハンドラーでボタンに割り当てられたコマンドを表示...
上記の例よりは複雑ですが、コマンドを使うメリットはありま...
この例ではメリットを活かせていませんが、
コマンドを割り当てると、ボタンの名前を変更しても影響が出...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class BorderLayoutSample extends JFrame implement...
public void initialize() {
JButton[] button;
this.setTitle("Simple Window");
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
button = new JButton[5];
panel.add(button[0]=new JButton("WEST"),B...
panel.add(button[1]=new JButton("CENTER")...
panel.add(button[2]=new JButton("EAST"),B...
panel.add(button[3]=new JButton("NORTH"),...
panel.add(button[4]=new JButton("SOUTH"),...
for(int i=0; i < button.length; i++) {
button[i].addActionListener(this);
button[i].setActionCommand(button...
}
Container container = this.getContentPane...
container.add(panel);
this.pack();
setDefaultCloseOperation(JFrame.EXIT_ON_C...
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
System.out.println(e.getActionCommand());
}
public static void main (String args[]) {
BorderLayoutSample f = new BorderLayoutSa...
f.initialize();
}
}
演習:このプログラムを参考にして、
上で作った二つのボタンのプログラム、Simple Buttonに対して...
演習のヒント
bt1 = new JButton("button1");
bt2 = new JButton("button2");
panel.setLayout(new FlowLayout(FlowLayout.RIGHT));
// bt1.setActionCommand("this is b1");
// bt2.setActionCommand("this is b2");
FlowLayoutにはCENTER, LEFT, RIGHTなどの揃え方の指定があり...
panel.setLayout(new FlowLayout(FlowLayout.CENTER));
panel.setLayout(new FlowLayout(FlowLayout.LEFT));
------------------
演習:button2のAction Listenerとしても、自分自身を登録し...
button2.addActionListener(this);
この結果、button1でもbutton2でも、どちらも押されればHello...
***Actionの識別 [#s45f3f97]
button1を押した時はHelloと表示され、button2を押した時はGo...
http://gyazo.com/67d27d0588f4dd5d11410e1107165994.png
ボタンごとに違うインスタンスをadd Action Listenerで追加す...
今回の例のように同じインスタンス(ここではthis)をリスナ...
このメソッドで受け取る引数はActio Eventのインスタンスです。
このインスタンスは、発生したイベントの情報を持っています。
Action Eventにはどういうインスタンス変数・メソッドがある...
https://docs.oracle.com/javase/jp/8/docs/api/index.html
今回は、この中のget Source()メソッドを使いましょう。
このメソッドで、イベントを発生したインスタンスがわかりま...
正確には、イベントを発生したインスタンスへの参照がわかり...
なので、それがbutton1だったのか、button2だったのかをif文...
その結果、HelloかGoodbyeを表示すれば良いです。
ただし、今のプログラムでは、変数button1, button2はinitial...
ヒント(最初の6行です)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SimpleButton extends JFrame implements Acti...
JButton button1, button2;
public void initialize () {
演習:このヒントを元に、button1を押した時はHelloと表示さ...
解答例:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SimpleButton extends JFrame implements Acti...
JButton button1, button2;
public void initialize () {
this.setTitle("私が作った最初の窓");
JPanel panel = new JPanel();
button1 = new JButton("button1");
button2 = new JButton("button2");
button1.addActionListener(this);
button2.addActionListener(this);
panel.add(button1);
panel.add(button2);
Container container = this.getContentPane();
container.add(panel);
this.pack();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed (ActionEvent e) {
if(e.getSource()==button1)
System.out.println("Hello");
else
System.out.println("Goodbye");
}
public static void main(String argv[]) {
SimpleButton sw = new SimpleButton();
sw.initialize();
}
}
ここではボタンを区別するために、インスタンス(への参照)...
一つは、ボタンのテキスト(ボタンの上に表示されている文字...
ボタンのテキストは、get Text()メソッドで入手できます。
以下のように変更すると、ボタンのテキストが表示されるよう...
ボタンに、HelloとGoodbyeを表示しておけば、それらが表示さ...
ボタンのテキストを文字列比較して、処理を変えることも可能...
public void actionPerformed(ActionEvent e){
System.out.println(((JButton)e.getSource...
}
もう一つは、ボタンにコマンドを書く方法です。
ボタンにsetActionCommand(String)を定義しておくと、getActi...
例えば、
button1.setActionCommand("hello");
としておけば、actionPerformedの中で
e.getActionCommand();
で文字列を得られます。なので、例えば、
public void actionPerformed(ActionEvent e){
System.out.println(e.getActionCommand());
}
でコマンド部分を印刷できます。コマンドを文字列比較して、...
---------
**2019年12月5日 [#r6c560a9]
**第12章 Swing [#n78c2cf0]
SwingはJavaのパッケージで、GUIを構築するための数多くのcla...
***歴史(AWTとの違い) [#f1351d32]
初期のJavaでは、AWT (Abstract Window Toolkit) というパッ...
***クラスJFrame [#t7348676]
まずはJFrameというSwingのクラスを使います。Frameは枠のこ...
JはJavaのJです。
以下のリンクからJFrameクラスを選択して、何ができるかざっ...
https://docs.oracle.com/javase/jp/8/docs/api/index.html
- 次に簡単なウィンドウを出してみましょう。
授業の最初で作ったウィンドウを出すプログラムです。
import javax.swing.JFrame;
public class SimpleWindow {
public static void main(String argv[]) {
JFrame f = new JFrame("私が作った最初の窓...
f.setSize(200,100);
f.setVisible(true);
}
}
このままだと、ウィンドウを閉じてもプログラムは終了しませ...
ウィンドウを閉じた時に、プログラムを終了するかしないかは...
ウィンドウを閉じるとプログラムが終了するようにしてみまし...
import javax.swing.JFrame;
public class SimpleWindow {
public static void main(String argv[]) {
JFrame f = new JFrame("私が作った最初の窓...
f.setSize(200,100);
f.setDefaultCloseOperation(JFrame.EXIT_ON...
f.setVisible(true);
}
}
このプログラムをよくみていきましょう。
mainの最初の行で、JFrameのコンストラクタを呼び出して、イ...
引数付きのコンストラクタを使っています。Stringの引数を使...
作ったインスタンスはJFrameを参照する変数 f に代入されてい...
mainの2行目では、JFrameのインスタンスメソッドであるsetSi...
mainの最後の行では、setVisible()メソッドを呼んでいます。...
*** JFrameを継承するプログラミング [#j767173a]
アプリケーションで使うウィンドウを作る時の流儀の一つに、...
import javax.swing.JFrame;
public class SimpleWindow extends JFrame {
public void initialize () {
this.setTitle("私が作った最初の窓");
this.setSize(200,100);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main (String argv[]) {
SimpleWindow sw = new SimpleWindow();
sw.initialize();
}
}
このプログラムでは、JFrameを継承して、サブクラスとしてSim...
なので、SimpleWindowのインスタンスは、JFrameの機能を全て...
別のプログラムからSimpleWindowのインスタンスを作って表示...
mainでは、自分自身のインスタンスを作って、それへの参照をs...
そしてinitialize()というインスタンスメソッドを呼んでいま...
initialize()は今の所SimpleWindowで新たに定義した唯一のメ...
その名の通り、自分自身の初期化を行うつもりで命名しました。
コンストラクタとして実装しても良いのですが、結構複雑な仕...
別のメソッドにしました。ちなみに、他のオブジェクト指向言...
newした後に、init()とかinitialize()とかのメソッドを呼ぶ方...
ここではそれを真似しました。
initialize()の中で、ウィンドウのタイトルを決めて、サイズ...
***ラベルを表示するウィンドウ [#dc55da2c]
このままではウィンドウが空っぽなので、文字を表示してみま...
文字を表示するクラスにJLabelがあります。その名の通りラベ...
以下のリンクからJLabelクラスを選択して、何ができるかざっ...
https://docs.oracle.com/javase/jp/8/docs/api/index.html
基本的な使い方は以下です。まずは、インスタンスを作ります...
JLabel label = new JLabel("Hello!");
ところで、JFrameで作ったインスタンスは、Containerというク...
Container content = this.getContentPane();
で、自分自身のコンテントペーンを返してくれます。
これに対して、上記で作ったラベルインスタンスをaddすること...
content.add(label);
上記の、継承を使ったプログラムによるウィンドウの中に、
Hello!という文字を出してみよう。
上で紹介した3行を、initialize()メソッドに加えれば文字を...
解答例:
import javax.swing.*;
import java.awt.*;
public class SimpleWindow extends JFrame {
public void initialize () {
this.setTitle("私が作った最初の窓");
JLabel label = new JLabel("Hello!");
Container content = this.getContentPane();
content.add(label);
this.setSize(200,100);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String argv[]) {
SimpleWindow sw = new SimpleWindow();
sw.initialize();
}
}
コンテンツの大きさに合わせてウィンドウサイズを変更する機...
上記のプログラムではsetSize()で変更していますが、これの代...
this.pack();
というメソッドを呼び出してみましょう。以下のようになるは...
http://gyazo.com/c6efe47de19436f7564660377fe8b98c.png
解答例:
import javax.swing.*;
import java.awt.*;
public class SimpleWindow extends JFrame {
public void initialize () {
this.setTitle("私が作った最初の窓");
JLabel label = new JLabel("Hello!");
Container content = this.getContentPane();
content.add(label);
this.pack();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String argv[]) {
SimpleWindow sw = new SimpleWindow();
sw.initialize();
}
}
***ボタンを1個表示するウィンドウ [#ied43afe]
今度はウィンドウにボタンを表示してみましょう。
ボタンなので、多分JButtonというクラスがありそうです。
以下から探して、何ができるかざっと見ておきましょう。
https://docs.oracle.com/javase/jp/8/docs/api/index.html
上記のプログラムのJLabelのところをJButtonにすればだいたい...
解答例:
import javax.swing.*;
import java.awt.*;
public class SimpleWindow extends JFrame {
public void initialize () {
this.setTitle("私が作った最初の窓");
JButton button = new JButton("Hello!");
Container content = this.getContentPane();
content.add(button);
this.pack();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String argv[]) {
SimpleWindow sw = new SimpleWindow();
sw.initialize();
}
}
***ボタンを2個表示するウィンドウ [#cb6cf696]
上のプログラムのように、
getContentPane()で得られたContainerに直接ボタンを貼付ける...
しかし、貼付けられるのは一つのボタンだけのようです。
2個以上のボタンを貼り付けるためには、JPanel(パネル、板...
これに複数のボタンを貼り付け(addする)、
そのパネルとJFrameのcontentに貼り付けます。
こんな感じのイメージです。
http://gyazo.com/03c28df2419065241b8736b7b69d7fd3.png
2個のボタンを出してみましょう。
手順としては、
+JPanelのインスタンスを作る(パネル)
+JButtonのインスタンスを2個作る(ボタン)
+パネルにボタンをadd()する
+JFrameのContent Paneを取り寄せる
+Content Paneにパネルをadd()する
です。(順番は多少前後しても構いません)
http://gyazo.com/4c3086ae9b6b5434d2ea741369f731c5.png
解答例:
import javax.swing.*;
import java.awt.*;
public class SimpleButton extends JFrame {
public void initialize () {
this.setTitle("私が作った最初の窓");
JPanel panel = new JPanel();
JButton button1 = new JButton("button1");
JButton button2 = new JButton("button2");
panel.add(button1);
panel.add(button2);
Container container = this.getContentPane();
container.add(panel);
this.pack();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String argv[]) {
SimpleButton sw = new SimpleButton();
sw.initialize();
}
}
***イベントハンドラー [#pdede994]
これからがGUIプログラミングの重要なところです。
GUIプログラミングでは、ユーザがマウスをクリックしたり、ボ...
現在のプログラムでは,ボタンを押しても何もおこりません.
ボタンが押されたイベントに対応するイベントハンドラーが無...
ボタンが押されたイベントを受け取るためには,
+Action Listenerをimplementしたクラスを作る
+そのインスタンスを作る
+これをボタンにaddActionListener()で登録する
必要があります.このインスタンスが、イベントを受け取るイ...
上の、ボタンが2つあるプログラムで、button1が押された時に...
ボタンのイベントを受け取るインスタンスは、新しく作成して...
ここではSimpleWindowから作ったインスタンスでイベントを受...
現在、SimpleWindowはJFrameを継承していますが、これに加え...
Action Listenerをインプレメントすることは、
Action Listenerが持っているメソッドを全て用意していますと...
この場合、そのメソッドは、actionPerformed()というメソッド...
なので、これを用意します。そこではHelloと表示することにし...
さらに、button1のAction Listenerとして、Simple Windowのイ...
これは、button1にアクションが発生したら、こちらのインスタ...
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SimpleButton extends JFrame implements Acti...
public void initialize () {
this.setTitle("私が作った最初の窓");
JPanel panel = new JPanel();
JButton button1 = new JButton("button1");
JButton button2 = new JButton("button2");
button1.addActionListener(this);
panel.add(button1);
panel.add(button2);
Container container = this.getContentPane();
container.add(panel);
this.pack();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed (ActionEvent e) {
System.out.println("Hello");
}
public static void main(String argv[]) {
SimpleButton sw = new SimpleButton();
sw.initialize();
}
}
これで、button1を押した時にHelloと表示されるようになりま...
button2を押しても、何もおきません。Action Listenerが登録...
***本日のレポート [#f632a648]
ボタンをクリックするとHelloと表示するプログラムのjavaとcl...
---------------
***http://www.ocha.ac.jp/の内容を表示するプログラムを書い...
http://gyazo.com/13044fdd9d372118a1f6fe93896eadb3.png
ヒント1
以下のリンクからURLクラスを選択して、調べましょう。
https://docs.oracle.com/javase/jp/8/docs/api/index.html
ヒント2
import java.net.*;
が必要です。
URL targetURL = new URL("http://www.ocha.ac.jp/");
でURLクラスのインスタンスが得られる。
InputStream istream = targetURL.openStream();
でこれからInputStreamのインスタンスが得られる。
InputStreamReader isreader = new InputStreamReader(istre...
でこれからInputStreamReaderのインスタンスが得られる。
BufferedReader breader = new BufferedReader( isreader );
でこれからBufferedReader のインスタンスが得られる。
ヒント3
import java.io.*;
import java.net.*;
public class URLTest {
public static void main (String argv[]) {
try {
ここにプログラムを書く
} catch (IOException e) {
System.out.println("error...");
}
}
}
ヒント4:
import java.io.*;
import java.net.*;
public class URLTest {
public static void main (String argv[]) {
try {
URL targetURL = new URL("http://www.ocha.ac.jp/");
InputStream istream = targetURL.openStream();
InputStreamReader isreader = new InputStreamReader(is...
BufferedReader breader = new BufferedReader( isreade...
ここで一行ずつ読み込む
} catch (IOException e) {
System.out.println("error...");
}
}
}
解答例:
import java.io.*;
import java.net.*;
public class URLTest {
public static void main (String argv[]) {
try {
URL targetURL = new URL("http://www.ocha.ac.jp/");
InputStream istream = targetURL.openStream();
InputStreamReader isreader = new InputStreamReader(is...
BufferedReader breader = new BufferedReader( isreade...
String line;
while((line=breader.readLine()) != null) System.out.p...
} catch (IOException e) {
System.out.println("error...");
}
}
}
***写真ファイルのダウンロード [#edb3e256]
http://is.ocha.ac.jp/~siio/cat.jpg
をダウンロードして、cat.jpgというファイルを作るプログラム...
データはテキストじゃなくて、バイナリーです。
ヒント1:
InputStreamのインスタンスに対してread()メソッドを使うと1...
1バイトのデータを書き出すなら、FileOutputStreamだけで可能...
ヒント2:
import java.io.*;
import java.net.*;
public class URLJpeg {
public static void main (String argv[]) {
try {
URL targetURL = new URL("http://is.ocha.ac.jp/~siio/c...
InputStream istream = targetURL.openStream();
FileOutputStream fout = new FileOutputStream("cat.jpg...
というインスタンスを作って、
istream.read()
で読んで、
fout.write(1バイト)
で書き出します。
解答例
import java.io.*;
import java.net.*;
//http://is.ocha.ac.jp/~siio/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログ...
public class URLJpeg {
public static void main (String argv[]) {
try {
URL targetURL = new URL("http://is.ocha.ac.jp/~siio/c...
InputStream istream = targetURL.openStream();
FileOutputStream fout = new FileOutputStream("cat.jpg...
int aData;
while((aData = istream.read()) != -1) fout.write(aDa...
istream.close();
fout.close();
} catch (IOException e) {
System.out.println("error...");
}
}
}
---------------------
**2019年11月28日:入出力 [#gc7c41bb]
**第11章 入出力 [#hb3a05b8]
**標準入出力 [#u09d26a5]
標準入出力には、
- キーボードからプログラムへの標準入力
- プログラムからディスプレイへの標準出力
- エラー出力
の3種類があります。これらはJavaのクラス変数として定義さ...
- System.in キーボードからプログラムへの標準入力
- System.out プログラムからディスプレイへの標準出力
- System.err エラー出力
それぞれの型は、
- System.in は Input Stream型
- System.out は Print Stream型
- System.err は Print Stream型
です。使えるメソッドはこちらで確認できます。
https://docs.oracle.com/javase/jp/8/docs/api/index.html
***標準入力から読み込んだ文字列をそのままディスプレイに表...
import java.io.*;
public class StandardIOTest {
public static void main(String[] args) {
try {
//System.inからInputStreamReaderを作り、それからBuffe...
InputStreamReader ireader = new InputStreamReader (Sy...
BufferedReader breaderK = new BufferedReader(ireader);
System.out.println("文字列を入力してリターンを押して...
String line = breaderK.readLine();
System.out.println("あなたが入力した文字列" + line);
}
catch(IOException e) {
System.out.println(e);
}
}
}
***演習 [#nd7bbb43]
キーボードから1行入力された文字列から writer.txtという名...
完成した人から、このプログラムのjavaとclassを出席番号+ロ...
//http://gyazo.com/f9aee7f492d574f870e85e2022df374c.png
e100:java siio$ java KeyToFile
Hello, これはテストです。
Hello, これはテストです。
e100:java siio$ cat writer.txt
Hello, これはテストです。
ヒント
import java.io.*;
public class KeyToFile {
public static void main(String[] args) {
try {
ここにプログラムを書く
}
catch(IOException e) {
System.out.println(e);
}
}
}
---------------------
**文字ストリーム [#x25291f2]
文字を読み書きするのが文字ストリームです。文字に適した処...
ReaderとWriterというクラスのグループがあります。
***文字列の書き出し [#a85525d6]
File Writerを使うと文字列を書き出すことができます。
close, flush, writeなどのメソッドがあります。
こちらで機能を確認しましょう。
https://docs.oracle.com/javase/jp/8/docs/api/index.html
また、Print Writerというクラスでは、System Out Printlnの...
Javaのいろいろなデータを書き出すのに便利です。
***printlnで書き出すプログラム [#efb2dbc9]
writer.txtというファイルに、
int x = 2020;
String s = "Multimedia Programming 実習";
というJavaの変数を、printlnで書き出すプログラムを作ってく...
//Print Writerをコンストラクトするためには、File Writerの...
import java.io.*;
public class PrintWriterTest{
public static void main(String[] args) {
try {
//writer.txtというファイルを作って文字を書き込む
PrintWriter pwriter = new PrintWriter("writer.txt");
pwriter.println(2020);
pwriter.println("Multimedia Programming 実習");
pwriter.close();
}
catch (IOException e) {
System.out.println(e);
}
}
}
作ったファイルを hexdump してみてください
$ hexdump writer.txt
0000000 32 30 32 30 0a 4d 75 6c 74 69 6d 65 64 69 61 20
0000010 50 72 6f 67 72 61 6d 6d 69 6e 67 20 e5 ae 9f e7
0000020 bf 92 0a
0000023
hexdump -cでキャラクタ表示にもなります。
$ hexdump -c writer.txt
0000000 2 0 2 0 \n M u l t i m e ...
0000010 P r o g r a m m i n g ...
0000020 ? 222 \n ...
0000023
2020という数値は、int型なのですが、ASCII文字列に変換され...
「Multimedia Programming 実習」は、もともとが文字列なので...
なので、文字列を書き出している部分は、File Writerの機能を...
import java.io.*;
public class PrintWriterTest{
public static void main(String[] args) {
try {
//writer.txtというファイルを作って文字を書き込む
FileWriter fwriter = new FileWriter("writer.txt");
PrintWriter pwriter = new PrintWriter(fwriter);
pwriter.println(2020);
//pwriter.println("Java教科書");
fwriter.write("Multimedia Programming 実習");
pwriter.close();
}
catch (IOException e) {
System.out.println(e);
}
}
}
***read Lineで改行コードまでを読み込む [#y3262833]
File ReaderはFile Writerと同様に文字列を読み込みます。
読み込む文字数を指定して読み込むことも可能です。
さらに便利なクラスがBuffered Readerで、こちらは改行文字ま...
こちらで機能を確認しましょう。
https://docs.oracle.com/javase/jp/8/docs/api/index.html
Buffered ReaderもFile Readerのインスタンスから作りますの...
writer.txtというテキストファイルがあるとして、これから1...
public class BufferedReaderTest{
public static void main(String[] args) {
try {
FileReader freader = new FileReader("writer.txt");
BufferedReader breader = new BufferedReader(freader);
String tmp;
while( (tmp=breader.readLine() ) != null) {
System.out.println(tmp);
}
breader.close();
}
catch (IOException e) {
System.out.println(e);
}
}
}
このプログラムを参考にして、
先のPrint Writer Testに書き足して、
書き込んだデータを読み出して画面に表示するプログラムを作...
ヒント:
import java.io.*;
public class PrintWriterTest{
public static void main(String[] args) {
try {
//writer.txtというファイルを作って文字を書き込む
PrintWriter pwriter = new PrintWriter("writer.txt");
pwriter.println(2020);
pwriter.println("Multimedia Programming 実習");
pwriter.close();
ここに書き足す
}
catch (IOException e) {
System.out.println(e);
}
}
}
解答例:
import java.io.*;
public class PrintWriterTest{
public static void main(String[] args) {
try {
//writer.txtというファイルを作って文字を書き込む
PrintWriter pwriter = new PrintWriter("writer.txt");
pwriter.println(2020);
pwriter.println("Multimedia Programming 実習");
pwriter.close();
//writer.txtのファイルの中身をSystem.out.printlnで表示...
FileReader freader = new FileReader("writer.txt");
BufferedReader breader = new BufferedReader(freader);
String tmp;
while( (tmp=breader.readLine() ) != null) {
System.out.println(tmp);
}
breader.close();
}
catch (IOException e) {
System.out.println(e);
}
}
}
---------------
Javaの入出力は、ファイル、ネットワーク、キーボード、ディ...
(ファイル、ネットワーク、キーボード)
|
| 入力ストリーム
|
V
(Javaプログラム)
|
| 出力ストリーム
|
V
(ファイル、ネットワーク、ディスプレイ)
**バイトストリーム [#h69eaef6]
データを入出力するのがバイトストリームです。
ここでは、
- File Output Stream
- Data Output Stream
- File Input Stream
- Data Input Stream
を使ってみます。
*** File Output Streamを使ってバイト単位で書き出し [#e74b...
こちらで機能を確認しましょう。
https://docs.oracle.com/javase/jp/8/docs/api/index.html
基本的なインスタンスメソッドは、writeとcloseです。writeに...
write(int b)
は、int型の引数の下位1バイトを書き出します。以下のプログ...
import java.io.*;
public class FoutTest {
public static void main(String[] args) {
try {
FileOutputStream fout = new FileOutputStream("fout.da...
fout.write(1234);
fout.close();
}
catch (IOException e) {
System.out.println(e);
}
}
}
これでfout.datという名前のファイルができあがるはずです。 ...
hexdump fout.dat
してみてください
$ hexdump fout.dat
0000000 d2
0000001
1234は0x4d2だったのでその下1バイトが書き込まれました。
***Data Output StreamでJava整数型データを出力する [#l6a1b...
こちらで機能を確認しましょう。
https://docs.oracle.com/javase/jp/8/docs/api/index.html
Javaのいろいろなデータ型を書き出すことができます。
int, long, short, float, double, booleanなどのデータを書...
以下では、int型データを書き出しています。
なお、Data Output StreamはFile Output Streamの機能を利用...
Data Output Streamのコンストラクトには、File Output Strea...
なので2段階のコンストラクト作業になります。
import java.io.*;
public class DoutTest {
public static void main (String[] args) {
try {
FileOutputStream fout = new FileOutputStream("dout.da...
DataOutputStream dout = new DataOutputStream(fout);
dout.writeInt(100);
dout.close();
}catch (Exception e) {
System.out.println(e);
}
}
}
これでdout.datという名前のファイルができあがるはずです。 ...
hexdump dout.dat
してみてください
e100:java siio$ hexdump dout.dat
0000000 00 00 00 64
0000004
int型は4バイトなので4バイトのファイルが出来上がっていま...
***整数を入出力する例 [#j899e2e7]
File/Data Output Streamにはそれぞれ対応したFile/Data Inpu...
こちらで機能を確認しましょう。
https://docs.oracle.com/javase/jp/8/docs/api/index.html
Javaのint型のデータで100をファイルに書いて、これを読み込...
import java.io.*;
public class DoutTest {
public static void main (String[] args) {
try {
FileOutputStream fout = new FileOutputStream("dout.da...
DataOutputStream dout = new DataOutputStream(fout);
dout.writeInt(100);
dout.close();
FileInputStream finput = new FileInputStream("dout.da...
DataInputStream dinput = new DataInputStream(finput);
System.out.println(dinput.readInt());
dinput.close();
}catch (Exception e) {
System.out.println(e);
}
}
}
***演習 [#c9909a95]
1から100までのint型の数値をwirteIntメソッドでファイルに書...
作ったファイルを
hexdump dout.dat
してみてください
解答例
import java.io.*;
public class DoutTest {
public static void main (String[] args) {
int i;
try {
FileOutputStream fout = new FileOutputStream ("dout.d...
DataOutputStream dout = new DataOutputStream(fout);
for(i=1;i<101;i++) dout.writeInt(i);
dout.close();
FileInputStream fin = new FileInputStream ("dout.dat");
DataInputStream din = new DataInputStream(fin);
for(i=1;i<101;i++) System.out.println(din.readInt());
din.close();
} catch (FileNotFoundException e) {
System.out.println(e);
} catch (IOException e) {
System.out.println(e);
}
}
}
-------------
**2019年11月21日: エラー、String、コレクション[#mf116c61]
***本日のレポート [#n970e36c]
EtoJ.javaとEtoJ.classを出席番号+名前のフォルダーにコピー...
***Hash Map [#ac67b323]
https://docs.oracle.com/javase/jp/8/docs/api/index.html
2つのインスタンスのマッッピング(対応付け)の集まりを保持...
import java.util.*;
public class EtoJ{
public static void main(String args[]) {
HashMap<String,String> map = new HashMap<String,String>...
map.put("apple","りんご");
map.put("banana","バナナ");
...
}
}
このプログラムで、mapインスタンスからkeyに対応するvalueを...
map.get("apple");
などとします。
このプログラムを拡張して、以下のように動作する英語ー日本...
[e100:?/Documents/java] siio% java EtoJ banana
バナナ
[e100:?/Documents/java] siio% java EtoJ apple
りんご
[e100:?/Documents/java] siio% java EtoJ
Please input an English word
------------
***Hash Set [#h59a37b5]
https://docs.oracle.com/javase/jp/8/docs/api/index.html
Linked Listと同様にインスタンスの集まりを保持するデータ構...
(element 1) ---> (element 2) ---> (element 3) ---> ... (...
だだし、同一要素を重複して保持しません。
import java.util.*;
public class HashSetTest{
public static void main(String args[]){
HashSet<String> set = new HashSet<String>();
String name1="Alice";
String name2="Bob";
String name3="Cindy";
//setにname1をaddしてください
//setにname2をaddしてください
//setにname3をaddしてください
//setに再びname1をaddしてみてください。その時の戻り値 (b...
//setの内容をIteratorを使って全部表示してください。
}
}
解答例:
import java.util.*;
public class HashSetTest{
public static void main(String args[]){
HashSet<String> set = new HashSet<String>();
String name1="Alice";
String name2="Bob";
String name3="Cindy";
//name1,2,3を追加
set.add(name1);
set.add(name2);
set.add(name3);
//name1の再度追加を試みる。失敗
System.out.println(set.add(name1));
Iterator it = set.iterator();
while(it.hasNext())
System.out.println(it.next());
}
}
***Linked List [#n28a2bc2]
https://docs.oracle.com/javase/jp/8/docs/api/index.html
要素があって、次の要素へのポインターを持っているような、...
(element 1) ---> (element 2) ---> (element 3) ---> ... ...
次のプログラムを作ってLinked Listのメソッドを使ってみまし...
定義とコンストラクタで<String>と書くのは、要素がStringの...
昔のJavaでは不要だったのですが、今のバージョンではこのよ...
import java.util.*;
public class LinkedListTest{
public static void main(String[] args) {
LinkedList<String> list = new LinkedList...
String name1="ALICE";
String name2="BOB";
//listにname1をaddしてください
//listにname2をaddしてください
//listの要素数を取得して表示してください
//listから最初の要素をgetFirstで取り出して表示してください
//listからget(1)してその結果を表示してください
String name3="CINDY";
String name4="DAVE";
//listにname3をaddしてください。
//listからname1を削除してください(remove)
//listにname4をaddFirstしてください。
//この結果、"DAVE" --> "BOB" --> "CINDY"となると思います。
//listの全要素にアクセスするには、Iteratorインスタンスを...
//以下のようにして全要素を表示してください。
Iterator it = list.iterator();
while(it.hasNext()) {
String st = (String)it.next();
System.out.println(st);
}
//toArrayメソッドで配列を作ることもできます
//以下のようにして全要素を表示してください。
Object[] names = list.toArray();
for(Object s: names) System.out.println(s);
}
}
解答例:
Import java.util.*;
public class LinkedListTest{
public static void main(String args[]){
LinkedList<String> list = new LinkedList<String>();
String name1 = "ALICE";
String name2 = "BOB";
list.add(name1);
list.add(name2);
System.out.println(list.size());
System.out.println(list.getFirst());
System.out.println(list.get(1));
String name3 = "CINDY";
String name4 = "DAVE";
list.add(name3);
list.remove(name1);
list.addFirst(name4);
Iterator it = list.iterator();
while(it.hasNext()) System.out.println(it.next());
Object[] names = list.toArray();
for(Object s: names) System.out.println(s);
}
}
解答例(丁寧版):
import java.util.*;
public class LinkedListTest{
public static void main(String[] args) {
LinkedList<String> list = new LinkedList...
String name1="ALICE";
String name2="BOB";
list.add(name1);
list.add(name2);
String firstname=list.getFirst();
String secondname=list.get(1);
System.out.println("listの要素数は" + li...
System.out.println("listの最初の要素は" ...
String name3="CINDY";
String name4="DAVE";
list.add(name3);
list.remove(name1);
list.addFirst(name4);
Iterator it = list.iterator();
System.out.println("要素の走査");
while(it.hasNext()){
String st = (String)it.next();
System.out.println(st);
}
System.out.println("要素の走査 by toArra...
Object[] names = list.toArray();
for(Object s: names) System.out.println(...
}
}
----------
**第10章 Stringクラスとコレクションフレームワーク [#w938...
以下のリンクからStringクラスを選択して、何ができるかざっ...
https://docs.oracle.com/javase/jp/8/docs/api/index.html
***Stringのメソッドをいくつか使ってみましょう [#v7994c3d]
public class TestString {
public static void main (String argue[]) {
String str = "Hello Java World";
//このstrを表示してください(System out.printlnを使...
//strの長さを表示してください(.lengthを使う))
//strの3要素目の文字を表示してください
//最初にaが現れる位置を表示してください
//最後の文字aが現れる位置を表示してください
//辞書式で比較してstrと次のstr2のどちらが先に現れる...
String str2="Hello World";
//strの6要素目から始まる部分文字列を作り表示して表示...
//int型をString型に変換してください。
int v2020=2020;
String s2020 = String.valueOf(v2020);
}
}
解答例:
public class TestString{
public static void main(String args[]){
String str = "Hello Java World";
System.out.println(str);
System.out.println(str.length());
System.out.println(str.charAt(3));
System.out.println(str.indexOf('a'));
String str2 = "Hello World";
System.out.println(str.compareTo(str2));
System.out.println(str2.compareTo(str));
System.out.println(str.substring(6));
int v2020=2020;
String s2020 = String.valueOf(v2020);
System.out.println(s2020);
}
}
***最初の引数(文字列)を表示するプログラムを作る。クラス...
public class TestString {
public static void main(String argv[]) {
System.out.println(argv[0]);
}
}
***演習1:最初の引数(文字列)を逆に出力するプログラムを...
[e100:?/Documents/java] siio% java TestString ochanomizu
ochanomizu
uzimonahco
[e100:?/Documents/java] siio%
さらには、引数がない場合は引数入力を促すことを表示してみ...
[e100:?/Documents/java] siio% java TestString
please input a word
[e100:?/Documents/java] siio%
解答例:
public class TestString {
public static void main (String argv[]) {
try{
System.out.println(argv[0]);
int len = argv[0].length();
for(int i = len - 1; i>=0; i--) {
System.out.print(argv[0].charAt(i));
}
System.out.println();
}
catch (Exception e) {
System.out.println("please input a word");
}
}
}
----------
C言語では、エラーが出そうな処理をする場合は、エラーが発生...
現代的な言語では、プログラムの処理をブロックでまとめて、...
Javaの多くのメソッドが標準的なエラー処理をサポートしてい...
次のプログラムを作って試してください。
引数が2個あることを前提としています。
なので、引数が少ないとエラーが出ます。確認してください。
public class TestException {
public static void main(String argv[]){
System.out.println(argv[0]+" "+argv[1]);
System.out.println("Nice to meet you.");
}
}
エラーが出る可能性のある場所をtryでくくっておき、
エラーが出たらそれを捕捉する処置をcatchで指定します。
public class TestException {
public static void main(String argv[]){
try{
System.out.println(argv[0]+" "+argv[1]);
System.out.println("Nice to meet you.");
}
catch (Exception e) {
System.out.println("please input 2 words.");
}
}
}
-------------
**2019年11月14日:継承 [#ifca9b32]
***本日のレポート [#w6a5e3c7]
作成したOsaifuUSD.javaとOsaifuUSD.classをいつものように出...
***実行時の型 [#h051144d]
サブクラスもちゃんとしたクラスですので、インスタンスを作...
例えば、ParentというクラスからChildというサブクラスを作っ...
Child x = new Child();
として使います。ここで親のクラスの変数に代入することもで...
Parent y = new Child();
しかし、親のインスタンスを、子の型の変数には代入できませ...
Child z = new Parent(); //これはできない
仕組みを考えれば理由は明白です。サブクラスは、スーパーク...
instanceofという演算子があります。上記の例では、
if ( x instanceof Child) {}
if ( x instanceof Parent) {{}
とするとifの中の判定はどちらもtrueです。あるクラスのイン...
***抽象クラス [#eece29ff]
抽象クラスは、インスタンスを作れないクラスです。
いくつかのクラスの上位概念をまとめる役割があります。
例えば、犬クラス、猫クラスというクラスがあって、それらの...
その世界では、犬や猫のインスタンスは作れても、動物のイン...
としたら、動物クラスは抽象クラスになります。
定義のオプションにabstractと書きます。
abstract class Animal {}
この授業で抽象クラスを作成することはないと思いますが、マ...
Readerは抽象クラスです。下のリンクからReaderを探してみて...
https://docs.oracle.com/javase/jp/8/docs/api/index.html
***抽象メソッド [#v050fd26]
抽象クラスと同様に、特定のメソッドがabstractと定義される...
public abstract void xxxx();
***finalクラス [#tf82758d]
クラスの定義にfinalをつけることができます。これ以上継承し...
final class XXXX {}
メソッドの定義につけることもできます。サブクラスでオーバ...
public final void XXXX(){}
***インタフェース [#k5d21dd0]
抽象クラスに似ていますがクラスではないので、インスタンス...
抽象メソッドと定数だけが定義されています。
この授業でインタフェースを定義することはないと思いますが...
インタフェースには空のメソッドが定義されています。
そのメソッドを実装していますという宣言にimplementsという...
例えば、MovableとErasableというインタフェースが定義されて...
クラスの定義で、これらを実装しているという宣言は、以下の...
class MyShape implements Movable, Erasable {}
このクラスでは、Movable, Erasableで定義されているメソッド...
ややこしいですが、後の授業で、実例がたくさん出てきますの...
Mouse Listenerはインタフェースの例です。下のリンクから探...
https://docs.oracle.com/javase/jp/8/docs/api/index.html
***小テスト練習 [#g4c60a6e]
次回またはその次くらいの授業で、小テストを行います。
以下の内容が理解できるように、整理しておいてください。
以下のプログラムの中で、
クラス、インスタンス、サブクラス、スーパクラス、クラスメ...
インスタンス化、継承がどこで行われているのか確認してくだ...
(importで始まる一行目はまだ説明していない内容なので小テス...
import javax.swing.JFrame;
public class SampleWindow extends JFrame {
public static void main(String args[]) {
SampleWindow w = new SampleWindow();
w.setVisible(true);
}
}
-----------------
***オーバーライド [#ad8de445]
サブクラスに、スーパークラスと同じ名前と引数のメソッドを...
これをオーバライドト言います。
一つのクラスの中で、名前が同じメソッドを定義することをオ...
似ていますが、オーバーライドは、引数のパターンも同じです。
スーパークラスのメソッドを置き換えるものです。
ここでは、スーパークラスのprint()メソッドをサブクラスでオ...
***スーパークラスのメソッドの呼び出し [#d39dcf0b]
オーバーライドすると、通常(thisが使われる場合)はサブク...
つまりサブクラスの定義の中で、
print();
this.print();
はどちらもサブクラスのprint()が呼び出されます。
でも、明示的にスーパークラスで定義された方のメソッドを実...
その場合は、メソッドを呼び出すときにsuperと追記します。以...
super.print();
*** OsaifuUSDクラスの改造(2) [#sa44f577]
OsaifuUSDにprint()メソッドを追加して、
円表示の次の行に ( xxx USD ) と残高をUSD表示するようにし...
円表示を行う部分はスーパークラスOsaifuのインスタンスメソ...
http://gyazo.com/39a7b24a8c45e15ac55693592c2eb7cf.png
-解答例
public void print() {
super.print();
System.out.println("( " + (okane / 90) + " usd )" );
}
-----------------
*** OsaifuUSDクラスの改造(1) [#g8c0b7a2]
入出金のメソッドの中で、親の入出金メソッドを活用してみま...
public class OsaifuUSD extends Osaifu {
public int outUSD(int usd) {
return ( out( use * 90) / 90 );
}
public void inUSD(int usd) {
in( usd * 90 );
}
…
}
このプログラムの中のoutメソッドとinメソッドは、親のクラス...
outメソッドで残金がマイナスにならないように処理してあれば...
親のメソッドを呼ぶことを明示的に書くためにsuper.をつかっ...
public class OsaifuUSD extends Osaifu {
public int outUSD(int usd) {
return ( super.out( use * 90) / 90 );
}
public void inUSD(int usd) {
super.in( usd * 90 );
}
…
}
------------
**第8章 継承 [#ka97b6ac]
*** Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう [...
-OsaifuUSDクラスはアメリカで買い物をするときに便利な、ア...
-あたらしく追加するメソッドは以下です
-- void inUSD(int x) xドルをお財布に入金します。このと...
-- int outUSD(int x) xドルをお財布から出金します。この...
--1ドルは90円にしてください(今とはかけ離れた値ですが、サ...
//-スーパークラスのメソッドを上書きするメソッドは以下です
//-- void print() お財布の残高を円とドルで表示します
-OsaifuUSDクラスをテストするmain()メソッドでは次のことを...
-- OsaifuUSDインスタンスを一つ作ってそれをsaifu1という名...
-- OsaifuUSDインスタンスをもう一つ作ってそれをsaifu2とい...
--saifu1に1000円入金する
--saifu2に5ドル入金する
--saifu1とsaifu2が持っている金額を印刷する
--saifu1から2ドル出金してそれをsaifu2に入金する
--saifu1とsaifu2が持っている金額を印刷する
-動作例
http://gyazo.com/f51ea5895aaab32bb30b9a940d91515d.png
-ヒント:一行目はこれ
public class OsaifuUSD extends Osaifu {
-ヒント:mainはこんな感じ
public static void main(String argv[]) {
OsaifuUSD saifu1= new OsaifuUSD();
OsaifuUSD saifu2=new OsaifuUSD();
saifu1.in(1000);
saifu2.inUSD(5);
saifu1.print();
saifu2.print();
saifu2.inUSD(saifu1.outUSD(2));
saifu1.print();
saifu2.print();
}
-解答例
一番シンプルな解答例です。残高がマイナスになることは考慮...
public class OsaifuUSD extends Osaifu {
public int outUSD(int usd) {
okane-=usd * 90;
return usd;
}
public void inUSD(int usd) {
okane+=usd * 90;
}
public static void main(String argv[]) {
OsaifuUSD saifu1 = new OsaifuUSD();
OsaifuUSD saifu2 = new OsaifuUSD();
saifu1.in(1000);
saifu2.inUSD(5);
saifu1.print();
saifu2.print();
saifu2.inUSD(saifu1.outUSD(2));
saifu1.print();
saifu2.print();
}
}
大昔の授業で使ったプログラムを使い続けているので、為替レ...
多分現在の為替レートとはかけ離れています。
(スクリーンショットを撮りなおすのが面倒なので、古いレー...
為替レートを変数として持たせるとしたら、どうしたら良いで...
- インスタンス変数
- クラス変数
のどちらにするか、考えてみましょう。
[解答]インスタンスで共通の情報ですので、おそらくクラス...
------------------
オブジェクト指向言語では、クラスを拡張するいくつかの方法...
Javaなどで一般的な手法は、継承です。引き継ぐということで...
すでにあるクラスの機能を拡張して、新しいクラスを作ること...
拡張する部分は新しく作るのですが、拡張しない部分は、古い...
通常は、古いクラスをコピーして、機能拡張して新しいクラス...
でも、古いクラスの方も、そのまま使われ続けて、改良され続...
そこで継承を使います。
例えば、たい焼きの焼き型で説明します。
とても気に入った焼き型があるけど、しっぽに模様がないのだ...
そこで、現在の焼き型を親として、継承する新しい焼き型を作...
継承したクラスで定義すると、それだけが差分として使われま...
なので、しっぽの模様だけ定義しておけば、あとは全て親の機...
子クラスの中身は、極端な場合、空っぽでも良いです。定義さ...
ということで、
別のクラスを継承することで、
差分だけを書いて機能を拡張していくことができます。
http://gyazo.com/2c8ef14d8be63b9fc18c58d79f2f3879.png
-------------
***インスタンスの参照 [#mb6379b9]
Point pt1 = new Point(10,20);
Point pt2 = pt1;
Point pt3 = new Point(10,20);
この時、
if(pt1 == pt2)
という判断をするとこれはtrueになります。
しかし
if(pt1 == pt3)
という判断をすると結果はfalsです。
参照先が同じなのか、その中のインスタンス変数が同じなのか...
if( ( pt1.x == pt3.x) && (pt1.y == pt3.y) )
のようにします。
***ガーベージコレクションとファイナライザ [#w0dec2d2]
C言語ではmallocでメモリー確保した後、これを使わなくなった...
インスタンスが破棄されるときに、何か特別な処置をしてほし...
***クラス変数の初期化 [#g403bd1b]
先に述べたように、インスタンス変数は、コンストラクタで初...
一つは、定義する場所で初期化できます。
public class TestStatic [
static int x = 10;
y = 20;
ここでxはクラス変数で、yはインスタンス変数です。どちらも...
複雑な初期化をしたい場合は、staticイニシャライザを使用し...
例えば、10個の要素からなる配列を用意して、それの内容を添...
public class TestStatic {
static int[] array;
static {
array = new int[10];
for (int I = 0; I < array.length; I++) array[I] ...
}
***final変数 [#c013ec29]
変数の宣言にfinalをつけると、その変数の値が変更の対象にな...
final static double PI = 3.14159265;
-------------------
*** コンストラクタ [#y0f882f5]
コンストラクタはインスタンスが生成される時に自動的に呼び...
public class Point{
int x, y;
Point() { x = y = 0; }
Point(int pix, int pty) {
x = ptx; y= pty;
}
省略
}
インスタンスを生成する際の演算子newのあとに指定するのは、...
Point pt1 = new Point();
Point pt2 = new Point(10, 20);
これで、最初のコンストラクタと、2番目のコンストラクタが...
コンストラクタから他のメソッドを呼び出すことも可能です。...
Point(int pix, int pty) {
set(ptx, pty);
}
void set(int ptx, int pty) {
this.x = ptx; this.y = pty;
}
コンストラクタの中でコンストラクタを呼び出すこともできま...
Point() {
this(0, 0);
}
これはコンストラクタPoint (x, y)を呼び出しています。this...
*** Osaifuクラスにコンストラクタを追加してみよう [#a8a56d...
-Osaifu() で残金0のインスタンスを作る
-Osaifu(int x) で引数を残金の初期値としたインスタンスを作る
ことができるコンストラクタを作りましょう。
これをmainから呼んで、上記のプログラムと同じことをするた...
Osaifu saifu1 = new Osaifu(1000);//インスタンスを作る
//最初の保持金額を1000円にする
Osaifu saifu2 = new Osaifu(500);//インスタンスを作る
//最初の保持金額を500円にする
とすれば良いです。
***今日の提出課題 [#y418f281]
Osaifu.javaとclassを前回と同様にフォルダにコピーして、圧...
***コンストラクタ解答編 [#w62499a7]
以下のコンストラクタを作ることになります。
Osaifu() { okane = 0; }
Osaifu(int x) { okane = x; }
これは以下のように書いても良いです。
Osaifu() { this(0); }
Osaifu(int x) { okane = x; }
-------------------
--解答例
double distance ( int ptx, int pty, int ptz ) {
int dx = ptx - this.x;
int dy = pty - this.y;
int dz = ptz - this.z;
return Math.sqrt(dx * dx + dy * dy + dz * dz);
}
double distance ( Point3D p ) {
return this.distance(p.getx(), p.gety(), p.getz());
}
**第7章 クラスとオブジェクトの操作 [#k1b96e7b]
*** 他の点との距離を返すメソッドの例を説明しました [#xfa5...
double distance ( int ptx, int pty ) {
int dx = ptx - this.x;
int dy = pty - this.y;
return Math.sqrt(dx * dx + dy * dy);
}
double distance ( Point p ) {
return this.distance(p.getx(), p.gety());
}
distanceという名前は同じでも、引数の違いで、異なる動作を...
*** Osaifuクラスを作ってみよう [#i9df5c2e]
-Osaifuクラスからはインスタンスがたくさん作られる
--Osaifuクラスはお財布の設計図/工場、ここから実際のお財...
--工場出荷時の残金は0円だけど、その後、いろいろな値になる...
--ということで残金はインスタンス変数とすべきだろう
-Osaifuクラスには次のメソッド、変数が必要だろう
--残金を表すインスタンス変数 int okane
--お金を入金するインスタンスメソッド void in(int x);
--お金を出金するインスタンスメソッド int out(int x); 戻...
--残金を印刷するインスタンスメソッドがあってもよいだろう ...
http://gyazo.com/bd6eaafd220dc7ff791288089f293b28.png
-Osaifuクラスをテストするmain()メソッドでは次のことをやっ...
-- Osaifuインスタンスを一つ作ってそれをsaifu1という名前に...
-- Osaifuインスタンスをもう一つ作ってそれをsaifu2という名...
--saifu1に1000円入金する
--saifu2に500円入金する
--saifu1とsaifu2が持っている金額を印刷する
--saifu1から200円出金してそれをsaifu2に入金する
--saifu1とsaifu2が持っている金額を印刷する
public static void main(String argv[]) {
Osaifu saifu1 = new Osaifu();
Osaifu saifu2 = new Osaifu();
saifu1.in(1000);
saifu2.in(500);
saifu1.print();
saifu2.print();
saifu2.in(saifu1.out(200));
saifu1.print();
saifu2.print();
}
http://gyazo.com/c618901458edc1ba338cab87d2810157.png
-Osaifu.java 解答編
public class Osaifu {
int okane;
public void in (int x) { okane += x; }
public int out(int x) { okane -= x; return x; }
public void print() {
System.out.println( "okane = " + okane +" yen");
}
public static void main(String argv[]) {
Osaifu saifu1 = new Osaifu();
Osaifu saifu2 = new Osaifu();
saifu1.in(1000);
saifu2.in(500);
saifu1.print();
saifu2.print();
saifu2.in(saifu1.out(200));
saifu1.print();
saifu2.print();
}
}
--このプログラムでは残金がマイナスになってしまってもかま...
--このためには、例えばoutメソッドを以下のようにすれば良い
public int out(int x) {
if(x < okane ) {
okane = okane -x;
return x;
} else {
int nokori = okane;
okane =0;
return nokori;
}
}
-------------------
***変数には直接アクセスしないのが賢い設計 [#udb9cbfb]
C言語の構造体のように変数にアクセスできます。
でも、オブジェクト指向の設計では、外部からは極力変数にア...
変数にアクセスするには、アクセス用のメソッドを使うのが良...
これにより、
変数の型などを将来変更してもメソッドの書き換えで対応でき...
修飾子をprivateにすると、クラスの外からアクセスできなくな...
そして、アクセス用のメソッドを書いておきます。
例えば、Pointクラスでしたら以下のようにします。
public class Point {
private int x, y;
void set(int newx, int newy) {this.x=newx; this.y=newy;}
int getx() { return this.x;}
int gety() { return this.y;}
void print () {
System.out.println(this.x + ", " + this.y);
}
public static void main(String argv[]) {
Point pt1= new Point();
Point pt2 = new Point();
pt1.set(10,20);
pt2.set(-pt1.getx(), -pt1.gety());
pt1.print();
pt2.print();
}
}
-演習5
Point3Dのメソッドを充実させて次のmain()メソッドで
10, 20, 30
-10, -20, -30
という結果が出るようにしましょう
public static void main(String argv[]) {
Point3D pt1 = new Point3D();
Point3D pt2 = new Point3D();
pt1.set(10, 20, 30);//インスタンス変数を...
pt2.set(-pt1.getx(), -pt1.gety(), -pt1.ge...
pt1.print();//インスタンスメソッド呼出
pt2.print();
}
***指定された座標との距離を返すメソッドdistance() [#sab2f...
print()メソッドの他に、もう少し複雑な計算をするメソッドを...
double distance ( int ptx, int pty ) {
int dx = ptx - this.x;
int dy = pty - this.y;
return Math.sqrt(dx * dx + dy * dy );
}
今度は、座標ではなくて、他のPointインスタンスを引数にして...
double distance ( Point p ) {
int dx = p.getx() - this.x;
int dy = p.gety() - this.y;
return Math.sqrt(dx * dx + dy * dy );
}
この2つのメソッドは、どちらもPointクラスに実装することが...
違う関数ですので、片方のdistanceの中から、もう一方のdista...
double distance ( int ptx, int pty ) {
int dx = ptx - this.x;
int dy = pty - this.y;
return Math.sqrt(dx * dx + dy * dy );
}
double distance ( Point p ) {
return this.distance(p.getx(), p.gety());
}
-演習6
Point3Dに、
- 他の座標との距離を返すメソッド double distance ( int pt...
- 他のPoint3Dインスタンスとの距離を返すメソッド double di...
次のmain()メソッドで
10, 20, 30
-10, -20, -30
74.83314773547883
という結果が出るようにしましょう
public static void main(String argv[]) {
Point3D pt1 = new Point3D();
Point3D pt2 = new Point3D();
pt1.set(10, 20, 30);//インスタンス変数を...
pt2.set(-pt1.getx(), -pt1.gety(), -pt1.ge...
pt1.print();//インスタンスメソッド呼出
pt2.print();
System.out.println(pt1.distance(pt2));
}
----------------
***自分自身のメンバーへのアクセスthis [#ra357870]
クラス変数、クラスメソッド、インスタンス変数、インスタン...
Math.PI
でクラスMathのクラス変数のPIにアクセスできます(円周率が...
インスタンスならば、クラスからインスタンスを生成した後で...
Point pt1 = new Point();
pt1.print();
このようにメンバーにアクセスするには、そのメンバーが属し...
public class Point {
int x, y;
void print() {
System.out.println(x + ", " + y);
}
}
と、書いてあります。インスタンスメソッドのprint()の中で、...
これをインスタンスの名前を指定して書くことはできるでしょ...
public class Point {
int x, y;
void print() {
System.out.println(this.x + ", " + this.y);
}
}
と書くこともできます。メソッドの中で一時的に宣言した変数...
***public static void main の説明 [#ba29c5fb]
修飾子の説明:
- staticとついているのがクラス変数、クラスメソッドです
- staticが付いていないのがインスタンス変数、インスタンス...
- publicはすべてのクラスからアクセス可能
- protectedはサブクラスからアクセス可能(後で説明します)
- privateはそのクラスの中からのみアクセス可能
などから、今までお馴染みの、
public static void main (String args[]) {}
は、どいういう意味だったでしょうか?考えてみてください。
- これはクラスメソッドです(staticなので。これが一番重要...
- これは値を返しません(void)
- これはどのクラスからでもアクセスできます(publicなので...
さらに説明すると、クラスメソッドmainは特別なメソッドで、j...
-javaコマンドは、引数のクラスのクラスメソッドmainを実行し...
--staticと付いているのがクラス変数、クラスメソッドの印です
-今作ったPointクラスにもクラスメソッドmainを実装すれば自...
***クラスの中に自分自身のインスタンスをテストするクラスメ...
public class Point {
int x, y;
void print () {
System.out.println(this.x + ", " + this.y);
}
public static void main(String args[]) {
Point pt1 = new Point(); //自分自身からイ...
Point pt2 = new Point(); //自分自身からも...
pt1.x = 10;
pt1.y = 20;
pt2.x = - pt1.x;
pt2.y = - pt1.y;
pt1.print();
pt2.print();
}
}
これで、java Pointコマンドで、テストすることができます。
やっていることは、少しややこしいので、しっかり確認してく...
クラスメソッドの中で、自分が定義した方法で、インスタンス...
-演習4
クラスPoint3Dに自分自身をテストするクラスメソッドmainを作...
http://gyazo.com/bdef2ab8e69f7f6e62273c2d67d7af2e.png
public static void main(String args[]) {
Point3D pt1 = new Point3D(); //自分自身か...
Point3D pt2 = new Point3D(); //自分自身か...
pt1.x = 10;
pt1.y = 20;
pt1.z = 30;
pt2.x = - pt1.x;
pt2.y = - pt1.y;
pt2.z = - pt1.z;
pt1.print();
pt2.print();
}
--------------
***クラス変数・メソッドとインスタンス変数・メソッド [#h86...
変数とメソッドの定義に使われる修飾子や戻り値の表現は、C言...
- 戻り値がなければvoidと書きます
- 戻り値があればその型を書きます。
以下はとても重要です。
- staticとついているのがクラス変数、クラスメソッドです。...
- staticが付いていないのがインスタンス変数、インスタンス...
(インスタンスを作らないと呼び出せません)
クラス変数にはクラス名を指定してピリオドでアクセスします...
class MathTest {
public static void main (String args[]) {
System.out.println(Math.PI);
}
}
またMath.random()クラスメソッドで乱数が得られます。以前の...
インスタンス変数はインスタンスを作ってからアクセスします...
Point pt1 = new Point();
pt1.print();
としてアクセスできます。クラスメソッドではありませんので...
そのほかの修飾子は、あとで説明しますが、アクセス制御だけ...
- publicはすべてのクラスからアクセス可能
- protectedはサブクラスからアクセス可能(後で説明します)
- privateはそのクラスの中からのみアクセス可能
です。
--------------------------
まずは前回の復習をします。
-クラスは型、インスタンスはそれから作られたもの
--クラスがたいやきの焼き型だとすると、インスタンスはそれ...
--クラスは設計図でインスタンスはそれから作られたもの
-クラスとインスタンスそれぞれにメソッドと変数がある
--クラス変数 例:何個のインスタンスを作ったか?
--クラスメソッド 例:インスタンスを作れ
--インスタンス変数 例:ひとつのたいやきの重さ
--インスタンスメソッド 例:たいやきをxxグラム食べる
http://gyazo.com/bbdd3587977a172f7fa7f00c4f5787e0.png
***すごく簡単なクラスの例 [#kbcf21cf]
整数型のインスタンス変数を2個だけ持つクラスです。C言語の...
public class Point {
int x, y;
}
先のPoint型のクラスにインスタンスメソッドを1個追加しまし...
public class Point {
int x, y;
void print() {
System.out.println(x + ", " + y);
}
}
***インスタンスの生成 [#cc06a50c]
クラスからインスタンスを作ることをインスタンス化またはイ...
先のPointクラスとは別の、テスト用クラスTestPointを用意し...
Pointクラスは別のファイルで定義されていることになりますが...
public class TestPoint {
public static void main(String args[]) {
Point pt1 = new Point();
Point pt2 = new Point();
}
}
配列の時と同じくnewコマンドが使われています。new Point()...
インスタンスのインスタンス変数、インスタンスメソッド(こ...
pt1とpt2のインスタンス変数に値を代入して、インスタンスメ...
public class TestPoint {
public static void main(String args[]) {
Point pt1 = new Point();
Point pt2 = new Point();
pt1.x = 10;
pt1.y = 20;
pt2.x = - pt1.x;
pt2.y = - pt1.y;
pt1.print();
pt2.print();
}
}
この結果、10, 20と-10, -20が表示されます。
- この後、以下の演習をやってもらいました。
TestPoint3Dというクラスを作って、その中のmain関数で、
先に作ったPoint3Dクラスからインスタンスを2個作り、それぞ...
以下のような実行結果が出るようにしてください
http://gyazo.com/deeb78a70a724a01ce76945235d42ab8.png
--------------------
**以下は、前回以前の授業の内容です。 [#iafdd8f4]
**2019年10月17日 [#d30d7432]
***インスタンスの生成 [#cc06a50c]
クラスからインスタンスを作ることをインスタンス化またはイ...
先のPointクラスとは別の、テスト用クラスTestPointを用意し...
Pointクラスは別のファイルで定義されていることになりますが...
public class TestPoint {
public static void main(String args[]) {
Point pt1 = new Point();
Point pt2 = new Point();
}
}
配列の時と同じくnewコマンドが使われています。new Point()...
インスタンスのインスタンス変数、インスタンスメソッド(こ...
pt1とpt2のインスタンス変数に値を代入して、インスタンスメ...
public class TestPoint {
public static void main(String args[]) {
Point pt1 = new Point();
Point pt2 = new Point();
pt1.x = 10;
pt1.y = 20;
pt2.x = - pt1.x;
pt2.y = - pt1.y;
pt1.print();
pt2.print();
}
}
この結果、10, 20と-10, -20が表示されます。
- 演習3
TestPoint3Dというクラスを作って、その中のmain関数で、
先に作ったPoint3Dクラスからインスタンスを2個作り、それぞ...
以下のような実行結果が出るようにしてください
http://gyazo.com/deeb78a70a724a01ce76945235d42ab8.png
-----------
**第6章「クラスの基礎」 [#ncf7b7be]
***すごく簡単なクラスの例 [#vbf621fd]
整数型のインスタンス変数を2個だけ持つクラスです。C言語の...
public class Point {
int x, y;
}
- 演習1
3次元の座標x,y,zを表現するクラスPoint3Dを定義してください...
x,y,zはそれぞれint型とします。定義したらコンパイルしてく...
先のPoint型のクラスにインスタンスメソッドを1個追加します...
public class Point {
int x, y;
void print() {
System.out.println(x + ", " + y);
}
}
- 演習2
先のクラスPoint3Dのインスタンスの持つ座標x,y,zが10,20,30...
--------
***クラスとインスタンスの説明をします。よく聞いてください...
まとめです:
-クラスは型、インスタンスはそれから作られたもの
--クラスがたいやきの焼き型だとすると、インスタンスはそれ...
--クラスは設計図でインスタンスはそれから作られたもの
-クラスとインスタンスそれぞれにメソッドと変数がある
--クラス変数 例:何個のインスタンスを作ったか?
--クラスメソッド 例:インスタンスを作れ
--インスタンス変数 例:ひとつのたいやきの重さ
--インスタンスメソッド 例:たいやきをxxグラム食べる
http://gyazo.com/bbdd3587977a172f7fa7f00c4f5787e0.png
-------------
-演習4
mainの引数argsは、Stringの配列で、コマンドラインで起動し...
コマンドの後に続けた書いた文字が入っています。
args[0], args[1], args[2] .... をすべてfor-each文で
表示するプログラムを書いてみましょう。
この時、以下のように、args[]の文字をすべてfor-each文で+つ...
javac ArgsTest2 cat dog cow fox
cat + dog + cow + fox
public class ArgsTest2 {
public static void main(String args[]) {
boolean isFirstWord = true;
for(String s: args) {
if(false == isFirstWord) {
System.out.print(" + ");
}
isFirstWord = false;
System.out.print(s);
}
System.out.println();
}
}
***for-each文 [#cd4a2794]
for-each文は、Cにはなかったです。練習しましょう。
for(型 変数名: 式) {}
int型の4個の配列は、以下のように宣言できます。
int[] array;
array = new int[4]
これを1行で表現して、さらに初期値をいれてしまうこともで...
int[] array = new int[]{1,2,3,4};
- 演習3
int[] array = new int[]{1,2,3,4};
で宣言した配列の中身を、for-each文で順番に表示せよ。ヒン...
for(int x: array) {}
です。
解答例:
class ArrayTest {
public static void main (String args[]) {
int[] array = new int[]{1,2,3,4};
for (int x: array) {
System.out.println(x);
}
}
}
--------------
***for文 [#ac566ee5]
for文もC言語と同じです。
for(初期設定; 条件; 再設定) {}
-演習2-1
10万円を今の1年もの定期預金の年利で複利で運用した時、元利...
for文で、2項目目に20万円を超える条件を書いて、年数と金額...
http://gyazo.com/1733defca0c709c41c69ea729320ab61.png
for( year = 1; <ここに条件>; year++) {
解答例:
class Kinri {
public static void main (String args[]) {
double okane=100000;
int year;
for(year=1; okane < 200000; year++) {
okane = okane * 1.002;
System.out.println("year = " + year + " okane= " + ok...
year++;
}
}
}
-演習2-2
break文で直近のループを抜け出せます。上の問題を無限ループ...
***while文 [#odd3e1de]
while文もC言語と同じです。
while(条件) {}
-演習2-3
上の問題をwhile文で書き直してみましょう。
--------------
-演習1
100点満点のテストの得点から、ABCDの成績を表示するプログラ...
その準備のために、
0から100までの乱数を10個表示するプログラムを作ります。
public class Score {
public static void main (String argv[]) {
int i,a;
for(i=0;i<10;i++) {
a=(int)(Math.random() * 100);
System.out.println(a);
}
}
}
Math.random()は、Mathクラスのクラスメソッドであるrandom()...
System.out.println()などと同じく、大文字で始まる単語はク...
次にこの乱数を100点満点の点数とみなして、成績ABCDを表示す...
成績の基準は、80点以上がA, 60点以上80点未満がB, 40点以上6...
動作例を以下に示します。
http://gyazo.com/829b04a7fc82cdfe9dd0dfa650af873e.png
解答例1:
public class Score {
public static void main(String args[]) {
int i,a;
char score;
for(i=0;i<10;i++){
a= (int)(Math.random() * 100);
if(a>=80) score='A';
else if(a>=60) score='B';
else if(a>=40) score='C';
else score='D';
System.out.println(a + " " + score);
}
}
}
解答例2:
public class Score {
public static void main (String argv[]) {
int i,a;
for(i=0;i<10;i++) {
a=(int)(Math.random() * 100);
System.out.print(a + " ");
if(a<40) System.out.println("D");
else if(a<60) System.out.println("C");
else if(a<80) System.out.println("B");
else System.out.println("A");
}
}
}
-----------
**第5章「制御構造」 [#p54c6568]
制御構造も大半はC言語と同じです。
***if文、else文、else-if文 [#s3bd1b3d]
if文もC言語と同じです。
- if文
if (a==0) b=100;
if (a==0) {
b=100;
}
- if-else文
if (a==0) {
b=100;
}else{
b=10;
}
- else-if文
if (a>100) {
}else if (a>10){
}else{
}
--------------
***第4章「演算子」 [#p4a8e735]
//--演習4.2をやってみよう
演算子はほとんどC言語と同じです。復習しましょう。
変数には算術演算子が使えます。算術演算子はC言語と同じです。
+-*/%
です。%は剰余です。
5 % 2
は1です。
代入演算子は=です。
算術演算子と代入演算子を組み合わせることもできます。
a += 1;
は
a = a + 1;
と同じ意味です。
インクレメント、デクレメント演算子もCと同様です。
a = 1;
b = a++;
は、bが1、aが2になります。
a = 1;
b = ++a;
は、a, bどちらも2になります。
関係演算子もC言語と同じです。
<, >, <=, >=, ==, !=
論理演算子もC言語と同じです。
&&, ||, !
Javaではbooleanにしか論理演算できないので、&, | だけでもo...
ビット演算し、シフト演算子もC言語と同じです。
&, |, ^, ~, <<, >>, >>>
1 << 2
は4になります。
キャストもあります。C言語と同じです。
long b=1234;
int a = (int)b;
***文字列 [#t32f75c4]
C言語では文字列はただのバイト変数の配列でした。最後の値が...
Javaでは文字列は、Stringクラスのインスタンスです。
なんのことかは後の授業で説明しますが、処理をする関数を内...
なので、いろいろな操作が可能です。
文字列は""で括ります。
"Hello Java World!"
printlnできます。
System.out.println("Hello Java World!");
足し算もできます。
System.out.println("This is " + "a test.");
変数にも代入できます。変数の種類はStringです。オブジェク...
String world = "Hello Java World!";
-演習6
最初に作ったHello.javaプログラムを、String変数 worldとい...
解答例:
class Hello {
public static void main (String args[]) {
String world = "hello java world!";
System.out.println(world);
}
}
-演習7
--コマンドの引数はarg[0], arg[1] ... などにString型の配列...
--二つの引数を与えたときに、それが+でつないで表示されるプ...
http://gyazo.com/8159f78165e17781a7110de3763c833c.png
ヒント
--以下は引数一つを表示するだけのサンプルです。これをもと...
--arg[0]とarg[1]をprintlnの中で+でつないで表示すれば良い...
class ArgsTest {
public static void main (String args[]) {
System.out.println(args[0]);
}
}
できてしまった人は以下をお願いします。
このプログラムで、引数が2個未満の場合はエラーになります。
2個未満の場合には、2個引数を描いてくださいというメッセ...
.length関数でargsの長さを知ることができます。
if文はC言語と同じです。
if(args.length < 2) {
} else {
}
というように書けます。
--------------
***配列 [#e846fded]
C言語では小規模な配列を使う場合、静的に確保した配列をよく...
Javaでは、システムからメモリー確保して動的に確保した配列...
C言語でもmalloc()関数でメモリーを確保したことがあると思い...
例えばint型の変数3個分のメモリを確保して、それをint型を示...
//C言語での例です:
int *p;
*p = (int *)malloc(sizeof(int)*3);
Javaでも同じことをやります。
システムにお願いして、必要な量の配列を格納するメモリー領...
まずは配列の変数を定義して、次にnewコマンドで必要なメモリ...
int[] x; (配列を参照する変数を定義する)
x = new int[3]; (int3個ぶんのメモリー領域をnewコマン...
こうすると、プログラムの中からx[0]=1;とかx[2]=x[0];などと...
1行でまとめて書くこともあります。
int[] x = new int[3];
演習3
要素が100個のintの配列x[0]からx[99]を作って、それに1,2,3,...
ヒント:
class Vartest {
public static void main (String args[]) {
//配列を定義します。
//(略)
//for文で値を入れます
for(int i=0; i<100; i++) {
//(略)
}
//for文で表示します
for(int i=0; i<100; i++) { //(略)
}
}
---------------------
**第3章「変数」 [#xc22f04b]
***Javaにおける基本データ型 [#n3c4e251]
-整数型
--byte (1バイト。-128から127)
--short (2バイト。-32,768から32767)
--int (4バイト。-2,147,483,648から2,147,483,647)
--long (8バイト。明確に数値で指定する場合は、x = 20L; の...
--char (1文字を表す。メモリー上のサイズは色々。''でくくる...
-浮動小数点型
--float (4バイトで表す浮動小数点。重力加速度なら9.80665の...
--double (8バイトで表す高精度な浮動小数点。光速なら2.9979...
-論理型
--boolean (trueかfalseのどちらかの値をとる。 x = true; な...
C言語と違い、整数型のサイズが明確に決められました。char型...
-演習1
先に作ったHello.javaを参考にVartest.javaというプログラム...
以下では、byte型変数を定義して、それを表示しています。
変数名は変えても良いです。
printlnの中では、文字列を連結しています。Javaでは文字列を...
class Vartest {
public static void main (String args[]) {
int x = 42;
System.out.println("byte value x =" + x);
}
}
これをもとに、short, int, long, char, float, double boole...
class Vartest {
public static void main (String args[]) {
byte x= 42;
int x1= 123456;
char name = '椎';
System.out.println("byte value x =" + x);
System.out.println("int value x1 =" + x1);
System.out.println("char value name =" + name);
}
}
解答例:
class Vartest {
public static void main (String args[]) {
byte x_byte = 42;
int x_int = 12345;
short x_short = 123;
long x_long = 12345678;
char x_char = '椎';
float x_float = 123.4f;
double x_double = 3.14d;
boolean x_boolean = true;
System.out.println("byte value x_byte = " + x_byt...
System.out.println("short value x_short = " + x_s...
System.out.println("int value x_int = " + x_int);
System.out.println("long value x_long = " + x_lon...
System.out.println("char value x_char = " + x_cha...
System.out.println("float value x_float = " + x_f...
System.out.println("double value x_double = " + x...
System.out.println("boolean value x_boolean = " +...
}
}
-演習2
以下のように、整数型の変数に文字を代入して値を表示すると...
あなたのイニシャルを表す英文字の文字コードを表示するプロ...
int myInitialCode1 = 'S', myInitialCode2 = '椎';
System.out.println(myInitialCode1);
System.out.println(myInitialCode2);
------------------
- 次に簡単なウィンドウを出してみましょう。
授業の最後の方で紹介する,Swingというフレームワークを使っ...
import javax.swing.JFrame;
public class SimpleWindow {
public static void main(String argv[]) {
JFrame f = new JFrame("私が作った最初の窓...
f.setSize(200,100);
// f.setDefaultCloseOperation(JFrame.EXIT_...
f.setVisible(true);
}
}
これをSimpleWindow.javaという名前で保存して、
javac SimpleWindow.java
java SimpleWindow
とタイプしてコンパイル/実行します。
このプログラムは,ウィンドウのクローズボタンを押しても終...
プログラムを停止するには,ターミナルでコントロール-cを押...
#ref(How2Java/simplewindow.png)
*** 超簡単なプログラム(hello world)を作ってみる [#v4ccc293]
- ターミナルから、vi Hello.javaとかemacs Hello.javaとかpi...
もしくは、cotEditerを起動して作成します。
- ここで、以下のようなプログラムを書いてみます。
class Hello {
public static void main (String args[]) {
System.out.println("hello java world!");
}
}
http://is.ocha.ac.jp/~siio/gyazo/20121004010107.png
- これをHello.javaという名前で保存します。lsやcatコマンド...
$ ls
Hello.java
$ cat Hello.java
class Hello {
public static void main (String args[]) {
System.out.println("hello java world!");
}
}
今は、Hello.javaファイルが一つしかありません。これをコン...
$ javac Hello.java (コンパイルする)
コンパイルに成功するとHello.classというファイルができて...
$ ls
Hello.class Hello.java
これはjavaコマンドで動作します。javaはインタープリータで...
$ java Hello (実行する。.javaなどの拡張子は不要)
hello java world! (結果)
----------
**javaのマニュアル [#beafbfad]
//http://sdc.sun.co.jp/java/docs/j2se/1.5.0/ja/docs/ja/ap...
//http://java.sun.com/javase/ja/6/docs/ja/api/index.html
//http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html
//http://docs.oracle.com/javase/jp/6/api/
http://docs.oracle.com/javase/jp/8/docs/api/index.html
***参考図書(去年までは教科書でした) [#d5f8ad25]
http://gyazo.com/de3288074dae1c75f6df4ef3c0b9b3d4.png
http://www.amazon.co.jp/dp/4883732258/
前半はこの内容で進めますので、手元にあると便利です。
*** この講義の目的 [#l5592b29]
+Javaでプログラムする
+オブジェクト指向の概念を理解してプログラミングする
+GUIプログラミングをする
*** この講義の順序 [#gcf48d66]
+Javaになれる(C言語などのプログラミング手法の復習)
+オブジェクト指向について理解する
+GUIプログラミングについて理解する(イベント駆動)
+お絵描きプログラムを作ってみる
*** 成績評価 [#c732dbb9]
+お絵描きプログラムの完成度,作り込み
+毎回の宿題の達成(参考程度)
+出席状況(参考程度)
***単位を出す条件 [#k4e326f7]
//**欠席状況
+ 最終課題のお絵描きプログラムで最低限お願いした機能を実...
+ 3/4以上出席してください。(欠席は3回まで)欠席4回で自動...
(公欠、忌引などは欠席にしませんので連絡ください。病欠、電...
//欠席3回以下なら不可にはなりませんが、成績が下がるかもし...
//以下に欠席状況を示します。
//ので、心当たり無ければ連絡ください。
//(病欠、公欠、忌引などは0になっているはずですが間違って...
***授業用のフォルダを作る [#l5df9663]
授業の内容を入れておくフォルダを作ってください。Documents...
***出席表明アプリケーション [#s026a135]
以下のアプリケーションで、授業開始に出席表明してもらいま...
- http://is.ocha.ac.jp/~siio/IamAttending.zip
#ref(http://is.ocha.ac.jp/~siio/gyazo/b1128c100d39263a848...
- ダウンロードしてzipを開くと、フォルダになっているかもし...
- 初めて起動する時は、右クリックして、「開く」ボタンを選...
- 今後の授業でも最初に使いますのでわかりやすいところに置...
//|学籍番号|10/4|10/11|10/25|11/8|11/15|11/22|11/29|12/6|...
//|1720501|0|0|0|0|0|0|0|0|0|0|0|0|
** 出来上がったプログラムの提出方法 [#bd9cbbf8]
- フォルダを作ってその中にjavaファイルとclassファイル
//と、取扱説明書ファイルと、それ以外に必要なファイルがも...
を入れてください。
フォルダの中のclassファイルをダブルクリックしたらプログラ...
-このフォルダに名前を付けてください。フォルダの名前は、「...
-このフォルダを圧縮してください
--フォルダを選択してファイルメニューから圧縮を選択します
-圧縮したファイルを以下の手順で
/home/isstaff/siio/Public/Drop Box/.
に提出してください。ターミナル.appからなら
cp 123456siioitiro.zip /home/isstaff/siio/Public/Drop\ Box
としてください。ファインダーからなら、メニューから「移動...
以下のように入力して、移動ボタンを押して、そこに現れるド...
http://is.ocha.ac.jp/~siio/gyazo/dropbox.png
--書き込み専用なので確認できないけどokですかという意味の...
-レポート提出用フォルダは書き込み専用で見ることができませ...
//-授業中でしたら、[[ココを見ると:http://is.ocha.ac.jp/~s...
-同じ名前のフォルダを投げ込むと、エラーになります。という...
*ヒューマンインタフェース2019年度前期 [#o618d6d1]
**ヒューマンインタフェースのレポート [#fa42ea61]
提出は任意です.もし良いレポートを提出いただけたら出席点...
-締め切り2019年8月31日土曜日
-形式分量:A4, ページ数は1-2ページ程度
-提出先・提出方法:PDFにしてsiio@is.ocha.ac.jpまでメール...
-メール表題:ヒューマンインタフェースレポート: 17205XX
メールの標題は「ヒューマンインタフェースレポート: 17205XX...
提出いただいた方はこのページでお知らせします。提出してし...
(提出を確認出来るよう締め切りより早めに提出していただくこ...
//提出状況は、この下に、学籍番号と受理日で案内します。
//もし、学籍番号が公表されたくない場合は、確認用の秘密の...
//学籍番号の代わりにその名前を使います。
//|学籍番号|受理日|
//| 1720505 |2019年8月30日|
//| 1720514 |2019年8月31日|
//| 1720525 |2019年8月26日|
//| 1720529 |2019年8月24日|
//| 1720535 |2019年8月31日|
//| 1720543 |2019年8月31日|
//| sunny |2019年8月31日|
//sunny = 1720534
//|1620515|2018年8月|
//|1620520|2018年8月|
***レポートの課題 [#c9d0add0]
-身の回りの携帯機器、家電製品、機械製品、コンピュータソフ...
-そして、それがなぜ使いにくいのかを、 授業で説明した、 制...
-また,自分ならこのように設計して使いやすくするというアイ...
**出席状況 [#te5cda59]
学部「ヒューマンインタフェース」は出席重視の授業です.そ...
//しておきます.
欠席回数は成績に大きく影響しますので、間違いありましたら...
//公欠届のある日は出席としてあります。
//|学籍番号|4月12日|4月19日|5月17日|5月24日|5月31日|6月7...
//|1620415|出|出|欠|出|出|欠|欠|欠|出|出|出|出|出|4不可|
//|1620501|出|出|出|出|出|出|出|出|出|出|出|出|出|0|
** 講義開催予定 [#p8ec1788]
-4/11
-4/18
-4/25
-4/27 休講(出張)
-5/9 休講(学会出張)
-5/16
-5/23
-5/30
-6/6
-6/13
-6/20
-6/27
-7/4
-7/11 休講
-7/18
-7/25
-8/1 試験週間のため授業はありません
**宿題 [#pb8621ca]
下のリンク先のソースコードをコンパイルして、応答速度を図...
http://is.ocha.ac.jp/~siio/index.php?CSL11HCI#k497ebbd
//**宿題 [#x69779a5]
//
//***GUI黎明期のPC性能を調べてください(2018.4.19) [#ba9db...
//-GUI黎明期PCのCPU名、CPUクロック、メモリ容量、画素数を...
//--現在,Windows を使っている人は,最初の Windows が出荷さ...
//--Mac OS Xを使っている人は,1984に出荷された最初の Macin...
//-今あなたが使っているコンピュータと比較してください.
//-次回の授業(5/17)最初に配布するA5サイズの用紙に各自で記...
//**宿題
//
//***人の反応速度を測定するプログラムを作って測定してくだ...
//-連休明けの授業(5/15)の開始時に、A4, 1枚(両面印刷でも可...
//--用紙の上辺に学籍番号、学年、氏名を1行で書いておいてく...
//-C 言語では,次のようなプログラムで、”hit now”という文字...
//--http://is.ocha.ac.jp/~siio/hci/hitnow.c
//--このプログラムは固定時間(5秒)後にhit nowが表示され...
//-これによりあなたの応答速度を複数回実測して、人の応答速...
//-また個人差や年齢などで結果は変わるかもしれません。周り...
//-また何度も測定することで、習熟して速度が向上したり、そ...
//--そのような現象が観察できたら、これも報告してください...
**教科書 [#ta8dbb5f]
http://ec2.images-amazon.com/images/I/51SsP4P1UiL._SL500_...
http://www.amazon.co.jp/dp/4781912605/
**授業資料 [#s6bf1fc3]
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c1...
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c2...
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c3...
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c4...
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c5...
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c6...
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c7...
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c8...
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c9...
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c1...
(授業開始直前や直後に差し替えされている可能性があります。)
**教科書サポートページ [#b385f64d]
-http://is.ocha.ac.jp/~siio/index.php?CSL11HCI
//**宿題:ボタンを押すたびに点灯/消灯を繰り返す(トグル...
//
//以下は、Arduinoの2ピンに接続された押しボタンスイッチを...
//ちなみにHIGHとLOWはintの値で、int型の変数で保存すること...
//
// int outpin=13; //An LED is connected to ping 13
// int inpin=2; //A switch is connected to pin 2
//
// void setup() {
// // initialize the digital pin as an output and input.
// pinMode(outpin, OUTPUT);
// pinMode(inpin, INPUT);
// }
//
// void loop() {
// if ( digitalRead(inpin) == HIGH) {
// digitalWrite(outpin, LOW); // set the LED on
// }
// else {
// digitalWrite(outpin, HIGH); // set the LED off
// }
// delay(30); // wait for 30 msecond
// }
//**宿題:人の反応速度を測定するプログラムを作って測定し...
//-連休明けの授業(5/8)の開始時に、A5, 1枚に書いて提出して...
//-C 言語では,次のようなプログラムで、”hit now”という文字...
//--http://is.ocha.ac.jp/~siio/hci/hitnow.c
//--このプログラムは固定時間(5秒)後にhit nowが表示され...
//-- 乱数を使って表示までの時間を変える改良をしてもらって...
//-これによりあなたの応答速度を実測して、人の応答速度が 3...
//
//
------
このページについてのお問い合わせはsiio@is.ocha.ac.jpまで。
ページ名: