今から始めるプログラミング6
ところで、解説していないこともたくさんあるかもしれないけれど。Javaプログラミングの技術的には、4までの内容で、僕は初プロジェクトにピンで参加させられた。
3年くらい経歴を上乗せさせられ、そして周りは6大学卒しかいない会社とか、某MSの勧誘を断ったとかいう猛者?の中で専門卒の開発経験のない状態でしたね。正直経歴の上乗せとかほんとやばい慣習ですよね、今でもあるんでしょうか。
とりあえずJavaのプログラミング講習は5日くらい(夕方2時間くらい)で3万円くらいだったと思います。画面的には電卓の劣化版ですね。2つのテキストフィールドと答えのラベル、四則演算のボタンで講習中には実際は一つできるぐらい?というものでした。
VBの方が簡単にできそうでしたし、とくにJavaという特徴は僕にはわかりませんでした。
という感じで車の部品メーカーの研究部門の支援システムだったかな?担当した画面は4つで、2つは簡単なもの(PG3日くらいでできる想定)、残りの2つは中位と難しい画面、PG5日とPG10日くらいの工数として見積もられていた(うろ覚え)感じです。
正直なところ、画面のみてくれは実装できたものの、ビジネスロジックをどう呼ぶとか、全然わかりませんでした。
とはいえ、周りの方がみんないい人だったので、なんとか話を聞いて、ようやく完成させたのですが・・・。
ビジネスロジックとのつなぎでいきなり動きませんでした。配列の形式で受け取らないといけないのですが、受け取るオブジェクトのインスタンスを生成しておかないといけなくて、配列をループで回してnewするというプロセスが抜けていました。
まぁそんな感じです。
現在はスキル合わせとして、だいぶマシな内容になっているとは思いますが、正直なところ、面接というのはスキルよりも相性をみるだけでいいのではないでしょうか?いくらスキルがすごくてもこいつとは合わない、というような人とは仕事が捗ることはないと思いますし、実際この会社「顔」だよね、という現場もたくさんありました。
こういうの書き出すとキリがないので、この辺にしておきますが、まぁ闇は深いですね。
さて、ファイルのリストを表示するプログラムをつくりましたが、今回は画像を選択するようにして、出力画面で画像を表示するというふうに、変更します。
主要なクラスの説明です。
JFileChooser:ファイルやフォルダ選択をさせるためのダイアログを表示するクラスです。
ImageIcon:画像の読み込みとかでいろいろクラスを利用するより、パスの情報から画像アイコンを作れるこのクラスの方が簡単なので、これにしました・・・というか画像処理忘れました・・・すいません。
本来?はImageIOとかBufferedImageなどを使用します。
JLabel:テキストフィールドと違い、表示のみできるコンポーネントです。
JPanel:汎用的なパネルです。パネルのうえにパネルを追加したりできます。複雑な画面構築には必須です。
JScrollPane:画面の大きさと表示するものの大きさが合わない時にスクロールバーを設置して対応しますが、そんな時にこれに貼り付けて大きさを指定すると、合わない場合にスクロールバーが勝手に追加されてくれます。
以上のコンポーネントを使用して以下のようなクラスを作りました。
-------------------------------------------
package sample3;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
/**
* パスを選択する画面
*
* @author matsuiyoshikazu
**/
public class SampleFrame3 extends JFrame implements ActionListener {
/**
* コンストラクタ クラスメイト同じ名前のメソッドです
*/
public SampleFrame3() {
this.setTitle("サンプル3");
this.setSize(new Dimension(300, 200));
this.setLayout(new FlowLayout());
// ボタンのオブジェクト生成
JButton btn = new JButton("画像選択");
// ボタンをリスナーに追加
btn.addActionListener(this);
// ボタンを画面に追加
this.getContentPane().add(btn);
this.setVisible(true);
}
/**
* リスナーのメソッド ファイル選択ダイアログを表示、取得したパスを出力画面に渡します
*
* @Override
*/
public void actionPerformed(ActionEvent e) {
System.out.println("メソッドが呼ばれました");
// ファイルの選択ダイアログを表示するクラスです
JFileChooser filechooser = new JFileChooser();
// 選択の可否をintで返します。キャンセルという選択もあるので、戻り値でまず判断します。
int selected = filechooser.showOpenDialog(this);
//細かく制御すると長くなるので、選択された時のみプログラムします。
if (selected == JFileChooser.APPROVE_OPTION) {
//選択されたファイルを取得します。
File file = filechooser.getSelectedFile();
//選択されたファイルのパスを引数に出力画面を呼び出します。
new OutputFrame(file.getAbsolutePath());
}
}
public static void main(String[] args) {
new SampleFrame3();
}
}
----------------------------------------
以上が入力画面(テキストフィールドは不要なのでとってしまいました。普通は、選択したファイルの名前とかパスをテキストフィールドに入力するようにしますが、次の画面で表示するだけなので、ボタンだけになっています。)です。出力画面は以下です。
OutputFrame
---------------------------------------
package sample3;
import java.awt.Dimension;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
/**
* 画像表示画面
*
* @author matsuiyoshikazu
*
*/
public class OutputFrame extends JFrame {
public OutputFrame(String input) {
readImage(input);
}
/**
* 画像を読み込んだ画像を表示
**/
private void readImage(String input) {
// 引数で画像ファイルのパスが届くのでIconを作成
ImageIcon icon = new ImageIcon(input);
this.setTitle("画像を表示");
//画面の大きさをiconから取得、指定しているのですが///
this.setSize(new Dimension(icon.getIconWidth(), icon.getIconHeight()));
// パネルにラベルを追加して、スクロールにパネルを追加して、ラベルにIconを追加して、画面を表示
JPanel panel = new JPanel();
JLabel label = new JLabel(icon);
JScrollPane scrol = new JScrollPane(panel);
panel.add(label);
this.add(scrol);
this.setVisible(true);
}
}
---------------------------------------
どうですかね、これくらいのコーディングで画像の表示もできてしまうので、意外にノベルゲーム的なものなら、もう少しでできてしまいそうな気がしませんか?
次回は、こんな感じの画面遷移を考えてます的な設計みたいなことをやって、ノベルゲームを作ってみたいと思います。
以下のジャンク品やくだらないプログラムもよろしくです。
コンピュータにまけるプログラミングについて
いずれAIにとってかわられると言われているプログラマーという職業ですが、僕自身はどうかな。と思っています。
僕は現在、好きだったドライバーの仕事ができなくて、地方の工場のラインで働いてますが、プログラミングを仕事にしていたおかげか、「製造」についてのワークフローの最適化については、結構アイデアが出てくるんですよね。
つまり、ものを作る、という業務はプログラミングでの効率化が結構、あてになるんです。
この工程とこの工程は別スレッドなので、同期する必要ないな。
これとこれは依存関係があるので、入れ替えられないな。
どうにもこの作業がクリティカルパスになってるのは、これとこれがコンポジットみたいになってるからかな。
とかとか、結構プログラム的な知識で、気付くことができるんですね。
まぁ、「ソフトウェア」も「もの」には違いないですし、通ずるものがあるんでしょうね。
そして、結構馬鹿な思い込みに支配されていることもあります。
1流企業の下請けの業務委託なのですが、まだまだ非科学的な理論で実行されている工程が多いのが現実です。
日本の教育はレベルが高いというけれど、どうかな?とか思ってしまいます。
データの取り方も、こうすればこの根拠のない手順の裏付けもとれるのになぁなんて思うこともあるのですが、業務委託は完全に下請けで、体制がもう古すぎて、逆に面白すぎです。まぁソフトウェア開発でもお客様は神様を勘違いした関係に陥っているプロジェクトが多かったので、日本人気質なのかもしれませんが。
新しい法律が古い体制を維持するために利用されているのが実際のようです。
ちょっと残念ですが。
まぁそれでもプログラミングの知識は、ソフトウェアを効率よく作っていくためのものなので、そこで利用するツールは、他の物づくりでも応用できるので、もう少し、静的な手法も取り入れるといい方向につながっていくのかな、と思います。
AIとかディープラーニングとかで、データデータを蓄積しよう、はいいのですが、シンプソンのパラドックスに陥らないように。
もうすこし設計の手法もきちんとこなしていいのではないかと感じる今日この頃です。
というか居心地の良かった、長くいたかったプロジェクトは組織的にもクリアでしたね。平等とか理想とはいえ、貫いた方が生きやすいですよ。
今から始めるプログラミング5
前回入力と出力のある画面ができたので、使用しているクラスについて説明します。
といってもjavaDocを参照していただきたいところです。そして日本語がわからなくなる。安心してください。僕もわかりません。
それでも解説すると。
Dimension 幅と高さを表現しています。
FlowLayout コンポーネントを一定の順序で配置します。
ActionEvent ActionListenerをimplementsすると実装しなくてはならないメソッドの引数にいて、イベントの情報を取得できたりします?僕は具体的に何かに使用する時は、Actionのもとに名前を設定して、同じメソッド内で名前でif文での分岐を行ってどのボタンが押されたとか、メニューが選択されたとか違う処理を行っていました。でも後述のクラス分割をすると不要になります。
ActionListener 解説済み
JButton ボタン
JFrame 画面
JTextField テキストフィールド
File ファイルを表現しています。データベースと並んで情報の永続化としてファイルを扱うことが多いと思うので、利用方法を一通り知っておくといいと思います。僕は昔このクラスに関連してFileChooserというクラスでファイルの選択ダイアログを使用することができるのですが、それを知らず、フォルダ選択ダイアログを自作したことがあります。不要とわかった時には微妙な気分でした。
JTable グリッド状のフィールドを作成したい時に使用。結構クセが強い?
以上が、使用したクラスの説明です。
つぎにクラス分割をしてみましょう。
といっても、すでにこのコンポーネント郡はかなり細かくクラスが用意されているので、あまり細かくする必要はなので練習みたいな感じです。
WEBアプリケーションなど応用的なアプリケーション開発においてMVCモデルというモジュールの分割がされているフレームワークが多く、表示と管理、処理を役割分担するのが通例です。もっともMVCではなくMMVCとかMVVCとかちがうそんなんじゃない、みたいなくらいいろいろあるっぽいですが。
僕としては、わかりやすいみやすければいいのでは?ぐらいでいいと思っています。
そんなわけで、ここでは、起動と画面と処理という感じで分けています。
MainClass メインクラス・・・起動について、アプリケーションで環境情報を読み込んだり初期処理を行うことを想定して分けています。ここでは入力画面を表示(コンストラクタを呼び出し)しているだけですが。
InputFrame 入力画面・・・ファイル表示したいパスを入力する画面です。
FileListFrame ファイルリスト画面・・・入力画面で入力されたパスのファイルリストを表示します。
ClosingListener クローズ処理・・・あまり通常こういう分け方しないかもしれないですが、リスナーを実装した別クラスを作りそこに処理を記述しています。閉じるボタンが押された場合の処理クラスです。閉じるボタンで起動します。
FileListListener ファイルリスト処理・・・スペルが逆かな?指定されたパスに所属するファイルのリストアップを行うクラスです。入力画面の表示ボタンで起動します。
以上のクラスのプログラムコードが以下になります。パッケージが飛んでいてすいません。
MainClass
-----------------------------------------
package sample6;
public class MainClass {
/**
* @param args
*/
public static void main(String args){
new InputFrame();
}
}
-----------------------------------------
InputFrame
-----------------------------------------
package sample6;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class InputFrame extends JFrame {
/**
* コンストラクタ
*/
public InputFrame(){
init();
}
/**
* 画面の初期化
*/
private void init(){
//タイトル
this.setTitle("入力画面");
//サイズ
this.setSize(new Dimension(200,100));
//コンテナを取得
Container container = this.getContentPane();
//レイアウトを設定する
container.setLayout(new GridLayout(3,1));
//テキストフィールドを追加
JTextField textField = new JTextField("input path");
container.add(textField);
//表示ボタンを追加
JButton viewButton = new JButton("表示");
//ボタンをリスナーに登録する
viewButton.addActionListener(new FileListListener(textField));
container.add(viewButton);
//閉じるボタンを追加
JButton closeButton = new JButton("閉じる");
container.add(closeButton);
//ボタンをリスナーに登録する
closeButton.addActionListener(new ClosingListener(this, ClosingListener.FLG_EXIT));
//表示をする
this.setVisible(true);
}
}
-----------------------------------------
FileListFrame
-----------------------------------------
package sample6;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTable;
public class FileListFrame extends JFrame {
/**
* コンストラクタ
*
* @param files
*/
public FileListFrame(String files) {
init(files);
}
/**
* 画面の初期化
*
* @param files
*/
private void init(String files) {
// タイトル
this.setTitle("結果表示画面");
// サイズ
this.setSize(new Dimension(200, 300));
// コンテナを取得
Container container = this.getContentPane();
// レイアウトを設定する
container.setLayout(new BorderLayout());
// テーブルを表示(別のメソッドに切り出します。)
JTable table = this.initTable(files);
//コンテナに追加します
container.add(table,BorderLayout.CENTER);
// 閉じるボタンを追加
JButton closeButton = new JButton("閉じる");
//コンテナに追加
container.add(closeButton,BorderLayout.SOUTH);
//リスナーに登録
closeButton.addActionListener(new ClosingListener(this, ClosingListener.FLG_NO_EXIT));
// 表示をする
this.setVisible(true);
}
private JTable initTable(String files) {
// テーブルのオブジェクトを生成します。
// 引数としては行数、と列数を指定します。
JTable table = new JTable(files.length, 1);
// 生成したテーブルに文字列を設定していきます。
for (int i = 0; i < files.length; i++) {
//配列の数だけループします。
//i行目の1列目に文字列を設定しています
table.setValueAt(files[i], i, 0);
}
//設定したテーブルを返します
return table;
}
}
-----------------------------------------
ClosingListener
-----------------------------------------
package sample6;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
public class ClosingListener implements ActionListener {
private JFrame frame;
private int flg = 0;
/**終了しないフラグ**/
public static final int FLG_NO_EXIT = 0;
/**終了するフラグ**/
public static final int FLG_EXIT = -1;
/**
* コンストラクタで画面の参照を渡す
* @param frame
* @param flg
*/
public ClosingListener(JFrame frame, int flg){
this.frame = frame;
this.flg = flg;
}
public void actionPerformed(ActionEvent arg0) {
//画面を閉じる
frame.setVisible(false);
//画面を破棄する
frame.dispose();
if(flg==FLG_EXIT){
//フラグが終了するフラグだったら
//アプリケーションを終了する
System.exit(0);
}
}
}
-----------------------------------------
FileListListener
-----------------------------------------
package sample6;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JTextField;
public class FileListListener implements ActionListener {
private JTextField textField;
public FileListListener(JTextField textField){
this.textField = textField;
}
public void actionPerformed(ActionEvent arg0) {
//表示ボタンの処理
//入力されたテキストフィールドの値を取得
String path = this.textField.getText();
//パスからファイルオブジェクトを生成する
File file = new File(path);
//ファイルオブジェクトからリストを取得
String[] list = file.list();
//結果表示画面のオブジェクトを生成、リストを渡す
new FileListFrame(list);
}
}
-----------------------------------------
長くなりましたが、なんとなくクラスの分割が見えてくれれば幸いです。
もし余力があれば、管理を担当するコントローラを画面と処理の間におく分割をおこなってみてもいいと思います。画面から処理を処理から画面を参照しなくていいコーディングができると、もう上級者といっていいのでは?と思ってしまいます。
というか参照ってなんでしたっけ?という方はググってみてください。なかなか深い世界です。シャローコピーとかディープ子ピーとか。勉強しておいた方がいい知識もあります。
またここで記載したプログラムは結構穴だらけで、アプリケーションとして売り出すにはなかなかに完成度が低いです。
なので次回少しでも完成したアプリケーションに近くなるようなコーディングを紹介させていただければ、と思っています。
今から始めるプログラミング4
クラス分けできました?
まぁ次回で今回の簡単アプリも含めてクラスを細かく分割してみますので、とりあえず入力と出力を別々の画面で実装してみます。
・・・入力する画面でパス(ディレクトリの階層みたいなもの)を入力するとそのパスに含まれるファイルのリストを出力画面で表示する、、、みたいなものをつくります。
まず、入力画面です。
-------------------------------
package sample2;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
/**
* パスを入力する画面
* @author matsuiyoshikazu
**/
public class SampleFrame2 extends JFrame implements ActionListener {
/**テキストのフィールドです
* このクラスのどこでもアクセスできるようにクラスの属性として宣言しています
***/
private JTextField text = null;
/**
* テキストを取得するメソッド
* テキストフィールドはクラス属性なのであまり意味ないかもしれないですが、
* パブリックにアクセスするためにgetterを作りました
* @return 文字列
*/
public String getText() {
if(text==null) {
return null;
}
return this.text.getText();
}
/**
* コンストラクタ
* クラスメイト同じ名前のメソッドです
*/
public SampleFrame2(){
this.setTitle("サンプル2");
this.setSize(new Dimension(300,200));
this.setLayout(new FlowLayout());
//テキストフィールド
text = new JTextField("パスを入力");
this.getContentPane().add(text);
//ボタンのオブジェクト生成
JButton btn = new JButton("実行");
//ボタンをリスナーに追加
btn.addActionListener(this);
//ボタンを画面に追加
this.getContentPane().add(btn);
this.setVisible(true);
}
/**
* リスナーのメソッド
* テキストに入力した値を出力用の画面に渡しています
* @Override
*/
public void actionPerformed(ActionEvent e) {
System.out.println("メソッドが呼ばれました");
System.out.println(this.getText());
new OutputFrame(this.getText());
}
public static void main(String args){
new SampleFrame2();
}
}
-------------------------------
つぎに、出力画面です。
-------------------------------
package sample2;
import java.awt.Dimension;
import java.io.File;
import javax.swing.JFrame;
import javax.swing.JTable;
/**
* ファイルリスト表示画面
* @author matsuiyoshikazu
*
*/
public class OutputFrame extends JFrame{
public OutputFrame(String input) {
createFileList(input);
}
/**
* ファイルのリストを作ります。
**/
private void createFileList(String input) {
File file = new File(input);//Fileのオブジェクトを引数の文字列から
File files = file.listFiles();//引数はパスなので、そのパスに属するファイルのリストを取得します。
JTable table = new JTable(files.length,1);//テーブルを生成します。
for(int i=0;i<files.length;i++) {//生成したテーブルにファイル名をセットしていきます
table.setValueAt(files[i].getName(), i, 0);
}
this.setTitle("ファイルリスト");
this.setSize(new Dimension(300,200));
//テーブルを画面に追加
this.getContentPane().add(table);
this.setVisible(true);
}
}
-------------------------------
どうですか?解説しなければいけないクラスがたくさん出てきているのですが、結構少ないプログラムで入力画面から出力画面へ遷移するようなプログラムが作れました。
javaって簡単でいいです!と思えませんか?
とりあえず今回はこんな感じで。
次回詳しく解説しますね。クラス分割についても。
くだらなくて楽しい?プログラムを公開しています。よろしかったらどうぞ
今から始めるプログラミング3
さて前回のプログラムの解説です。
以下のようなクラスを作りました。
SampleFrameクラス
------------------------------------
package sample1;package sample1;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
/** * とりあえず画面を表示するだけならこれだけでOK
* @author matsui yoshikazu
*
*/
public class SampleFrame extends JFrame {
/** * コンストラクタ
* クラス名と同じ名前のメソッドです
*/
public SampleFrame(){
this.setTitle("サンプル");
this.setSize(new Dimension(300,200)); this.getContentPane().add(new JButton("ボタンに見えないけどボ・タ・ン"));
this.setVisible(true);
}
public static void main(String args){
SampleFrame frame = new SampleFrame();
}
}
-------------------------------------
せんせー違うでー。
という声が聞こえそうです。すいません。少し組み替えて遊んでました?
クラスはプロパティとメソッドをもつ、というのは基本として大抵、書籍に書かれていることですが、前回のプログラムも今回のプログラムも、実はちょっと特別です。
どう特別かというと、まずmain(メイン)メソッドというものです。
javaのプロジェクトに参加して、まず成果物(自分の担当作成したプログラム)として作るクラスにmainメソッドは含まれません。
どういうことかというと、基本的にひとつのアプリケーションでmainメソッドはひとつ、もしくは、WEBアプリのコンテナ(サーブレットコンテナやDIコンテナ詳しくは後ほど・・・解説しないかもですが)から呼び出される場合、mainメソッドすらないので、複数メンバーで作る場合、mainメソッドを含むプログラムをいじる機会はありません。
とはいえ、自分だけで作る場合、mainメソッドがないと単体で動かせないので、作成しています。そして、前回のプログラムでは、クラスの中身がmainメソッドしかなく、mainメソッドにプログラムを記述していました。
つぎに、今回のプログラムではコンストラクタというメソッドを使っています。コンストラクタはクラス名と同じ名前で、「戻り値」が設定されていません。
コンストラクタは、オブジェクトがインスタンスかされる時に必ず呼び出されるメソッドで、newというキーワードのあとにクラス名を指定してクラスの型のオブジェクトに代入している箇所で、実行されています。なので、プログラムの初期処理などに利用します。まぁ、init()メソッドなど初期化用のメソッドを作って、コンストラクタからはそのメソッドを呼び出すべき、ともされます。
なので、今回のプログラムでは、mainメソッドではSampleFrameをnewするだけにして、コンストラクタにフレームの初期表示を行うプログラムを記述しました。それにともない、オブジェクトは自分自身になるので、thisというキーワードに置き換えています。
SampleFrameはJFrameなので、JFrameのメソッドをthis.method()という形が成り立つわけです。
とくにJFrameのメソッドをオーバーライドしているわけではないので、superでも同じ動きをします。
こんな感じで、メソッドというものがなんだかふんわりとわかったようなわからないような感じになれば、今回の学習目標はクリアしたも同然です。
というわけで、ボタンに処理を加えます。
Javaの画面処理ではListnerという仕組みで、イベント処理を実現します。汎用的なActionListnerやキーボード入力のKeyListenerというものを実装します。正確にはインターフェースとか、イベント駆動とかいろいろ勉強することはあるのですが、このリスナーを実装すれば、ボタンをおして何かする、というプログラムを作ることができる、ということです。
追加したプログラムです。
-----------------------------------
package sample1;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
* とりあえず画面を表示するだけならこれだけでOK
* @author matsui yoshikazu
*
*/
public class SampleFrame extends JFrame implements ActionListener {
/**
* コンストラクタ
* クラスメイト同じ名前のメソッドです
*/
public SampleFrame(){
this.setTitle("サンプル");
this.setSize(new Dimension(300,200));
//ボタンのオブジェクト生成
JButton btn = new JButton("ボタンに見えないけどボ・タ・ン");
//ボタンをリスナーに追加
btn.addActionListener(this);
//ボタンを画面に追加
this.getContentPane().add(btn);
this.setVisible(true);
}
/**
* 実装するメソッド
* @Override
*/
public void actionPerformed(ActionEvent e) {
System.out.println("メソッドが呼ばれました");
}
public static void main(String args){
new SampleFrame();
}
}
-----------------------------------
Listenerはインターフェースなのでimeplementsします。
するとeclipseがメソッドがたりねーみたいなエラーを表示するので、メソッドを追加します。actionPerformed()というのがそれです。actionPerFormedにはボタンが押された場合の挙動を記述します。ここではシステムコンソールに文字列を出力しています。
つぎに、ボタンをリスナーに反応するように変更します。
画面に追加するメソッドでボタンをnewしていましたが、これだとボタンにちょめちょめできないので、手前でボタンのオブジェクトを作ります。そして、リスナーに追加してあげています。
一通りプログラムを記述したら、実行してみましょう。
ボタンを押すとコンソール(eclipseの下の方ですね。レイアウトが違っていたらすいません)に設定した文字列が表示されますでしょうか?
どうでしょう?
ダメな人はプログラムを見直してみましょう。
課題?ではないですが、JFrameを継承したSampleFrameとActionListnerを実装したSampleActionという2つのクラスに分割してつくるというのはどうでしょうか?このコード量でクラス分割もいらないかもしれませんが、役割分担の練習としてはいいかな、と思います。
調べ物をしましょう。
あと、前述のイベント駆動とかインターフェースとか出てきた用語をググってみるのは、最初のノウハウの実践にもなります。検索大好きになりましょう。
次は入力画面と結果画面のあるアプリケーションを作ってみましょう。
最後に、ブースというサービスでとてつもなくくだらないサンプルなどを公開していますので、よろしくお願いします。
今から始めるプログラミング2
こんばんはよっちゃんです。
eclipseはインストールできましたでしょうか?
という前提で。
実は最初のプロジェクトの途中までは、JBuilderというVBでいうところのVisualStudioのようなアプリケーションで開発をしていました。
eclipseではなかったのです。最もプロジェクトでは特に開発環境の指定はなかったので、各々が個人で使いやすいツールをという感じでした。
まぁ僕も画面のレイアウトを作る以外にはJBuilderを使いことはなかったです。
まぁそんなわけで、eclipseの左の窓で右クリックするとそこで可能な操作のリストのような画面が開くので、new→Java Peojectを選択します。
そうするとJavaのアプリケーション開発に必要ないろいろ設定する画面が開きます。
とりあえず「sample」とでも入力して「Finish」を押下します。
押下・・・普通使わない言葉ですよね。「おうか」と読みます。「おしした」「おしげ」とかではありません。
ボタンを押下とかクリックみたいな使い方をします。IT業界用語ですかね?
すると何やらWindowsのフォルダのようなものができました。そこにアプリケーションを構成するプログラムを作り込んでいくわけです。
「src」というのは「source」→ソース、元という感じです。javaはコンパイルという過程が必要な言語です。どういう過程かというと、我々の理解するプログラム言語から、機械の理解する機械語に変換する過程をいいます。プログラムの実行形式にいくつかパターンがあり、大きく「プログラムを逐一実行する形式=インタプリタ」と「翻訳をしてから実行しる形式=コンパイラ」というものがあります。正確にはもうちょっと違う点があるのですが、ここではそこまで詳しくは書きません。
なので我々は自分の役割であるところの、プログラミングに集中できる、というわけです。
そのプログラミングしたものクラスを「src」に保存していく感じです。整理の下手な僕のために用意してくれた!くらいに思えばいいのかな?
とりあえず、今回は、そこに「sample1」というパッケージを作成して、「SampleFrame」という画面クラスを作ります。。
パッケージというのは、フォルダのことです。というと正確には語弊があるのかもしれませんが、僕にとっては全く違いがわからないぐらいのものなので、なんで違うネーミングにするんだよ、と思ってしまうのは置いておいて、要は整理するためのものです。WEBアプリケーションだとわかりやすく、このパッケージをドメインに当てはめていくのですが、画面アプリにURLは関係ないので、こだわる必要はとりあえずありません。ということで、srcのところで右クリック「new」→「package」を選択、名前を「sample1」とします。
そして、作成したsample1パッケージの上で右クリックから同じように「new」→「Class」を選択して、名前を「SampleFrame」にしてください。
以下のプログラムコードをコピーして貼り付けます。
---------ここから-----------------------------
package sample1;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
* とりあえず画面を表示するだけならこれだけでOK
* @author 自分の名前
*
*/
public class SampleFrame extends JFrame {
public static void main(String[] args){
SampleFrame frame = new SampleFrame();
frame.setTitle("サンプル");
frame.setSize(new Dimension(300,200));
frame.getContentPane().add(new JButton("ボタンに見えないけどボ・タ・ン"));
frame.setVisible(true);
}
}
---------ここまで-----------------------------
コピペできましたか?なにやら赤い波線が出てエラーが出ているよ!という方は、コピペしたのでパッケージか何かがダブってるとか、若干スペルが違うとか、そんな感じだと思うので、波線のメッセージをよく見てみましょう。
エラーが全て消えたら、保存(Ctrl+SもしくはCommand+Sですかね?)して早速動かしてみましょう。上のメニューみたいなところに再生ボタンのようなものは見えますでしょうか?
見えたらクリックしてください。
ただの四角い画面がひょうじされて、「ボタンに見えないけどボ・タ・ン」と表示されていませんか?
表示されていたら、画面表示成功です。
ここでの学習目標は達成です。
簡単なコードで画面表示までできちゃった!ぐらいの認識でいいと思います。あとはパッケージとクラスをつくる。とかとか。
次回は画面のコード解説をしつつ、ボタンに処理を実装してみます。
今から始めるプログラミング1
はじめましてよっちゃんです。
ITスキルといえばプログラミングですね。
僕は友達がみんなパソコンに詳しくて、自分も真似しようと思ったのですが、なかなかみんなのようにはうまくいかなくて、
システム開発の業界に転職したのが20代後半という遅咲き?のエンジニアでした。
そんな状態でも、5年目くらいに大手自動車メーカーのシステム開発に、しかもマネジメントがメインの仕事をするようになれたのも、このIT業界の魅力ですね。
もしこの時に直受けで仕事ができていたら、月100万を軽く超える収入になっていました。(予算も見れたので)
まぁそれはなかなかありえないのですが。。。その辺の裏話なども踏まえつつ、僕がスキルアップできた原動力の部分をブログに綴り、皆様のお役に立てたら嬉しい限りです。
僕は、メインでJavaというプログラム言語を仕事に使っていました。というかCOBOLというプログラム言語を学んでいたのですが、システム会社に入ってからCOBOLの案件に参入できなくて、その頃あたらしく台頭してきた言語がJavaで1週間くらいセミナーに参加させていただいたのち、自動車部品メーカーのシステム開発に滑り込んだのが、最初のプロジェクトでした。
そしてそこで携わったのが、クライアントサーバという形態のシステムだったのですが、javaでその画面を開発しました。
概要としては、データベースサーバーを別に立てて、クライアントの画面プログラムからデータベースにアクセスして、色々行う、というものです。javaといえば、WEBアプリケーション、と思う方が多いと思いますが、その通りです。
javaといえばWEBアプリケーションが8割以上だったのでは?と思います。組み込みもあったのかもしれませんが。ただの僕の主観ですね。
そんな中でjavaで画面アプリケーションの開発を行い、自分の基礎が出来上がった。そんな感じです。
画面アプリのいいところは、スタンドアロン、つまり自分の環境だけですぐに動作確認ができるところです。
もちろんデータベースを別個に立てるとかファイルはネットワーク経由で保存している、なんていうプロジェクトもありますので、それだけでは仕事にはならない場合もありますが、プログラミングを勉強する、という点に関してのみ着目すれば、これはとてもいい環境です。
長くなりましたが、まず準備が必要です。
プログラム開発に「必須」なものは実は少ないのですが、プログラムの勉強に必要なものは、少し多いかも?しれません。
eclipseというjava言語(に限らないですが)でのシステム開発に最適なツールをパソコンにインストールする。
それだけでOKです。
プログラムの勉強の準備はできましたか?
できないよ!
という声が聞こえそうですが、できなかった方は、「ぐぐって」ください。
「eclipse」だけでもいいですし、「eclipseのインストール」とか、「eclipse win」「eclipse mac」そんなかんじで自分のパソコンのOSを絡めてもいいと思います。
とにかく、「わからんことはググれ!」ということは、最初のプロジェクトで言われました。
なので、ここでの到達目標は「ググって準備完了させる」までです。
親切ではなくてごめんなさい。でもなるべく自分の経験をトレースしたほうが、いいのでは?と考えた末の内容なので、これでいきたいと思います。
ちなみに、僕はjava案件に参入前にセミナーを受講してるので、それは?と思われる方もいらっしゃるかもしれませんが、案件に入るにあたり、全く役に立たなかった、と思うくらい挫折感を味わっているので、セミナーの内容は記事には書きません。いやほんと。それでも少し書くと、たしか電卓を作るみたいな感じ。