Java Basic Swing Level 2〜画面作成の基本的なところ〜

イントロダクション

前回は、ちょこっとだけSwingの概要に触れました。

Java Swing はOracleのチュートリアルもあるのでそちらも参考にしながら学習できます。

JFCとスイング

参考サイトによると、以下のような説明がありました。


JFC は Java Foundation Classes の略で、グラフィカル ユーザー インターフェイス (GUI) を構築し、豊富なグラフィック機能と対話性を Java アプリケーションに追加するための一連の機能を網羅しています。

他にも、JavaFXでも画面作成ができます。こちらはSceneBuilderというツールを使用して画面の作成ができます。

SceneBuilder1

SceneBuilder2

Swingは

画面を作成できるAPIでも、JavaFXと違い、JDKに同梱されているもので、JavaFXよりも細かい部分を操作できる。
※筆者の感想です。

Swingの基本構成

前回記載した様に土台がありその上にコンポーネントを配置します。

  • JFrame, JDialog, JAppletの3クラスが土台になる
  • Jlabel, JPanel, JTextField...etcはラベルやボタンなどの部品
// 土台クラス
JFrame frame = new JFrame("FirstSwing");
// 土台のコンポーネントを載せる部分(位置などは後で指定する)
// コンテナーと呼びます
Container con = frame.getContentPane();
//コンテナの大記載をしています
con.setSize(300, 300);
// コンテナの上にラベルを配置します
con.add(new JLabel("Hello Swing"));
// 土台の上に乗せたものをおきます
frame.setContentPane(con);
// お約束ごとで閉じる時にこのクラスの起動を終了する設定など。。。
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
// 画面を表示する設定→これをFALSEにすると画面が非表示になる
frame.setVisible(true);

ソースはここからダウンロードできます。

Swingのイメージ




上記の図は、参考サイトから失敬しています。この図のように、JFrameの上にJMenubar, Contentpaneの上に黄色のラベルがのっかっていて
左側のように表示されています。

これから作成するアプリも、同様な形で作成されます。

JFrameの使い方

JFrameクラスでは、上の図のようにコンポーネント(画面の部品)を載せる(追加する)のにはContentPaneを使用して追加します。
下のコードでは、フレームにラベルを追加する処理を行っています。

JFrameをインスタンス化

JFrame frame = new JFrame();
Container cont = frame.getContentPane();
cont.add(new JLabel("ラベル1"));

そして、起動時に終了するときの処理「画面を閉じたらプログラムを終了する設定」と
フレームを表示する処理を行っています。
frame.pack()はコンポーネントのサイズにフレームを合わせる処理です。

// お約束ごとで閉じる時にこのクラスの起動を終了する設定など。。。
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
// 画面を表示する設定→これをFALSEにすると画面が非表示になる
frame.setVisible(true);

JFrameにコンポーネントを追加

下のコードは、チュートリアルにあるコードです。

frame.getContentPane().add(yellowLabel, BorderLayout.CENTER);

このコードをわかりやすく書くと下のようになります。全体のコードはこちらにありました。

JFrame frame = new JFrame();

Container con = frame.getContentPane();

JLabel yellowLabel = new JLabel();
yellowLabel.setOpaque(true);
yellowLabel.setBackground(new Color(248, 213, 131));
yellowLabel.setPreferredSize(new Dimension(200, 180));

con.add(yelloLabel);

もっとたくさんの部品を追加したい場合は、JPanelを使用して、JFrame -> JPanel -> そのほかの部品のような関係で部品(コンポーネント)を追加します。

//Create a panel and add components to it.
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.setBorder(someBorder);
contentPane.add(someComponent, BorderLayout.CENTER);
contentPane.add(anotherComponent, BorderLayout.PAGE_END);

やはり、プログラムを組んだ時の完成図はイメージするしかないので、下のようなイメージを持つとわかりやすいと思います。

サンプルコード

参考サイトはこちらです。

/** An application that requires no other files. */
public class GlassPaneDemo {
    static private MyGlassPane myGlassPane;

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("GlassPaneDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Start creating and adding components.
        JCheckBox changeButton =
                new JCheckBox("Glass pane \"visible\"");
        changeButton.setSelected(false);

        //Set up the content pane, where the "main GUI" lives.
        Container contentPane = frame.getContentPane();
        contentPane.setLayout(new FlowLayout());
        contentPane.add(changeButton);
        contentPane.add(new JButton("Button 1"));
        contentPane.add(new JButton("Button 2"));

        //Set up the menu bar, which appears above the content pane.
        JMenuBar menuBar = new JMenuBar();
        JMenu menu = new JMenu("Menu");
        menu.add(new JMenuItem("Do nothing"));
        menuBar.add(menu);
        frame.setJMenuBar(menuBar);

        //Set up the glass pane, which appears over both menu bar
        //and content pane and is an item listener on the change
        //button.
        myGlassPane = new MyGlassPane(changeButton, menuBar,
                                      frame.getContentPane());
        changeButton.addItemListener(myGlassPane);
        frame.setGlassPane(myGlassPane);

        //Show the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

/**
 * We have to provide our own glass pane so that it can paint.
 */
class MyGlassPane extends JComponent
                  implements ItemListener {
    Point point;

    //React to change button clicks.
    public void itemStateChanged(ItemEvent e) {
        setVisible(e.getStateChange() == ItemEvent.SELECTED);
    }

    protected void paintComponent(Graphics g) {
        if (point != null) {
            g.setColor(Color.red);
            g.fillOval(point.x - 10, point.y - 10, 20, 20);
        }
    }

    public void setPoint(Point p) {
        point = p;
    }

    public MyGlassPane(AbstractButton aButton,
                       JMenuBar menuBar,
                       Container contentPane) {
        CBListener listener = new CBListener(aButton, menuBar,
                                             this, contentPane);
        addMouseListener(listener);
        addMouseMotionListener(listener);
    }
}

/**
 * Listen for all events that our check box is likely to be
 * interested in.  Redispatch them to the check box.
 */
class CBListener extends MouseInputAdapter {
    Toolkit toolkit;
    Component liveButton;
    JMenuBar menuBar;
    MyGlassPane glassPane;
    Container contentPane;

    public CBListener(Component liveButton, JMenuBar menuBar,
                      MyGlassPane glassPane, Container contentPane) {
        toolkit = Toolkit.getDefaultToolkit();
        this.liveButton = liveButton;
        this.menuBar = menuBar;
        this.glassPane = glassPane;
        this.contentPane = contentPane;
    }

    public void mouseMoved(MouseEvent e) {
        redispatchMouseEvent(e, false);
    }

    public void mouseDragged(MouseEvent e) {
        redispatchMouseEvent(e, false);
    }

    public void mouseClicked(MouseEvent e) {
        redispatchMouseEvent(e, false);
    }

    public void mouseEntered(MouseEvent e) {
        redispatchMouseEvent(e, false);
    }

    public void mouseExited(MouseEvent e) {
        redispatchMouseEvent(e, false);
    }

    public void mousePressed(MouseEvent e) {
        redispatchMouseEvent(e, false);
    }

    public void mouseReleased(MouseEvent e) {
        redispatchMouseEvent(e, true);
    }

    //A basic implementation of redispatching events.
    private void redispatchMouseEvent(MouseEvent e,
                                      boolean repaint) {
        Point glassPanePoint = e.getPoint();
        Container container = contentPane;
        Point containerPoint = SwingUtilities.convertPoint(
                                        glassPane,
                                        glassPanePoint,
                                        contentPane);
        if (containerPoint.y < 0) { //we are not in the content pane
            if (containerPoint.y + menuBar.getHeight() >= 0) { 
                //The mouse event is over the menu bar.
                //Could handle specially.
            } else { 
                //The mouse event is over non-system window 
                //decorations, such as the ones provided by
                //the Java look and feel.
                //Could handle specially.
            }
        } else {
            //The mouse event is probably over the content pane.
            //Find out exactly which component it is over.
            Component component = SwingUtilities.getDeepestComponentAt(
                                        container,
                                        containerPoint.x,
                                        containerPoint.y);

            if ((component != null) 
                && (component.equals(liveButton))) {
                //Forward events over the check box.
                Point componentPoint = SwingUtilities.convertPoint(
                                            glassPane,
                                            glassPanePoint,
                                            component);
                component.dispatchEvent(new MouseEvent(component,
                                                     e.getID(),
                                                     e.getWhen(),
                                                     e.getModifiers(),
                                                     componentPoint.x,
                                                     componentPoint.y,
                                                     e.getClickCount(),
                                                     e.isPopupTrigger()));
            }
        }

        //Update the glass pane if requested.
        if (repaint) {
            glassPane.setPoint(glassPanePoint);
            glassPane.repaint();
        }
    }
}

サンプルコード解説

上記のプログラムを解説します。まずはこのようなプログラムを見るときにメインメソッドを探します。
理由は必ずメインメソッドが動くからです。

メインメソッド

public static void main(String[] args) {
    //Schedule a job for the event-dispatching thread:
    //creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}

単純にcreateAndShowGUI()を起動しているだけですね。細かいところを言うと、こちらのサイトにあるように「イベントディスパッチスレッドで非同期的に実行させます。」ということなので、重い処理は後から非同期で実行する設定だと思ってもらえれば、OKです。
言葉を変えるならば、非同期で処理を実行するので画面の描画中にほかの処理も残ったリソースで実行してくれる設定をしているということです。

createAndShowGUI()

JFrameを生成して、CheckBoxとMenubarを生成。JButtonも同様に生成。

JFrame frame = new JFrame("GlassPaneDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//Start creating and adding components.
JCheckBox changeButton =
new JCheckBox("Glass pane \"visible\"");
changeButton.setSelected(false);

//Set up the content pane, where the "main GUI" lives.
Container contentPane = frame.getContentPane();
contentPane.setLayout(new FlowLayout());
contentPane.add(changeButton);
contentPane.add(new JButton("Button 1"));
contentPane.add(new JButton("Button 2"));

//Set up the menu bar, which appears above the content pane.
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("Menu");
menu.add(new JMenuItem("Do nothing"));
menuBar.add(menu);
frame.setJMenuBar(menuBar);

インナークラスである「MyGlassPane」はフィールド変数に定義、最終的には、JFrameにセットしている(setGlassPane())

//Set up the glass pane, which appears over both menu bar
//and content pane and is an item listener on the change
//button.
myGlassPane = new MyGlassPane(changeButton, menuBar,
frame.getContentPane());
changeButton.addItemListener(myGlassPane);
frame.setGlassPane(myGlassPane);

途中「changeButton.addItemListener(myGlassPane);」では、「項目選択イベントが発生すると、リスナー・オブジェクトのitemStateChangedメソッドが呼び出されます。」ので、「項目の選択」を行ったときの処理を行うのは「itemStateChanged()」でありますよ。と設定しています。
ちなみに、ItemListenerのメソッドをitemStateChangedはオーバーライドしています。

class MyGlassPane extends JComponent implements ItemListener { 
    //React to change button clicks.
    public void itemStateChanged(ItemEvent e) {
        setVisible(e.getStateChange() == ItemEvent.SELECTED);
    }
}

他の部分は、マウスリスナー(マウス操作時の処理)を定義しています。

でわでわ。。。

関連ページ一覧

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

Java Basic Swing〜Javaで画面アプリを作る。〜

イントロダクション

java.swingパッケージを使用した。画面作成をやります。Java SwingはJava開発をするためにインストールしたJDKの中に入っているので外部のライブラリをインストールして。。。Mavenで依存関係を記述して。。Gradleでインポートして。。。などの手間がありません。

このパッケージ(Swingフレームワーク)はクラス→画面コンポーネント(ラベルや、テキストフィールドなど)になるのでクラス・オブジェクトの扱いを理解するのにとても役立ちます。

Swingについて

画面作成用のフレームワークで、どこに何のクラスを使用するか?が決まっています。

Swing is java frame work to make view. And defind components to use part of view.

詳細はドキュメント(英語)を見てください。

https://docs.oracle.com/javase/tutorial/uiswing/components/index.html

JFrameクラスを継承すると。。。

 Swingの部品構成

画面を作る時は以下の順で画面コンポーネント(部品(ボタンなど))を置いていくイメージです。

Swing components based on “JFrame” or “JDialog” I think ... And put on components one.

<イメージ>

画面の1番下に土台を置きます。(JFrame, JDialo, JAppl

そして、土台の上にはボタンやラベルなどを置きます。これらの部品は土台になる部品とは親クラスが違います。※土台になる部品とボタンなどの部品は別物だと思ってくれればOK

実際の実装は今後やります。

I will write a ample code next blog...

サンプル(sample)

// フレーム(土台)
JFrame frame = new JFrame(“土台”);

// 部品を乗せるスペース=コンテナー
Container con = frame.getContentPain();

// パネル(これもコンテナーフレームより上に乗っかるもの)
JPanel panel = new JPanel();
// パネルにコンポーネントを追加
panel.add(new JLabel("ラベル1"));

// コンテナーにパネル(これもコンテナー)を追加する
con.add(panel);

文字表現ですが、下のようにコンポーネント(画面の部品)を追加して画面を作成します。

  1. フレーム
  2. パネル
  3. ラベルやテキストフィールドなど※チェックボックスなどもある

JLabelを表示する

JLabelを表示する、ハローワールド的なプログラムです。
コメントに処理内容を記述していますが、大まかに土台の上にラベルを載せて表示しているというところです。

ラベル以外のコンポーネント(パネルやフレームを含むすべての画面部品のこと)もAPIで用意されています。※ドキュメント自体は英語ですが、Google翻訳で十分に読めるものでした。

public static void main(String[] args) {
    // 土台クラス
    JFrame frame = new JFrame("FirstSwing");
    // 土台のコンポーネントを載せる部分(位置などは後で指定する)
    // コンテナーと呼びます
    Container con = frame.getContentPane();
    //コンテナの大記載をしています
    con.setSize(300, 300);
    // コンテナの上にラベルを配置します
    con.add(new JLabel("Hello Swing"));
    // 土台の上に乗せたものをおきます
    frame.setContentPane(con);
    // お約束ごとで閉じる時にこのクラスの起動を終了する設定など。。。
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    // 画面を表示する設定→これをFALSEにすると画面が非表示になる
    frame.setVisible(true);
}

Swingを使用して作成したアプリケーションです。「テキストRPG」といいます。

まとめ

つまるところは、Java Swingを使用すると、TextRPGのようなGUIアプリケーションが作成できます。そして、JavaはほとんどのPCで起動できるのでラズパイなどでも起動できマス。
今回は、画面を作成して文字を表示するためのラベルを使用してみました。HTMLで使用するフォーム部品もSwingで使用することができるのでブラウザではなく単体のアプリケーションとして作成することができます。起動するときは「実行可能JAR」というファイルに変換してやれば、ダブルクリックで起動することができます。

関連ページ一覧

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

Java Basic Swing 〜ラズパイの画面作成 〜

イントロダクション

前回は、JavaFXでの画面を作成しようと試みましたが、XWindowを使用するという時点でイマイチ。。。ということになり(自分の中で)

java.swingで実装してみようとなりました。

試みとしては、「CUIでのインストールしたRPiに画面をJavaで作成する」というのが今回の目的です。。。一応、これもダメだったらC++で作成します。

予定を変更してNo画面アプリを作成する方向にシフトします。

ちなみにC++でやるときはQtを使用します。※ java.swing.*で出来ない時です。。。

そして、java.swingでの実装はオブジェクト指向の良い勉強になります。→別の機会にやります。

自分はオブジェクト指向の基本をこのパッケージ(java.swing)で理解しました。

Introduction

I had tried create view on RPi using JavaFX. But it not can be, cause we have to execute GUI mode. That's why change plan to create app of no view.

And, studing java.swing.* is good for study java and object-orientation.

I understood object-orientation becouse studied java.swing.*.

サンプル実装

本当に簡単ですが、サンプルコードです。

This is a simple sample of swing program.

package jp.zenryoku.sample.swing;

import javax.swing.*;
import java.awt.*;

public class PracSwingMain extends JFrame {
    public static void main(String[] args) {
        JFrame frame = new JFrame("FirstSwing");
        Container con = frame.getContentPane();
        con.setSize(300, 300);
        con.add(new JLabel("Hello Swing"));
        frame.setContentPane(con);
        frame.pack();
        frame.setVisible(true);

    }
}

実行結果とソースのキャプチャです。※右上の「Hello Swing」という部分がSwingで作成した画面です。

昔のSWINGとは違っている様なので、復習が必要です。。。

Java Swingで動かしてみました(Execute Swing Program)

ダメでした。。。Swingでの実装も以下の様なエラーが出ます。

Rpi3では起動した様なのですが。。。自分のはRpi2。。。

CUI上でGUIアプリは起動できないのか?ちょいと調査します。→ No画面アプリ作成にシフトします。→フレームバッファを調査します。

But I can not see java view. out error as below.

java.awt.HeadlessException: 
No X11 DISPLAY variable was set,
but this program performed an operation which requires it.

Cause of this Exception, it is need setting "Frame Buffer". I think....I will investigate one.

その後(after)

結局は、ラズパイにXFCE4を入れて Swingを起動する方向になりました。

As result... I will try to install XFCE4 on RPi and execute Swing.

http://zenryokuservice.com/wp/2018/09/30/rpi-java-swing〜ラズパイにjava-swingアプリを起動する〜/

[rakuten ids="juju-shop:10000216"]

関連ページ一覧

  1. ラズパイ SSH接続メモ
  2.  ラズパイ Under-voltage detected! 〜エラー対処〜
  3.  ラズパイ(CUI)セットアップ
  4.  RPi Settingup Wifi in CUI ~ラズパイ CUI Wifi接続~
  5. Memos about Settingup RPi ~使用したコマンドメモ~
  6. RPi and JavaFX sample of deployment 〜ラズパイにサンプルデプロイ〜
  7.  RPi JavaFX execution ~ラズパイ JavaFX自動起動~
  8. RPi Install Git 〜ラズパイにGitのインストール〜
  9. RPi Java Swing〜ラズパイにJava Swingアプリを起動する〜※失敗しています。。。」
  10. RPi Maven Install 〜ラズパイでMeven
  11. Install XFCE4 on RPi 〜ラズパイに高速軽量デスクトップインストール〜

 



Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

Java Basic Level 10 〜While statement 〜

イントロダクション

再度、復習の意味で以前記載したものを再度やります。
今回はfor文の使い方をやります。
お待ちかねのループ処理です。ロジックを楽しんでください。

Introduction

I will write again what how to use value of boolean. And Tihs time, Write about Application of If statement.
It is loop statement you like. enjoy create logic.

ロードマップ

  1. Booleanの扱い方
  2. If文の使い方
  3. If文の使い方〜応用編〜
  4. ループ処理〜For文〜
  5. ループ処理〜For文の応用〜
  6. ループ処理〜While文〜今回
  7. ループ処理〜While文の応用〜
  8. ループ処理〜Do While文〜
  9. ループ処理〜Do While文の応用〜
  10. 演算子の整理
  11. 演算子の応用
  12. まとめ

Road Map

  1. How to use Boolean
  2. How to use if statement
  3. Training of  if statement
  4. How to use for statement
  5. Training of for statement
  6. How to use while statement This time
  7. Training of while statement
  8. How to use do while statement
  9. Training of do while statement
  10. Summary of operator
  11. Training of operator
  12. Summary of all

While文の書き方

while ( 条件式 ) {
// 繰り返し処理
}

これだけです。でも条件により、このループを抜けるための条件を「繰り返し処理」の中に記述する必要があります。いかにサンプルを示します。

while(num <= 3) {
   // numが3以下の間ループ
   System.out.println("ループ" + num + "回目");
   // numをインクリメントする
   num++;
}

以上です。というのは冗談で。。。
今までの復習もかねて、考え方の例を示します。

<無限ループの例>

<無限ループの例2>

while文でループする

今回は、算数的なプログラミングをやろうと思います。

<例題>
1~10までの合計値を計算するプログラムを作成して実行する

こんな問題があったとしましょう。これを実装するのにどこから考えたらよいか?
「1~10までの合計値を計算する」にはどうしたらよいか?と考えます。そのままでした。。。
もう少し分解します。
「1~10まで数値をカウントアップするには、どうしたらよいか?」を考えいます。
そうすると、「ループ文が使えるじゃん」と直感する人もいると思います。筆者の場合は経験値で「このパターンね。。。」となります。
頭のいい人はどちらかというと前者、そうでない人は何度も頭をひねった結果の経験値になります。両方持っている方が強いですよね?

まずは基本を押さえる

ここで重要なのは、「論理式」です。具体的には、while文のかっこの中です。

while(論理式) {
  // 何かしらの処理
}

ここの論理式が「TRUE」の間ループが続きます。なのでBoolean型の変数を理解しましょう。
Boolean型の値を返すのが「論理式」です。具体的には下のようなコードです。「!(エクスクラメーション)」がつくと反対になります。
具体的には「TRUE」が「FALSE」になり、「FALSE」が「TRUE」になります。

boolean isTrue = 1 == 1;
boolean isTrue2 = "1".equals("1");
boolean isFalse = 1 != 1;
boolean isFalse2 = !"1".equals("1");

<Booleanの解説>

<AND ORの解説>

<While文の解説>

変数をカウントアップ

ループ文でセットになるのが「カウンター」です。何回ループしたのか?を情報として持っておきます。FOR文ではこれがセットになっています。

for (int i = 0; i < XX; i++) {
   // 何かしらの処理
}

しかし、While文では別個に用意してやればよいので下のようになります。

int i = 0;
while (i < XX) {
  // 何かしらの処理
}

ここまで書いたら、変数「i」が0からXXまでカウントアップされることがわかると思います。

ループ条件を「i < 10」とすれば、iの値を加算していくと0~9までの合計値を算出することができます。

しかし、問題では「1~10」なので。。。どうすればよいでしょうか?ちなみに、現状では変数「i」はカウントアップされません。
なぜでしょうか?

次回はWhile文の練習をします。
でわでわ。。。

How to write "While statement"

while("Conditional expression") {
    // while num is 3 or less
    System.out.println(num + "times loop");
    // increment "num"
    num++:
}

that's all...
Next, we will  train "while statement".

see you next time. hava a good day!

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜


Java Basic Level 8.5 〜配列(Array)の使い方:補足〜

イントロダクション

For文の学習を始めたのは良いけれど、配列の知識が必要なので急遽配列の勉強をします。
主に、配列はたくさんのデータを扱うときに使用します。以下に例を示します。

配列のイメージ

プログラムで物事を処理するときには、大体目に見えないものば仮です。具体的には、「オブジェクト」と呼ばれているものがそうです。
イメージする事でしかこの存在を具体化できません。※自分にはそう思っていますが、もしかしたらできる人がいるかも?

そんなわけで、筆者の配列、変数に対するイメージは、ズバリ段ボールです。
変数にデータをセット、同じように変数の連結されたもの「配列」という認識です。
配列は、各データ型の配列があります。具体的には下のようなものです。

int[] intArray;
double[] doubleArray;
long[] longArray;
byte[] byteArray;
MyClass[] myClassArray;

筆者の場合は、それらの配列はいろんな型がハコになって並んでいるイメージです。下の画像はINT型の配列です。このINT型がDOUBLEだったり、MyClassだったりする、違いがあるだけです。

<配列とリテラルに関して>

配列を使用するとき

下のようなものを扱うときによく使用します。

  1. CSVファイル(人口統計の地域ごとに集計したデータなど)の読み込み
  2. DBから取得したデータの読み込み

そのほか、やはり沢山のデータを扱うときに使用します。この配列をクラスとして使用しているのがListインターフェース・クラスです。

<データの取得サンプルコード>
DBに接続してSQLを実行した結果を取得しています。IDをリストで取得しています。

Properties prop = new Properties();
prop.put("ユーザーのキー", "ユーザー名");
prop.put("パスワードのキー", "パスワード");
Connection con = DriverManager.getConnection("DBのURL", prop);
ResultSet rs = con.executeQuery("SELECT * FROM MYTABLE");
List<ID> list = rs.get(0);

<Listインターフェースのサンプル動画>

余談ですが、このListインターフェース・クラスは、良く「インターフェース」と呼ばれています。しかし、サーバー同士のデータ通信でも「インターフェース」という言葉を使います。結論から言うと「インターフェース」はいろんな場面でいろんな意味で使われるので「オブジェクト指向」という言葉と同じようにカオス化しやすい言葉です。注意しましょう。

そして、このListインタフェースは実装されているクラスが2つあり、ArrayListLinkedListというクラスがあります。

それぞれ、特徴がありますが、よく使われるのがArrayListで、可変長配列の実装になります。※Javaを作った人たちが作成したプログラムということです。

Introduction

Start a studying For statement. But we need knowledge of array. That’s why we will study array.

配列とは…

連結した変数の箱です。※自分のイメージです。

4の5の言わずに、サンプルコードを見て見ましょう

変数には、それぞれの型がありました。配列も同様です。
int型の配列、double型の配列、String型の配列。。。沢山あります。

public class TestA {
    public static void main(String[] rags) {
       // 普通の変数
       int num = 1;
       double d = 1.2;
       String moji = "これは文字です";
       // 配列の変数
       int[] numArr = {1, 2, 3};
       double[] dArr = {0.1, 0.2, 0.3};
       String[] strArr = new String[]{"a", "b", "c"};

       // int型の配列表示
       System.out.println(“numArr[0]=“ + numArr[0]);
       System.out.println(“numArr[1]=“ + numArr[1]);
       System.out.println(“numArr[2]=“ + numArr[2]);
       // double型の配列表示
       System.out.println(“dArr[0]=“ + dArr[0]);
       System.out.println(“dArr[1]=“ + dArr[1]);
       System.out.println(“dArr[2]=“ + dArr[2]);
       // String型の配列表示
       System.out.println(“strArr[0]=“ + strArr[0]);
       System.out.println(“strArr[1]=“ + strArr[1]);
       System.out.println(“strArr[2]=“ + strArr[2]);
    }
}

配列の宣言と初期化

配列ではない変数は「int 変数名」の様に宣言します。

// 変数の宣言
int num;
// 変数の初期化
int num1 = 10;

配列の変数に関しては「int[] 変数名」の様に宣言します。

// 変数の宣言
int[] numArray;
// 変数の初期化①配列の中身を初期化する
int[] numArray1 = new int {0, 1, 2};
// 変数の初期化②配列の要素数(セットできるデータの数)を指定する
int[] numArray = new int[2]

使い方は上記のサンプルを参考にしてください。

Array is ...

Linked Box. ※On my mind

Without hesitation. See a sample code. Look at upper sample.

we use single variable like this ”int ‘Variable’”.

Array is like this “int[[] ‘Valiable’”

<問題>

配列を以下の様に表示するプログラムを作成してください。

====== 例(Sample) ======
配列[0]=1
配列[1]=2
配列[2]=3
配列[3]=4
配列[4]=5

ループ文と併用する

DBからデータを取得した場合の処理の例。
※DBから取得したデータは全部文字列(String)型とする、取得したデータは複数あるので配列になっていることが多い。
これは、使用しているAPIの仕様によります。

// DBクラスでSQLをセットして、実行する。
String[] strArr =DB.setQuery("select * from myTable").execute();

for (int i = 0; i < strArr.length(); i++) {
  // 取得したデータを表示する。
  System.out.println("取得したデータ:" + strArr[i]);
}

実際に動かしてみる

実行したときの動画です。

余計な音が入っています、

こちらも、余計な音が入っています。

<<< 前回 次回 >>>