【Java学習】04 継承 [Java SE 11 Silver 紫本]

extendsがないクラスは全てjava.lang.Objectクラスのサブクラスです。

以下のコードではObjectクラスのメソッドを使っています。

class Member extends Object{
  private String id = "1000";
  public String getId() {
    return id;
  }
}
class Sales extends Member {
  private String clientName = "ABC";
  public String getClientName() {
    return clientName;
  }
}
public class Main {
  public static void main(String[] args) {
    Sales s = new Sales();
    System.out.println("clientName : " + s.getClientName());
    System.out.println("id         : " + s.getId());
    System.out.println("String : " + s.toString()); // ObjectクラスのtoStringメソッド
    System.out.println("hashCode : " + s.hashCode()); // ObjectクラスのhashCodeメソッド
  }
}
--------------------------------------------------

出力
--------------------------------------------------
clientName : ABC
id         : 1000
String : Sales@6b95977
hashCode : 112810359

【Java学習】03 コンストラクタのオーバーロード [Java SE 11 Silver 紫本]

コンストラクタの引数の構成を変えると同じコンストラクタ名を使えます。これをオーバーロードと呼びます。メソッドもオーバーロード可です。

以下のコードには特に意味はありません。単にコンパイルエラーの有無を検証しただけです。

class Employee {
  int id; String name;
  Employee() { System.out.println("Employee()エラーなし"); }
  Employee(String name) { System.out.println("Employee(String name)エラーなし"); }
  Employee(int id) { System.out.println("Employee(int id)エラーなし"); }
  Employee(int id, String name) { 
    System.out.println("Employee(int id, String name)エラーなし"); }
  Employee(int id, String country) { 
      System.out.println("Employee(int id, String country)エラーなし"); }
}
public class Main {
  public static void main(String[] args) {
    Employee a = new Employee();
    Employee b = new Employee("sato");
    Employee c = new Employee(100);
    Employee d = new Employee(100, "sato");
  }
}
--------------------------------------------------

出力
--------------------------------------------------
Main.java:8: エラー: コンストラクタ Employee(int,String)はすでにクラス Employeeで定義されています
  Employee(int id, String country) { 

【Java学習】02 For文 [Java SE 11 Silver 紫本]

Java SE 11 Silver 紫本はChapterを読み終えたら章末の練習問題を解いていましたが、敢えてとは言えども不完全なコードを読まされるのはかなり苦痛です。

そもそも実行して出力させれば分かることですし、実務で遭遇しない限り自力でデバッグしようとは思わないです。

Java SilverやGoldを受けることは絶対にないと確信させられた章でした。まあ一応最後まで読みますが練習問題には一切手を付けません。

下記のコードなんかを読まされたときの徒労感は半端ではありません。不具合の内容もそうですが、コード自体が不毛すぎます。こんなの読んでたら感性がおかしくなります。

public class Main {
  public static void main(String[] args) {
    int[] ary = {10, 20, 30, 40, 50};
    int i = 5;
    for(int a : ary){
      while(i < ary.length){
        i++;
        System.out.print(i + " ");
      }
    }
  }
}
--------------------------------------------------
最初のループですでにiが配列の要素数5未満ではないので出力はなし

【Java学習】01 StringとStringBuilder [Java SE 11 Silver 紫本]

Java SE 11 Silver 紫本のChapter3まで読了しました。よく出来た本ですが紙幅が限られているためか総じて説明が足りないです。

例えばこの方法ではこれができないので別の方法になります、という説明に終始しています。いや一工夫したら別の方法じゃなくてもできるでしょというケースもあるのですが、説明が先に進まないので仕方ない面はあります。せめて注釈でその一工夫に言及してほしかったです。

StringとStringBuilderの違いについては、Pythonの”sortedとsort”と同様に可逆的、不可逆的(あるいは非破壊的、破壊的)の対比と考えれば理解しやすいです。

最後まで読み通して理解し修得できたら、取りあえずJava初心者を脱してJava初級者を名乗れるでしょうか。

public class Main {
  public static void main(String[] args) {
    String str = new String("Hello");
    StringBuilder sb = new StringBuilder("Hello");
    String str2 = str.concat(" dear"); // 可逆的変更なので新たに変数設定して戻り値を捕捉する。
    sb.append(" dear"); // 不可逆的変更なので新変数の設定不要
    System.out.println("str: " + str + ", str2: " + str2 + ", sb: " + sb);
  }
}
--------------------------------------------------

出力
--------------------------------------------------
str: Hello, str2: Hello dear, sb: Hello dear

【Java17】06 SwingによるGUIアプリ作成 ボタンのアクション設定

[M1 Mac mini(2020), macOS Big Sur 11.6.1, VScode 1.62.3]

削除ボタンを押すとTextFieldに入力したパスを読み取り、サブディレクトリ内のファイルを含め全て消去するようにしました。ディレクトリのツリー構造は残ります。

色設定では16進数カラーコードをわざわざRGBに変換しています。普通にXXX.setBackground(new Color(0xカラーコード))で設定可能なのを忘れていました。

下のTextAreaには処理時間や削除したファイル数などを表示するようにしますが、とりあえず完成とします。

Javaは高機能なのはいいものの、とても覚えられるような量ではないので逆引き辞典が欲しいところです。

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Color;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
import java.util.List;
import java.util.Arrays;
import java.util.stream.Collectors;

public class App extends JPanel{
    private JLabel lbl = new JLabel("PATH");
    private JTextField tfield = new JTextField();
    private JButton btn1 = new JButton("削除");
    private JButton btn2 = new JButton("クリア");
    private JTextArea area = new JTextArea();

	Color lemonchiffon = new Color(0xfffacd);
	int lemonchiffon_red = lemonchiffon.getRed();
	int lemonchiffon_green = lemonchiffon.getGreen();
	int lemonchiffon_blue = lemonchiffon.getBlue();

    public App(){
        GridBagLayout layout = new GridBagLayout();
        this.setLayout(layout);

        GridBagConstraints constraints = new GridBagConstraints();
        constraints.fill = GridBagConstraints.BOTH;
		constraints.insets = new Insets(2, 5, 2, 5);

        constraints.gridx = 0;	//位置x
		constraints.gridy = 0;	//位置y
		constraints.gridwidth = 1;	//コンポーネントの表示領域のセル数 横
		constraints.gridheight = 1;	//コンポーネントの表示領域のセル数 縦
		layout.setConstraints(lbl, constraints);
		this.add(lbl);

        constraints.gridx = 1;
		constraints.gridy = 0;
		constraints.gridwidth = 2;
		constraints.gridheight = 1;
		constraints.weightx = 1;
		tfield.setBackground(new Color(lemonchiffon_red,lemonchiffon_green,lemonchiffon_blue));
		layout.setConstraints(tfield, constraints);
		this.add(tfield);

        constraints.gridx = 3;
		constraints.gridy = 0;
		constraints.gridwidth = 1;
		constraints.gridheight = 1;
		constraints.weightx = 0;
		layout.setConstraints(btn1, constraints);
		this.add(btn1);

		btn1.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				String str = tfield.getText();
				try{
					Stream<Path> list = Files.walk(Paths.get(str));
					Path[] array = list.toArray(Path[]::new);
					List<Path> list2 = Arrays.asList(array);

					for(int i=0; i<list2.size(); i++) {
						Path p = Paths.get(list2.get(i).toString());
						if (Files.isDirectory(p)){
							;
						}else{
							try{
								Files.delete(list2.get(i));
							}catch(IOException e2) {
								System.out.println(e2);
							}
						}
					}

					list.close();

				}catch(IOException e1) {
					System.out.println(e1);
				}
			}
		});
        
        constraints.gridx = 3;
		constraints.gridy = 1;
		constraints.gridwidth = 1;
		constraints.gridheight = 1;
		layout.setConstraints(btn2, constraints);
		this.add(btn2);

		btn2.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				tfield.setText("");
			}
		});

		constraints.gridx = 0;
		constraints.gridy = 2;
		constraints.gridwidth = 4;
		constraints.gridheight = 1;
		constraints.weighty = 1;
		area.setBackground(new Color(lemonchiffon_red,lemonchiffon_green,lemonchiffon_blue));
		layout.setConstraints(area, constraints);
		this.add(area);
    }
    public static void main(String[] args){
        JFrame frm = new FrameGridLayout();
		frm.setBounds(100, 100, 350, 200);
	}
}

class FrameGridLayout extends JFrame{
	Color palegreen = new Color(0x98fb98);
	int palegreen_red = palegreen.getRed();
	int palegreen_green = palegreen.getGreen();
	int palegreen_blue = palegreen.getBlue();

    public FrameGridLayout(){
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		this.setTitle("FILE REMOVER JV v0.0.1");
		JPanel panel = new App();
		panel.setBackground(new Color(palegreen_red,palegreen_green,palegreen_blue));
		this.setContentPane(panel);
		this.setVisible(true);
    }
}

【Java17】05 SwingによるGUIアプリ作成 GridBagLayout

[M1 Mac mini(2020), macOS Big Sur 11.6.1, VScode ver 1.62.3]

コンポーネントとアクションのリンク部分を作成する前にレイアウトを整えました。

GridBagLayoutはかなりクセが強くて手間取りました。

特にweightx,weightyの使い方が最初はよく分かりませんでした。一番長さを取りたいコンポーネントについてweightx = 1やweighty = 1と設定すればいいようです。優先したいコンポーネントが複数ある場合は1から分配することになります。

あまりに扱いにくくてネットを見渡した感じでは日本語ユーザーにはほとんど使われていないようです。

Javaを網羅的に解説してくれているサイトがありますが、検証が不十分で内容が不正確なことがあります。OracleのThe Java Tutorialsがとてもためになりました。

参考サイト:How to Use GridBagLayout

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;

public class App extends JPanel{
    private JLabel lbl = new JLabel("PATH");
    private JTextField path = new JTextField();
    private JButton btn1 = new JButton("削除");
    private JButton btn2 = new JButton("クリア");
    private JRadioButton radio1 = new JRadioButton("ディレクトリ");
    private JRadioButton radio2 = new JRadioButton("ファイル");
	private JTextArea area = new JTextArea();


    public App(){
        GridBagLayout layout = new GridBagLayout();
        this.setLayout(layout);

        GridBagConstraints constraints = new GridBagConstraints();
        constraints.fill = GridBagConstraints.BOTH;
		constraints.insets = new Insets(2, 5, 2, 5);

        constraints.gridx = 0;	//位置x
		constraints.gridy = 0;	//位置y
		constraints.gridwidth = 1;	//コンポーネントの表示領域のセル数 横
		constraints.gridheight = 1;	//コンポーネントの表示領域のセル数 縦
		layout.setConstraints(lbl, constraints);
		this.add(lbl);

        constraints.gridx = 1;
		constraints.gridy = 0;
		constraints.gridwidth = 2;
		constraints.gridheight = 1;
		constraints.weightx = 1;
		layout.setConstraints(path, constraints);
		this.add(path);

        constraints.gridx = 3;
		constraints.gridy = 0;
		constraints.gridwidth = 1;
		constraints.gridheight = 1;
		layout.setConstraints(btn1, constraints);
		this.add(btn1);

        constraints.gridx = 1;
		constraints.gridy = 1;
		constraints.gridwidth = 1;
		constraints.gridheight = 1;
		layout.setConstraints(radio1, constraints);
		this.add(radio1);

        constraints.gridx = 2;
		constraints.gridy = 1;
		constraints.gridwidth = 1;
		constraints.gridheight = 1;
		layout.setConstraints(radio2, constraints);
		this.add(radio2);

        constraints.gridx = 3;
		constraints.gridy = 1;
		constraints.gridwidth = 1;
		constraints.gridheight = 1;
		layout.setConstraints(btn2, constraints);
		this.add(btn2);

		constraints.gridx = 0;
		constraints.gridy = 2;
		constraints.gridwidth = 4;
		constraints.gridheight = 1;
		constraints.weighty = 1;
		layout.setConstraints(area, constraints);
		this.add(area);
    }
    public static void main(String[] args){
        JFrame frm = new FrameGridLayout();
		frm.setBounds(100, 100, 350, 200);
	}

}

class FrameGridLayout extends JFrame{
    public FrameGridLayout(){
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		this.setTitle("FILE REMOVER JV v0.0.1");
		JPanel panel = new App();
		this.setContentPane(panel);
		this.setVisible(true);
    }
}

【Java17】04 SwingによるGUIアプリ作成 コンポーネント

[M1 Mac mini(2020), macOS Big Sur 11.6.1, VScode ver 1.62.3]

SwingでGUIアプリのガワを作成しました。

少しずつ思い出しながらの作業でした。レイアウトにGridBagLayoutを使ってみました。

Javaは手間こそ掛かるものの堅実な働きぶりで頼もしいです。

M1 Macで環境構築してみて、昨年のJava学習開始から如何に遠回りしてきたかを痛感させられました。今までやってきたことはわざわざMavenやEclipseに頼らなくても全てVScodeの通常プロジェクトで事足りるようです。

これまでの試行錯誤が無駄ではなく血肉になって地力アップにつながっていると考えることにします。

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JRadioButton;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;

public class App extends JPanel{
    private JLabel lbl = new JLabel("PATH");
    private JTextField path = new JTextField();
    private JButton btn1 = new JButton("削除");
    private JButton btn2 = new JButton("クリア");
    private JRadioButton radio1 = new JRadioButton("ディレクトリ");
    private JRadioButton radio2 = new JRadioButton("ファイル");

    public App(){
        GridBagLayout layout = new GridBagLayout();
        this.setLayout(layout);

        GridBagConstraints constraints = new GridBagConstraints();
        constraints.fill = GridBagConstraints.BOTH;
        constraints.weightx = 10.0;
        constraints.weighty = 10.0;
        constraints.insets = new Insets(2, 2, 2, 2);

        constraints.gridx = 0;	//位置x
        constraints.gridy = 0;	//位置y
        constraints.gridwidth = 1;	//コンポーネントの表示領域のセル数 横
        constraints.gridheight = 1;	//コンポーネントの表示領域のセル数 縦
        layout.setConstraints(lbl, constraints);
        this.add(lbl);

        constraints.gridx = 1;
        constraints.gridwidth = 2;
		constraints.gridheight = 1;
		layout.setConstraints(path, constraints);
		this.add(path);

        constraints.gridx = 3;
		constraints.gridy = 0;
		constraints.gridwidth = 1;
		constraints.gridheight = 1;
		layout.setConstraints(btn1, constraints);
		this.add(btn1);

        constraints.gridx = 1;
		constraints.gridy = 1;
		constraints.gridwidth = 1;
		constraints.gridheight = 1;
		layout.setConstraints(radio1, constraints);
		this.add(radio1);

        constraints.gridx = 2;
		constraints.gridy = 1;
		constraints.gridwidth = 1;
		constraints.gridheight = 1;
		layout.setConstraints(radio2, constraints);
		this.add(radio2);

        constraints.gridx = 3;
		constraints.gridy = 1;
		constraints.gridwidth = 1;
		constraints.gridheight = 1;
		layout.setConstraints(btn2, constraints);
		this.add(btn2);
    }
    public static void main(String[] args){
        JFrame frm = new FrameGridLayout();
		frm.setBounds(100, 100, 350, 150);
	}

}

class FrameGridLayout extends JFrame{
    public FrameGridLayout(){
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		this.setTitle("FILE REMOVER JV v0.0.1");
		JPanel panel = new App();
		this.setContentPane(panel);
		this.setVisible(true);
    }
}

【Java17】03 M1 Macでの開発環境構築 VScodeでプロジェクト作成

[M1 Mac mini(2020), macOS Big Sur 11.6.1, VScode ver 1.62.3]

VScodeでプロジェクトを作成しました。

1.コマンドパレットに”Java:Create java Project”を入力する。
2.プロジェクトの種類を選択する。今回はNo build toolsにしました。
3.プロジェクトを作成するロケーションを設定する。
4.プロジェクト名を入力する。
5.App.javaを開き、テスト実行する。

【Java17】02 M1 Macでの開発環境構築 VScodeの設定&テスト実行

[M1 Mac mini(2020), macOS Big Sur 11.6.1, VScode ver 1.62.3]

VScodeを設定します。

1.拡張機能のインストール
 Extension Pack for JavaとCode Runnerをインストールする。

2.テストコードを実行
 下記ソースコードファイルを作成し、保存ディレクトリをWorkspaceにして実行する。

class QuickStart {
    public static void main(String[] args) {
        System.out.println("Hello, World.");
    }
}

この方法はコマンドパレットから”Java: Getting Started”を入力&エンターで表示されます。

以前環境構築しようとした際はこの方法が分からずに迷走して、ややこしいMavenを使うハメになりました。こんな簡単にできるとは知りませんでした。

ついついやってしまいがちですが、あせってあれやこれやインストールしまくるというのは時間コスト的に最悪ですね。

【Java17】01 M1 Macでの開発環境構築 JDKのインストール他

[M1 Mac mini(2020), macOS Big Sur 11.6.1, VScode ver 1.62.3]

M1 Mac miniに乗り換えたため、また一から開発環境を作っていきます。

EclipseのApple Silicon版はまだリリースされていないので、とりあえずVScodeで構築します。まっさらな状態ですからやみくもにインストールしたりせず、一つ一つ確認しながら進めていきます。

初期状態は以下の通りです。

入力
--------------------------------------------------
which java
--------------------------------------------------
出力
--------------------------------------------------
/usr/bin/java
--------------------------------------------------

入力
--------------------------------------------------
java --version
--------------------------------------------------
出力
--------------------------------------------------
The operation couldn’t be completed. Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java.
--------------------------------------------------

java.comからJREをダウンロードし、インストールしました。

再度javaの状態を確認しました。出力の内容が変わっています。

java --version
--------------------------------------------------

出力
--------------------------------------------------
Unrecognized option: --version
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

次にOracleのサイトからJava17のJDK(Arm 64 DMG Installer)をダウンロードし、インストールしました。openJDKでも構いません。

javaの状態を確認しました。インストールに成功したようです。

java --version
--------------------------------------------------

出力
--------------------------------------------------
java 17.0.1 2021-10-19 LTS
Java(TM) SE Runtime Environment (build 17.0.1+12-LTS-39)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.1+12-LTS-39, mixed mode, sharing)

今のところM1 Mac miniに入っているJavaの確認です。Java1.8はintel版ですがそのまま進めます。

/usr/libexec/java_home -V
--------------------------------------------------

出力
--------------------------------------------------
Matching Java Virtual Machines (2):
    17.0.1 (arm64) "Oracle Corporation" - "Java SE 17.0.1" /Library/Java/JavaVirtualMachines/jdk-17.0.1.jdk/Contents/Home
    1.8.311.11 (x86_64) "Oracle Corporation" - "Java" /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
/Library/Java/JavaVirtualMachines/jdk-17.0.1.jdk/Contents/Home