Java Basic Arrays 〜多次元配列〜

イントロダクション

個人的にOpenCVの学習を行なっているところで、配列に関して触れていなかった事に気が付いたのでここで触れておこうと思います。

ちなみに、OpenCVで画像(imgデータ)を扱うのですが、これは平面画像だと2次元配列(縦、横の配列なので2次元配列)、そして、透過するデータを追加すると3次元。。。と配列のデータ量が増えていきます。

配列の解説

While文で配列をループするコードを解説していますが、配列に関しても解説しています。

多次元配列

論より証拠、ソースを見てみると一目瞭然ですが、配列のイメージは持っておくようにしましょう。上の動画を見てもらえれば簡単なイメージが作れると思います。

サンプルコード

下のリンクはGithubへのリンクになります。コードの全体があり、コピペもしやすいと思われます。
そして、プログラムの内容に関しては次の通りです。

  1. String型の1次元配列「lv1Array」を宣言します。
  2. 同様に2次元配列「lv2Array」を宣言します。
  3. 3次元配列「lv3Array」を宣言。
  4. 1次元配列をFOR文で表示します。
  5. 2次元配列を2次元ループで表示します。※2次元ループはFOR文が2階層あります。
  6. 3次元配列を3次元ループで表示します。※3次元ループはFOR文が3階層あります。

Sample_Array.java

public class Sample_Array {
  /** メインメソッド */
    public static void main(String[] args) {
        // 1次元配列
        String[] lv1Array = new String[] {"a", "b", "c"};
        // 2次元配列
        String[][] lv2Array = new String[][] {{"a", "b", "c"}, {"d", "e", "f"}};
        // 3次元配列
        String[][][] lv3Array = new String[][][] {
            {{"a", "b", "c"}, {"d", "e", "f"}}
            ,{{"g", "h", "i"}, {"j", "k", "l"}}
            ,{{"m", "n", "o"}, {"p", "q", "r"}}
            };
        // 1次元配列を表示する
        System.out.println("*** 1次元配列を表示 ***");
        for (String nakami : lv1Array) {
            printf("", nakami);
        }
        // 2次元配列
        System.out.println("\n*** 2次元配列を表示 ***");
        for (String[] nakamiLv2 : lv2Array) {
            for (String nakami : nakamiLv2) {
                printf("", nakami);
            }
        }
        // 3次元配列
        System.out.println("\n*** 3次元配列を表示 ***");
        for (String[][] nakamiLv3 :lv3Array) {
            for (String[] nakamiLv2 : nakamiLv3) {
                for (String nakami : nakamiLv2) {
                    printf("", nakami);
                }
            }
        }
    }
        /** コンソール出力メソッド */
    private static void printf(String label, String value) {
        System.out.print(label + "" + value);
    }
}

実行結果が下になります。

<理解の仕方>

=>理解の仕方は人それぞれなので自分の中でイメージを作ってください。

ちなみに、配列にはint型の配列、文字列型の配列。。。などいろいろありますが、「XXX型の変数」があれば、「XXX型の配列」があります。

筆者の場合

筆者の場合は、以下のようなイメージを持っています。

変数

小さな段ボール箱のイメージで持っています。そこに数値型、文字、文字列型、クラス型の値を入れる(セット)するイメージです。

配列

配列になると上記の段ボールより大きい段ボールをイメージします。

次元数が増えると段ボールもより大きくなります。

1次元配列

1次元配列は変数が、おおきな箱の中に並ぶようなイメージを持っています。

String[] hako = new String[] {"1XX", "2XX", "3XX" ...};
hako[0] => "1XX"
hako[1] => "2XX"
hako[2] => "3XX"

2次元配列は変数が、さらに大きな箱の中に並ぶようなイメージを持っています。

String[][] hako = new String[][]{{{"11X", "12X", "13X"},{"21X", "22X", "23X"},{"31X", "32X", "33X"} ...};
hako[0][0] => "11X"
hako[0][1] => "12X"
hako[0][2] => "13X"
hako[1][0] => "22X"
hako[1][1] => "22X"
hako[1][2] => "22X"

こんな感じです、実際には目に見えるものではないので「イメージ」になってしまいます。プログラムを実行すれば「結果」をみることができるのでより具体的なイメージができると思います。

関連ページ一覧

OpenCVで画像解析の基本を学ぶ

  1. Java OpenCV Lv4 〜画像の中身をみてみる〜「画像データは配列になっている」

<Java Step1〜ミニゲーム作成>

Java Basic JUnit 〜テストの作り方〜

イントロダクション

今までに触れたことのない技術(OpenCvなど)を使おうと思ったら色々と動かしてみたいのが人情、そんな時に使えるフレームワークの使い方を記載します。
その名はJUnitです。
具体的には、参考資料、参考サイトなどを見ながらプログラムを作成する、作成したプログラムの。。。

  1. メソッドのみを動かす。
  2. 全体を動かす。
  3. 一部切り出して動かす。

上記のことが、本体プログラムに影響せず実行できるところが良いところです。

JUnit

JUnitは、「テスト用のフレームワーク」として有名なものです。「テスティングフレームワーク」という言い方が多いと思います。

英語で「Testing framework」といえばなんとなくわかるけど、日本語だとなんか別な意味があるのでは?と疑ってしまうのは筆者だけでしょうか?
とりあえず、『いろんな言い方をして混乱するのは良くない』といいたいだけです。失礼。。。

この記事のタイトルにある「テストスイート」という言葉も「テストケース」を意味するものです。JUnitでの「@Test」のついたメソッドのことです。
色々な言い方があり混乱してしまいがちですが「何を指しているのか?」に注意すればあまり混乱しないと思います。

JUnitの概要

JUnit(本家サイトへのリンクです)は、ズバリ「アノテーション『\@』」でテストの準備、テスト、テストの後始末をっコントロールできる便利なフレームワークです。いろんな書籍でいろいろ書いていると思いますが、基本は「\@Test」「/@Before」「\@After」のアノテーションをつければ動きます。もっと言うと「\@Test」アノテーションのみでよいです。※今回実装したJUNIT5ではBeforEach, AfterEachのように名前が変わっています。

JUnitの設定方法

IntelliJ IDEAでの設定方法です。

Mavenを使用して、pom.xmlに以下のような記述を追加、再ビルド(Mavenビルド)を行う。"dependencies"タグの中に追加する
タグの階層があるので、ちょっと混乱しがちですが、projectタグの直下に記述します。

<dependencies>
  <!-- この部分がJUNITの記述 -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.7.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>

追伸、ほかのOpenCVとかLWJGLなどもこのdependenciesタグの中に追記します。

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd
                                http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>jp.zenryokuservice</groupId>
    <artifactId>TextRPG</artifactId>
    <version>0.8-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>net.objecthunter</groupId>
            <artifactId>exp4j</artifactId>
            <version>0.4.8</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>

コードの実行

ズバリ、「@Test」をメソッドの頭につけるだけです。

import jp.zenryoku.practice.sample.SampleLv1Hello;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.junit.Assert.assertEquals;

/**
 * サンプルテストクラス
 */
public class SampleTest {
    /** テスト対象クラス */
    private SampleLv1Hello target;

    /** テストの準備 */
    @BeforeEach
    public void init() {
        target = new SampleLv1Hello();
    }

    @Test
    public void test01() {
        System.out.println("Hello JUnit");
        target.testMethod();
    }

    @Test
    public void test02() {
        target.testMethod(1, 2);
        target.testMethod(4, 9);
        target.testMethod(5,8);
        target.testMethod(6, 7);
    }

    @Test
    public void test03() {
        // 返却値が正しいか確認する
        assertEquals(2, target.testMethod(1, 1, true));
        assertEquals(2, target.testMethod(5, 3, false));
        assertEquals(3, target.testMethod(1, 1, true));
    }
}

Javaで開発をしていたらすぐに目にすると思うのですが、改めて使い方をみてみようと思います。
<作業動画>

手順(Eclipse)

  1. EclipseにJUnit4(JARファイル)をビルドパスにつなぐ
  2. テストクラスを作る
  3. 実行する
  4. あとは色々といじって遊ぶ

サンプルコード(JUnit4 ※古い)

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import org.junit.runners.JUnit4;
import org.opencv.core.Mat;

import zenryokuservice.gui.lwjgl.kakeibo.opnecv.ReceiptCv;

/** JUnit4を使う宣言 */
@RunWith(JUnit4.class) 
public class ReceiptCvTest {
    /** テスト対象のクラスをフィールドで保持する */
    private ReceiptCv test;
    /**
     * Bforeアノテーションで各テストを実行する前に
     * 実行するメソッド
     * テストのためのデータセットを用意したり、クラスの呼び出しを行なったりする
     */
    @Before
    public void setup() {
        test  = new ReceiptCv();
    }
    @After
    public void terminated() {
        // テストの終了処理(メモリ開放)
        test = null;
    }
    /** テストケース1 */
    @Test
    public void test1() {
        test.helloCv();
    }
    /** テストケース2 */
    @Test
    public void test2() {
        // イメージファイルを読んでみる
        Mat matrix = test.loadImg("download-1.jpg");
        System.out.println(matrix.dump());
    }
}

テストケースの考え方

じゃんけんゲームを作成しているときに、入力チェックのメソッドを作成したとき。

このメソッドをテストするための「テストケース」を作成するときのことを解説しています。

関連ページ一覧

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 〜テストスイートの作り方〜

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リポジトリからクローン〜