<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Java &#8211; REONTOSANTA</title>
	<atom:link href="https://knowledge.reontosanta.com/archives/category/programming/java/feed" rel="self" type="application/rss+xml" />
	<link>https://knowledge.reontosanta.com</link>
	<description>Collection of personal knowledge</description>
	<lastBuildDate>Wed, 25 Jul 2018 02:23:41 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<atom:link rel='hub' href='https://knowledge.reontosanta.com/?pushpress=hub'/>
<site xmlns="com-wordpress:feed-additions:1">83369280</site>	<item>
		<title>オブジェクト指向の概念</title>
		<link>https://knowledge.reontosanta.com/archives/823</link>
					<comments>https://knowledge.reontosanta.com/archives/823#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Mon, 28 Mar 2016 23:40:11 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=823</guid>

					<description><![CDATA[概念 オブジェクト：インスタンスやクラスの総称 クラス：オブジェクト&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<h2>概念</h2>
<hr />
<ul>
<li>オブジェクト：インスタンスやクラスの総称</li>
<li>クラス：オブジェクトを表現したもの（必要な変数とメソッドの内容を記載してある仕様書）</li>
<li>インスタンス：クラスの実体（new Foo()自体、クラスを元にnewして実体になったもので実際の操作が可能）</li>
</ul>
<hr />
<p>オブジェクト指向を現実世界に置き換えて考える。<br />
この世界は、全てオブジェクトで出来ている。<br />
人間、車、パソコンなど全てがオブジェクトであり、その中でも人間と言う種類や、車という種類など様々な種類に分類できる。<br />
人間と車は同じくオブジェクトだが、人間と車は違うものであり、人間とはどういうものか、車とはどういうものか、それを表現したものがクラスになる。<br />
人間には四肢があり、頭があり、目、鼻、口がある。<br />
無意識に心臓を動かし、呼吸をして、話す事ができる。<br />
このように人間と言うクラスを定義したとする。（人間がどういうものかを表したクラスを作成）<br />
私は、人間クラスの実体である。<br />
つまり、私はインスタンス(new 人間())である。<br />
私はオブジェクトであり、且つ人間クラスのインスタンスである。<br />
私以外の人も、人間クラスのインスタンスである。<br />
インスタンスは、ひとつとして同じものがない。<br />
例えば、自動車販売店で販売されている車はインスタンスである。<br />
同じ車種の同じグレードの車だとしても、一つ一つ少しずつ違う。<br />
つまり、new 車()すると一つ一つ別の車として発生する。</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-3385218505"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>プログラミングにおけるオブジェクト指向</h2>
<p>上記の内容を改めてJavaをベースとして考える。</p>
<hr />
<ul>
<li>Object：全てのものはObject。あらゆるClassがjava.lang.Objectを継承している事から明らかであり、ClassもInstanceも何もかもがObjectである。</li>
<li>Class：型であり、Objectの製造基盤。ClassからObjectを製造することを、インスタンス化という。</li>
<li>Instance: Classから製造されたObject。「～クラスのインスタンス」という言い方をする。</li>
</ul>
<hr />
<p>コンピュータは、「メモリ上の値」以外のものに対して操作も参照も実行もする事が出来ない。<br />
「コンピュータが何かする」というのは、「メモリに対して何かする」という事になる。<br />
インスタンス化（実体化）というのは、クラスという設計図に従って、「コンピュータが何か出来るような値をメモリ上に作る」ことを指している。<br />
つまり、Javaのnewは指定されたクラスに従ってインスタンスをメモリ上に展開する働きをしている。<br />
クラスはJavaソースプログラム上で人間が考えるためのオブジェクトであり、インスタンスはプログラム実行時のメモリ上でコンピュータが何かをするためのオブジェクトである。<br />
そう捉えると、人間が考えるモノの多くは「オブジェクト」としてコンピュータで扱えるはずではないかというのが、オブジェクト指向という考え方と言える。<br />
ちなみに、int型整数などの「基本型(primitive型)の変数」もオブジェクトだが、これらはJavaではクラスを書く必要がないオブジェクトである。<br />
これらは、newでインスタンス化しなくても「メモリ上の値」として、コンピュータが扱う事が出来る。<br />
こうした基本型の変数は、「基本型（というクラス）に従って、コンパイラがインスタンス化している」と言える。<br />
オブジェクト指向のオブジェクトとは、「独立した機能体」というイメージであり、他のオブジェクトと部分的に混同する事は無く、オブジェクト間で何かをやりとりする時も、相手オブジェクトに侵入したり浸食したりする事がない。<br />
オブジェクト指向以前のプログラミングでは、メモリ上は自由空間であり、誰がどんなアクセスをして書き換えているか、その管理は煩雑である。<br />
オブジェクト指向では、全てのプログラムを「オブジェクト（の組み合わせ）」として作成する。<br />
オブジェクトは互いに独立しているので、あるオブジェクトの持つメモリが、他のオブジェクトによって勝手に浸食されたりする事はない。<br />
そして、そういうプログラムをJava等のプログラミング言語で書き表した時、それぞれのオブジェクトを「クラス」という書き方で表現すると決めた。<br />
ソースコードに書かれたクラスは、コンパイルされて実行される。<br />
この時、クラスを元にして作られたメモリ上のオブジェクトのことを、インスタンスと呼んでいる。<br />
つまり、クラスもインスタンスも、どちらもオブジェクトになる。</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-1562104678"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-2111523170"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/823/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">823</post-id>	</item>
		<item>
		<title>JavaでSwingを利用したGUIアプリケーションの作成５（JListの利用とスレッド処理）</title>
		<link>https://knowledge.reontosanta.com/archives/509</link>
					<comments>https://knowledge.reontosanta.com/archives/509#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Sun, 01 Nov 2015 23:25:37 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=509</guid>

					<description><![CDATA[Swingを利用したウィンドウの表示、ボタンやラベルの配置、テキスト&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>Swingを利用した<a href="http://knowledge.reontosanta.com/archives/500">ウィンドウの表示</a>、<a href="http://knowledge.reontosanta.com/archives/502">ボタンやラベルの配置</a>、<a href="http://knowledge.reontosanta.com/archives/504">テキスト入力</a>、<a href="http://knowledge.reontosanta.com/archives/506">イベント処理</a>と一通り、GUIアプリケーションに必要な機能を作成してきたので、最後に複合的なGUIアプリケーションを作成する。</p>
<h2>ToDoリストアプリケーションの作成</h2>
<p>今回作成するアプリケーションは以下の機能を提供する。また、ToDoリストの一覧部分は“JList”を使用して表現する。</p>
<ul>
<li>ToDoの一覧を表示する</li>
<li>ToDoを一覧に追加できる</li>
<li>一覧のToDoを編集できる</li>
<li>一覧のToDoを削除できる</li>
</ul>
<p>&nbsp;</p>
<h3>JList</h3>
<p>リストボックスを表現するコンポーネント。<br />
複数のオブジェクトを一覧表示することができ、また、動的に一覧へのオブジェクトの追加、変更、削除を行うことができる。</p>
<h4>JListの生成</h4>
<p>JListは5つの種類のコンストラクタを持っている。<br />
今回は、5つのうちのListModelを渡すタイプのコンストラクタを使用する。<br />
このコンストラクタを使用すると、渡したリストモデルが管理しているデータを表示するリストボックスが生成される。</p><pre class="urvanov-syntax-highlighter-plain-tag">JList(ListModel dataModel)</pre><p></p>
<h4>ListModel</h4>
<p>JListの表示データを管理しているクラス。<br />
JList内の表示データの操作はListModelに対して行う。<br />
JListが表示データの管理をListModelに委譲しているのは、データを管理するクラスと、ビューを管理するクラスを分離するというSwingの設計思想によるもの。<br />
また、JListは.ListDataListenerを使用してListModelの内容を監視しており、ListModelに変更があった場合は、自身のビューを更新する。<br />
この仕組みにより、表示データの操作やデータモデルの拡張はListModelに対してのみ行えばよく、ビューの問題に関しては意識する必要がない。</p>
<h4>DefaultListModel</h4>
<p>ListModelの基本的な機能を実装したクラス。<br />
このクラスはListModelへの動的な追加、編集、削除に対応している。<br />
今回作成するToDoリストは追加、編集、削除機能を提供するため、DefaultListModelを使用する。</p>
<p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-455066631"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>プロジェクトの作成</h2>
<p>プロジェクト名「ToDoList」を作成する。</p>
<p>１．[ファイル]⇒[新規]⇒[プロジェクト]を選択</p>
<p>２．[Javaプロジェクト]を選択し[次へ]をクリック</p>
<p>３．プロジェクト名等を入力し[完了]をクリック</p>
<ul>
<li>プロジェクト名に「ToDoList」を入力</li>
<li>プロジェクト・レイアウトで[プロジェクト・フォルダーを・・・]を選択</li>
</ul>
<p>&nbsp;</p>
<h2>SwingAppMainクラスの作成</h2>
<p>GUIアプリケーションの起動および土台となるフレームの生成を担当するクラス「SwingAppMain」を作成する。</p>
<p>１．[ファイル]⇒[新規]⇒[クラス]を選択</p>
<p>２．[新規Javaクラス]ダイアログで各項目を入力し[完了]をクリック</p>
<ul>
<li>パッケージに「swing.sample」を入力</li>
<li>名前に「SwingAppMain」を入力</li>
<li>public static void main(String[] args)をチェック</li>
</ul>
<p>３．作成したクラスのソースコードを以下のように変更</p><pre class="urvanov-syntax-highlighter-plain-tag">package swing.sample;

import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class SwingAppMain {
	/**
	* アプリケーションの起動
	*/
	public static void main(String[] args) {
		System.out.println("main : " + SwingUtilities.isEventDispatchThread());
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				createAndShowTodoList();
			}
		});
	}

	/**
	* ToDoリストの生成と表示を行います。
	*/
	private static void createAndShowTodoList() {
		System.out.println("createAndShowTodoList :" + SwingUtilities.isEventDispatchThread());
		JFrame mainFrame = new JFrame("ToDoリスト");
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container contentPane = mainFrame.getContentPane();
		// ToDoリストを生成
		JComponent newContentPane = new ToDoListPane();
		contentPane.add(newContentPane, BorderLayout.CENTER);
		// Windowサイズを調整
		mainFrame.pack();
		// 表示
		mainFrame.setVisible(true);
	}
}</pre><p>&nbsp;</p>
<h2>ToDoListPaneクラスの作成</h2>
<p>ToDoリストのすべての機能を提供するクラス「ToDoListPane」を作成する。</p>
<p>１．[ファイル]⇒[新規]⇒[クラス]を選択</p>
<p>２．[新規Javaクラス]ダイアログで各項目を入力し[完了]をクリック</p>
<ul>
<li>パッケージに「swing.sample」を入力</li>
<li>名前に「ToDoListPane」を入力</li>
<li>public static void main(String[] args)をチェック</li>
</ul>
<p>３．作成したクラスのソースコードを以下のように変更</p><pre class="urvanov-syntax-highlighter-plain-tag">package swing.sample;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/**
* ToDoリスト
*/
public class ToDoListPane extends JPanel {
	private static final long serialVersionUID = 1L;
	private JList toDoList;
	private DefaultListModel toDoListModel;
	private JTextField toDoInputField;
	private JButton addButton;
	private JButton modifyButton;
	private JButton removeButton;

	/**
	*
	*/
	public ToDoListPane() {
		super(new BorderLayout());
		// 一覧を生成
		toDoListModel = new DefaultListModel();
		toDoList = new JList(toDoListModel);
		JScrollPane listScrollPane = new JScrollPane(toDoList);
		// TODOリストにリスナを設定
		toDoList.addListSelectionListener(new ToDoListSelectionHandler());
		// ToDo追加用テキストフィールドの生成
		toDoInputField = new JTextField();
		// 各ボタンの生成
		JPanel buttonPanel = new JPanel();
		addButton = new JButton("追加");
		modifyButton = new JButton("編集");
		removeButton = new JButton("削除");
		// ボタンにリスナを設定
		addButton.addActionListener(new AddActionHandler());
		modifyButton.addActionListener(new ModifyActionHandler());
		removeButton.addActionListener(new RemoveActionHandler());
		buttonPanel.add(addButton);
		buttonPanel.add(modifyButton);
		buttonPanel.add(removeButton);
		add(listScrollPane, BorderLayout.NORTH);
		add(toDoInputField, BorderLayout.CENTER);
		add(buttonPanel, BorderLayout.SOUTH);
	}

	/**
	* TODOリスト選択アクションのハンドラ
	*/
	private class ToDoListSelectionHandler implements ListSelectionListener {
		public void valueChanged(ListSelectionEvent arg0) {
			// TODOリストのどの行も選択されていない場合や、
			// 複数行が選択されている場合は、
			// 何もしません
			if (toDoList.getSelectedIndices().length!=1) {
				return;
			}
			toDoInputField.setText((String)toDoList.getSelectedValue());
		}
	}

	/**
	* 追加ボタンアクションのハンドラ
	*/
	private class AddActionHandler implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			// テキストフィールドの内容をリストモデルに追加
			toDoListModel.addElement(toDoInputField.getText());
		}
	}

	/**
	* 編集ボタンアクションのハンドラ
	*/
	private class ModifyActionHandler implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			// テキストフィールドの内容でリストモデルを編集
			// TODOリストのどの行も選択されていない場合や、
			// 複数行が選択されている場合は、
			// 何もしません
			if (toDoList.getSelectedIndices().length != 1) {
				return;
			}
			toDoListModel.set(toDoList.getSelectedIndex(), toDoInputField.getText());
		}
	}

	/**
	* 削除ボタンアクションのハンドラ
	*/
	private class RemoveActionHandler implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			// テキストフィールドの内容をリストモデルに追加
			// TODOリストのどの行も選択されていない場合や、
			// 複数行が選択されている場合は、
			// 何もしません
			if (toDoList.getSelectedIndices().length != 1) {
				return;
			}
			setButtonsEnabled(false);
			Thread removeThread = new RemoveThread(toDoList.getSelectedIndex());
			removeThread.start();
		}
	}

	/**
	* ボタンの状態を更新します
	*/
	private void setButtonsEnabled(boolean enabled) {
		addButton.setEnabled(enabled);
		modifyButton.setEnabled(enabled);
		removeButton.setEnabled(enabled);
	}

	/**
	* 削除処理を行うクラス
	*/
	class RemoveThread extends Thread {
		int index;
		RemoveThread(int index) {
			this.index = index;
		}
		public void run() {
			// 時間のかかる処理を実行
			doLongTask();
			// イベントディスパッチスレッドでボタンを変更
			SwingUtilities.invokeLater(new Runnable() {
				public void run() {
					toDoListModel.remove(index);
					setButtonsEnabled(true);
				}
			});
		}
	}

	/**
	* 時間のかかる処理
	*/
	private void doLongTask() {
		try {
			Thread.sleep(10000);
		} catch (InterruptedException ex) {
		}
	}
}</pre><p>&nbsp;</p>
<h2>アプリケーションの実行</h2>
<p>実行すると一覧部、入力テキストフィールド、追加・編集・削除ボタンが配置されたウィンドウが開く。<br />
［追加］ボタンをクリックすると、テキストフィールドに入力されている文字列（ToDo）を一覧に追加。<br />
一覧でアイテムを選択し、[編集]ボタンをクリックすると選択されている１行の文字列がテキストフィールドに表示されている文字列に変更される。<br />
一覧でアイテムを選択し、[削除]ボタンをクリックすると選択されている１行が削除される。</p>
<p>&nbsp;</p>
<h2>SwingAppMainとToDoListPaneの2つのクラス、それぞれの役割</h2>
<h3>プログラムの解説</h3>
<p>ToDoリストが提供する機能はToDoListPaneクラスが担当し、アプリケーションの起動等の機能はSwingAppMainクラスが担当するという構成になっている。</p>
<h4>JListの生成</h4>
<p>ToDoリストは追加／編集／削除機能を持つため、ListModel も状態の変更を受けて更新する処理が必要。<br />
ここでは、これらの機能を満たしているDefaultListModelを生成している。（ここでは標準ライブラリに用意されている実装を利用しているが、ListModelを実装することで、自由に実装することが可能）</p><pre class="urvanov-syntax-highlighter-plain-tag">// 一覧を生成
toDoListModel = new DefaultListModel();
toDoList = new JList(toDoListModel);
JScrollPane listScrollPane = new JScrollPane(toDoList);</pre><p>2行目、3行目でDefaultListModelを使用してJListを生成し、JListにスクロール機能を与えている。<br />
最後にaddメソッドによりToDoListPaneに追加し、ToDo一覧の作成が完了する。</p><pre class="urvanov-syntax-highlighter-plain-tag">add(listScrollPane, BorderLayout.NORTH);</pre><p></p>
<h4>ToDo追加機能の実装(AddActionHandler)</h4>
<p>AddActionHandlerクラスは、［追加］ボタンのイベントに対する処理を担当するインナークラス。<br />
「toDoListModel.addElement();」にて、toDoListModelへパラメータで指定したデータを追加することができる。<br />
追加されたデータの情報は、ListModelの監視の仕組みにより、JListのビューへ反映される。</p><pre class="urvanov-syntax-highlighter-plain-tag">/**
* 追加ボタンアクションのハンドラ
*/
private class AddActionHandler implements ActionListener {
	public void actionPerformed(ActionEvent e) {
		// テキストフィールドの内容をリストモデルに追加
		toDoListModel.addElement(toDoInputField.getText());
	}
}</pre><p></p>
<h4>ToDo編集機能の実装(ModifyActionHandler)</h4>
<p>ModifyActionHandlerクラスは、編集ボタンのイベントに対する処理を担当するインナークラス。<br />
「toDoListModel. set(int index, Object target);」にて、toDoListModelのindex番目のデータ、targetを設定することができる。</p>
<h4>ToDo削除機能の実装(RemoveActionHandler)</h4>
<p>RemoveActionHandlerクラスは、削除ボタンのイベントに対する処理を担当するインナークラス。<br />
「setButtonsEnabled(false)」にて、すべてのボタンを非活性化し、その後doLongTaskにて、10秒待つ。<br />
その後、「toDoListModel.remove(int index);」にて、toDoListModelのindex番目のデータを削除する。<br />
削除した後、「setButtonsEnabled(true)」にて、すべてのボタンを活性化する。</p>
<h4>ToDo選択行反映機能の実装(TodoListSelectionHandler)</h4>
<p>TodoListSelectionHandlerクラスは、ToDoリストで選択した行の内容をテキストフィールドに反映する。</p>
<h4>イベントディスパッチスレッド</h4>
<p>削除処理にあえて10秒間待つ処理を入れた。<br />
もし単純にこれを処理してしまうと、削除処理中は何も操作できなくなってしまう。<br />
このような事態を避けるために、時間のかかる処理を別のスレッドに任せて、ユーザーが操作を行えるようにしながらバックグラウンドで処理を行う。<br />
ここでは、RemoveThreadクラス内で別スレッドを呼び出し、時間のかかる処理（doLongTask）と削除処理を実行させることによって実現している。<br />
時間のかかる処理を行った後、最後にSwingUtilities.invokeLater()を呼び出している。<br />
これは、「toDoListModel.remove(int index);」および「setButtonsEnabled(true)」の2つの処理をイベントディスパッチスレッドで実行させるために使っている。<br />
Swingのスレッドポリシーとして、“コンポーネントの「状態に依存する」あるいは「状態に影響を与える」処理はすべてイベントディスパッチスレッド上で動作しなければならない“というものがある。<br />
これはいい換えると、Swingの描画に関連する処理は、シングルスレッドで処理しなくてはならないということ。<br />
そして、そのシングルスレッドがイベントディスパッチスレッドになる。<br />
このルールに則るため、わざわざSwingUtilities.invokeLater()を使っている。<br />
今回の実装でも、sleepは描画に関係がないため別スレッドを生成して実行させたが、描画に関する処理（toDoListModel.remove、setButtonsEnabled）はイベントディスパッチスレッドで実行させるようにしている。</p>
<h3>SwingAppMainクラス</h3>
<h4>SwingUtilities.invokeLater</h4>
<p>「SwingAppMain」クラスのmainメソッド内ではSwingUtilities.invokeLater を呼び出し、Frameを描画する処理をイベントディスパッチスレッドに実行させている。<br />
mainメソッドのスレッドが描画しているわけではない。</p>
<h4>SwingUtilities.isEventDispatchThread</h4>
<p>「SwingAppMain」クラスのmainメソッドとcreateAndShowTodoListメソッドでは、SwingUtilities.isEventDispatchThreadというメソッドが呼び出されている。<br />
これは、実行されているスレッドがイベントディスパッチスレッドであればtureを、別のスレッドであればfalseを返す。<br />
「SwingAppMain」を実行すると、コンソールに以下のように表示される。</p><pre class="urvanov-syntax-highlighter-plain-tag">main : false
createAndShowTodoList : true</pre><p>createAndShorTodoListメソッドは、イベントディスパッチスレッド上で実行されていることが分かる。</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-735325828"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-119572743"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/509/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">509</post-id>	</item>
		<item>
		<title>JavaでSwingを利用したGUIアプリケーションの作成４（イベント処理）</title>
		<link>https://knowledge.reontosanta.com/archives/506</link>
					<comments>https://knowledge.reontosanta.com/archives/506#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Wed, 21 Oct 2015 23:22:18 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=506</guid>

					<description><![CDATA[Swingを利用したウィンドウの表示、ボタンやラベルの配置、テキスト&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>Swingを利用した<a href="http://knowledge.reontosanta.com/archives/500">ウィンドウの表示</a>、<a href="http://knowledge.reontosanta.com/archives/502">ボタンやラベルの配置</a>、<a href="http://knowledge.reontosanta.com/archives/504">テキスト入力</a>と来たので、イベント処理を取り入れたGUIアプリケーションを作成する。</p>
<p>GUIアプリケーションにおいて、</p>
<ol>
<li>ユーザーの操作を検知する</li>
<li>アプリケーションの振る舞いを状況に応じて判断する</li>
<li>ユーザーの期待する処理を実行する</li>
</ol>
<p>という一連の作業をプログラミングする必要がある。</p>
<p>Swingには、この一連の作業を簡単にプログラミングできるような仕組みであるイベント処理のモデル（アクション、イベント、アクション・リスナー）があらかじめ用意されている。</p>
<h3>アクション</h3>
<p>GUIコンポーネント（ボタン、テキストフィールド、メニュー等）に対してユーザーが行う操作を「アクション」という。<br />
例えばボタンをクリックする、メニューを選択する等の行動を指す。</p>
<h3>イベント</h3>
<p>ユーザーが操作した事実およびユーザーの操作に関する情報を保持するオブジェクトを「イベント」という。<br />
このイベントはコンポーネントに対してアクションが行われるたびに生成される。<br />
例えばボタンAがクリックされた、ボタンBがクリックされた、メニュー「ファイル」が選択された、といったアクションを行うと、コンポーネントはその事実や情報を保持するためのクラス「java.awt.event.ActionEvent」のインスタンスを生成する。</p>
<h3>アクション・リスナー</h3>
<p>ユーザーの操作に応じて一定の処理を行うインターフェイスを「アクション・リスナー」という。<br />
アクション・リスナーはインターフェイス「java.awt.event.ActionListener」であるため、具体的な処理を記述できない。<br />
そのため、例えば音を鳴らす、ダイアログボックスを表示する、といった具体的なアプリケーションの処理はそのインターフェイスを実装した具象クラスのメソッド（actionPerformed）にプログラミングすることになる。</p>
<p>&nbsp;</p>
<h2>アプリケーションの振る舞いを実装</h2>
<h3>プロジェクトの作成</h3>
<p>プロジェクト名「SwingSample04」を作成する。</p>
<p>１．[ファイル]⇒[新規]⇒[プロジェクト]を選択</p>
<p>２．[Javaプロジェクト]を選択し[次へ]をクリック</p>
<p>３．プロジェクト名等を入力し[完了]をクリック</p>
<ul>
<li>プロジェクト名に「SwingSample04」を入力</li>
<li>プロジェクト・レイアウトで[プロジェクト・フォルダーを・・・]を選択</li>
</ul>
<h3>クラスの作成</h3>
<p>GUIアプリケーションの起動、コンポーネントの配置、コンポーネントのアクションに応じた処理を担当するクラス「SwingAppMain」を作成する。</p>
<p>１．[ファイル]⇒[新規]⇒[クラス]を選択</p>
<p>２．[新規Javaクラス]ダイアログで各項目を入力し[完了]をクリック</p>
<ul>
<li>パッケージに「swing.sample」を入力</li>
<li>名前に「SwingAppMain」を入力</li>
<li>public static void main(String[] args)をチェック</li>
</ul>
<p>３．作成したクラスのソースコードを以下のように変更</p><pre class="urvanov-syntax-highlighter-plain-tag">package swing.sample;
// 必要なクラスのインポート
import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class SwingAppMain implements ActionListener {
	private JFrame mainFrame;
	private Container contentPane;
	private JTextField textField;
	private JTextArea textArea;
	private JScrollPane scrollPane;
	private JPanel buttonPane;
	private JButton addButton;
	private JButton clearButton;

	// コンストラクタ
	public SwingAppMain() {
		mainFrame = new JFrame("サンプル");
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		mainFrame.setSize(320, 200);
		mainFrame.setLocationRelativeTo(null);
		contentPane = mainFrame.getContentPane();
		textField = new JTextField();
		textArea = new JTextArea();
		scrollPane = new JScrollPane(textArea);
		addButton = new JButton("追加");
		clearButton = new JButton("消去");
		// 「追加」ボタンとアクション・リスナーの関連付け
		addButton.addActionListener(this);
		// 「消去」ボタンとアクション・リスナーの関連付け
		clearButton.addActionListener(this);
		buttonPane = new JPanel();
		buttonPane.add(addButton);
		buttonPane.add(clearButton);
		contentPane.add(textField, BorderLayout.NORTH);
		contentPane.add(scrollPane, BorderLayout.CENTER);
		contentPane.add(buttonPane, BorderLayout.SOUTH);
		mainFrame.setVisible(true);
	}

	// ユーザーの操作に応じた処理を実装
	public void actionPerformed(ActionEvent event){
		// ユーザーの操作対象を判断
		if(event.getSource() == addButton) {
			// テキストエリアへ文字列を追加
			textArea.append(textField.getText() + "\n");
		}
		if(event.getSource() == clearButton) {
			// テキストエリアの文字列を全消去
			textArea.setText(null);
		}
	}

	// アプリケーションの起動
	public static void main(String[] args) {
		new SwingAppMain();
	}
}</pre><p>４．［実行］→［Javaアプリケーション］を選択して、実行する</p>
<p>実行した結果、テキスト入力用コンポーネント、追加・消去のボタンが配置されたウィンドウが開く。<br />
ユーザーの操作（［追加］ボタンのクリックというアクション）に応じてテキストフィールドに入力されている文字列をテキストエリアに追加する。<br />
ユーザーの操作（［消去］ボタンのクリックというアクション）に応じてテキストエリアの文字列をすべて消去する。</p>
<p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-3988416915"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>アクション・リスナーの実装</h2>
<p>ボタンに対してユーザーの操作（アクション）に反応するためには「ActionListener」をimplementsしたクラスを定義する必要がある。<br />
今回の例では「SwingAppMain」自身がその役割を担っている。</p><pre class="urvanov-syntax-highlighter-plain-tag">public class SwingAppMain implements ActionListener {</pre><p>このインターフェイスは抽象メソッド「actionPerformed」を宣言しているため、「ActionListener」インターフェイスはimplementsするだけでは機能しない。<br />
そのため「SwingAppMain」固有の「actionPerformed」メソッドを定義する。</p><pre class="urvanov-syntax-highlighter-plain-tag">public void actionPerformed(ActionEvent event){
}</pre><p>&nbsp;</p>
<h2>アクション・リスナーの登録</h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">// 「追加」ボタンとアクション・リスナーの関連付け
addButton.addActionListener(this);
// 「消去」ボタンとアクション・リスナーの関連付け
clearButton.addActionListener(this);</pre><p>ボタンはアクションがあった場合に、どのクラス（メソッド）を実行すればよいかをあらかじめ知っておく（関連付けておく）必要がある。<br />
そのため「addActionListener」を記述し、ボタンとアクション・リスナーを実装したクラスとを関連付ける。<br />
「addActionListener」の引数には「ActionListener」をimplementsしたクラスのインスタンスを設定する。<br />
今回の例では「SwingAppMain」自身となるため「this」を設定している。<br />
上記のコードを記述することで［追加］ボタンまたは［消去］ボタンがクリックされたとき「SwingAppMain」クラス固有の「actionPerformed」が実行されるようになる。</p>
<p>&nbsp;</p>
<h2>ユーザーの操作に応じた処理の実装</h2>
<p>ボタンに対してアクションを行うと「ActionEvent」のインスタンスが生成される。<br />
今回の例では、「追加」ボタンまたは「消去」ボタンに対して行われたアクション（クリック）の結果として生成された「ActionEvent」クラスのインスタンスの情報を基にアプリケーションの振る舞い（actionPerformed）を変えている。</p><pre class="urvanov-syntax-highlighter-plain-tag">// ユーザーの操作に応じた処理を実装
public void actionPerformed(ActionEvent event){
	// ユーザーの操作対象を判断
	if(event.getSource() == addButton) {
		// テキストエリアへ文字列を追加
		textArea.append(textField.getText() + "\n");
	}
	if(event.getSource() == clearButton) {
		// テキストエリアの文字列を全消去
		textArea.setText(null);
	}
}</pre><p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-1300467232"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-2998403385"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/506/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">506</post-id>	</item>
		<item>
		<title>JavaでSwingを利用したGUIアプリケーションの作成３（テキストフィールドの配置）</title>
		<link>https://knowledge.reontosanta.com/archives/504</link>
					<comments>https://knowledge.reontosanta.com/archives/504#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Fri, 16 Oct 2015 00:16:27 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=504</guid>

					<description><![CDATA[Swingを利用してウィンドウの表示、ボタンやラベルの配置が出来たの&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>Swingを利用して<a href="http://knowledge.reontosanta.com/archives/500">ウィンドウの表示</a>、<a href="http://knowledge.reontosanta.com/archives/502">ボタンやラベルの配置</a>が出来たので、次にテキスト入力ができるGUIアプリケーションを作成する。</p>
<p>Swingで利用できるテキスト入力用コンポーネントには、以下のものが存在する。</p>
<ul>
<li>1行分の入力ができる「JTextField」</li>
<li>複数行の入力ができる「JTextArea」</li>
</ul>
<p>&nbsp;</p>
<h2>プロジェクトの作成</h2>
<p>プロジェクト名「SwingSample03」を作成する。</p>
<p>１．[ファイル]⇒[新規]⇒[プロジェクト]を選択</p>
<p>２．[Javaプロジェクト]を選択し[次へ]をクリック</p>
<p>３．プロジェクト名等を入力し[完了]をクリック</p>
<ul>
<li>プロジェクト名に「SwingSample03」を入力</li>
<li>プロジェクト・レイアウトで[プロジェクト・フォルダーを・・・]を選択</li>
</ul>
<p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-3916136897"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>クラスの作成</h2>
<p>GUIアプリケーションの起動および各コンポーネントの作成を行う「SwingAppMain」クラスを作成する。</p>
<p>１．[ファイル]⇒[新規]⇒[クラス]を選択</p>
<p>２．[新規Javaクラス]ダイアログで各項目を入力し[完了]をクリック</p>
<ul>
<li>パッケージに「swing.sample」を入力</li>
<li>名前に「SwingAppMain」を入力</li>
<li>public static void main(String[] args)をチェック</li>
</ul>
<p>３．作成したクラスに以下のクラスをインポート</p>
<ul>
<li>javax.swing.JButton</li>
<li>javax.swing.JFrame</li>
<li>javax.swing.JScrollPane</li>
<li>javax.swing.JTextArea</li>
<li>javax.swing.JTextField</li>
<li>java.awt.BorderLayout</li>
<li>java.awt.Container</li>
</ul>
<p>４．mainメソッド内で「JFrame」クラスのインスタンス（mainFrame）を生成し初期設定を行いテキストフィールド、テキストエリアを配置</p>
<p>以下の項目の実装</p>
<ul>
<li>JFrameクラスのインスタンスを生成</li>
<li>閉じるボタン押下時のアプリケーションの振る舞いを決定</li>
<li>ウィンドウの初期サイズ（幅、高さ）をピクセル単位で設定</li>
<li>ウィンドウの表示場所を規定（画面の中央に表示）</li>
<li>mainFrameのContentPaneを取得（contentPane）</li>
<li>「JTextField」クラスのインスタンス(textField)を生成</li>
<li>「JTextArea」クラスのインスタンス(textArea)を生成</li>
<li>「JScrollPane」クラスのインスタンス(scrollPane)を生成し、textAreaを追加</li>
<li>「JButton」クラスのインスタンス（button）を生成</li>
<li>アクションの定義</li>
<li>contentPaneにtextField、textArea、buttonを追加</li>
<li>ウィンドウの表示</li>
</ul>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">package swing.sample;
// 必要なクラスのインポート
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.AbstractAction;

public class SwingAppMain {
	public static void main(String[] args) {
		// JFrameクラスのインスタンスを生成
		JFrame mainFrame = new JFrame("サンプル");
		// 閉じるボタン押下時のアプリケーションの振る舞いを決定
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// ウィンドウの初期サイズ（幅、高さ）をピクセル単位で設定
		mainFrame.setSize(320, 160);
		// ウィンドウの表示場所を規定
		mainFrame.setLocationRelativeTo(null);

		// mainFrameのContentPaneを取得する
		Container contentPane = mainFrame.getContentPane();
		// テキストフィールドのインスタンスを生成
		final JTextField textField = new JTextField();
		// テキストエリアのインスタンスを生成
		final JTextArea textArea = new JTextArea(5,0);
		// スクロールペインにテキストエリアを追加
		JScrollPane scrollPane = new JScrollPane(textArea);
		// ボタンのインスタンスを生成
		JButton button = new JButton("追加");
		// アクションの定義
		button.addActionListener(new AbstractAction(){
			private static final long serialVersionUID = 1L;
			public void actionPerformed(ActionEvent arg0) {
				// textFieldから文字列を取得し、取得した文字列に改行コードを加え、textAreaに追加
				textArea.append(textField.getText() + "\n");
			}
		});
		// パネルをコンポーネントに配置
		contentPane.add(textField, BorderLayout.NORTH);
		contentPane.add(scrollPane, BorderLayout.CENTER);
		contentPane.add(button, BorderLayout.SOUTH);

		// ウィンドウを表示する
		mainFrame.setVisible(true);
	}
}</pre><p>５．［実行］→［Javaアプリケーション］を選択して、実行する</p>
<p>実行した結果、テキスト入力用コンポーネントが配置されたウィンドウが開く。</p>
<p>上段のテキストフィールドに値を入力し、「追加」ボタンをクリックするとテキストフィールドの値が下段のテキストエリアに追加される。</p>
<h4>JScrollPane</h4>
<p>JScrollPaneは、自身に追加されたコンポーネントに対して、スクロール処理を提供する。<br />
サンプルでは、下段のテキストエリアに対して改行を数回入力すると、スクロールバーが現れる。</p>
<h4>JScrollPaneの生成</h4>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">JScrollPane scrollPane = new JScrollPane(textArea);</pre><p>このコードでは、コンストラクタでJScrollPaneに追加するコンポーネントを指定している。<br />
上記の場合は、textAreaが追加するコンポーネント。<br />
textArea内の行数が増えたり、行内の文字数が増えたりしてスクロールする必要が生じると、スクロールバーが表示される。</p>
<p>&nbsp;</p>
<h2>テキストフィールドの値の取得と設定</h2>
<h4>テキスト入力用コンポーネントからの値の取得</h4>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">getText()</pre><p>getText()はJTextFieldとJTextAreaの親クラスであるJTextComponentクラスで提供されているメソッドで、テキスト入力用コンポーネント内のテキスト全体を取得する。<br />
このほかにも、オフセットと読取長を指定したgetText(int, int)や、選択されている部分のみを取得するgetSelectedText()がある。</p>
<h4>テキスト入力用コンポーネントへの値の設定</h4>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">setText(String)
append(String)</pre><p>setText(String)はJTextFieldとJTextAreaの親クラスであるJTextComponentクラスで提供されているメソッドで、テキスト入力用コンポーネントにパラメータで指定した文字列が設定される。<br />
Append(String)はJTextAreaクラスで提供されているメソッドで、パラメータをテキストの末尾に追加する。</p>
<h2></h2>
<h2>アクションの定義</h2>
<p>「クラスの作成」で作成したウィンドウでは、テキスト入力用コンポーネントから値を取得したり、値を設定したりすることはできない。<br />
そこで、以下のようなコードが必要になる。</p>
<h4>クラスのインポート</h4>
<p>java.awt.event.ActionEvent<br />
javax.swing.AbstractAction</p><pre class="urvanov-syntax-highlighter-plain-tag">// アクションの定義
button.addActionListener(new AbstractAction(){
	private static final long serialVersionUID = 1L;
	public void actionPerformed(ActionEvent arg0) {
		// textFieldから文字列を取得し、取得した文字列に改行コードを加え、textAreaに追加
		textArea.append(textField.getText() + "\n");
	}
});</pre><p>ここでは、次のようなことを行っている。</p>
<ul>
<li>textFieldから文字列を取得(textField.getText())</li>
<li>取得した文字列に改行コードを加え、textAreaに追加</li>
</ul>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-2371126515"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-3807291641"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/504/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">504</post-id>	</item>
		<item>
		<title>JavaでSwingを利用したGUIアプリケーションの作成２（ボタン、ラベルの配置）</title>
		<link>https://knowledge.reontosanta.com/archives/502</link>
					<comments>https://knowledge.reontosanta.com/archives/502#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Sat, 10 Oct 2015 15:03:18 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=502</guid>

					<description><![CDATA[ウィンドウを表示するだけの単純なGUIアプリケーションに続き、ボタン&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p><a href="http://knowledge.reontosanta.com/archives/500">ウィンドウを表示するだけの単純なGUIアプリケーション</a>に続き、ボタンやラベルといったGUIコンポーネントをJFrameに配置したGUIアプリケーションを作成する。</p>
<p>&nbsp;</p>
<h2>Swingコンポーネントの種類</h2>
<p>Swingコンポーネントは以下の3つの階層に分類される。</p>
<p>１．トップレベルコンテナ（JFrame等）<br />
メインウィンドウとなるコンポーネントであり、ほかのコンポーネントの土台となる。</p>
<p>２．中間コンテナ（JPanel等）<br />
コンポーネントを配置するためのコンテナの役割。</p>
<p>３．コントロール（JLable、JButton等）<br />
ボタンやラベルなどの個々のGUI部品。</p>
<p>Swingでは、この3つの階層のコンポーネントを組み合わせてアプリケーションを作成する。</p>
<p>JLabelなどのコントロールを持ったアプリケーションを作成するには、まずトップレベルコンテナを作成し、そこに中間コンテナを配置し、さらに中間コンテナにコントロールを配置するといった手順を踏むことになる。</p>
<p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-2689619441"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>プロジェクトの作成</h2>
<p>プロジェクト名「SwingSample02」を作成する。</p>
<p>１．[ファイル]⇒[新規]⇒[プロジェクト]を選択</p>
<p>２．[Javaプロジェクト]を選択し[次へ]をクリック</p>
<p>３．プロジェクト名等を入力し[完了]をクリック</p>
<ul>
<li>プロジェクト名に「SwingSample02」を入力</li>
<li>プロジェクト・レイアウトで[プロジェクト・フォルダーを・・・]を選択</li>
</ul>
<p>&nbsp;</p>
<h2>クラスの作成</h2>
<p>GUIアプリケーションの起動および各コンポーネントの作成を行う「SwingAppMain」クラスを作成する。</p>
<p>１．[ファイル]⇒[新規]⇒[クラス]を選択</p>
<p>２．[新規Javaクラス]ダイアログで各項目を入力し[完了]をクリック</p>
<ul>
<li>パッケージに「swing.sample」を入力</li>
<li>名前に「SwingAppMain」を入力</li>
<li>public static void main(String[] args)をチェック</li>
</ul>
<p>３．作成したクラスに以下のクラスをインポート</p>
<ul>
<li>javax.swing.JButton</li>
<li>javax.swing.JFrame</li>
<li>javax.swing.JLabel</li>
<li>java.awt.BorderLayout</li>
</ul>
<p>４．mainメソッド内で「JFrame」クラスのインスタンス（mainFrame）を生成し初期設定を行いラベル、ボタンを配置</p>
<p>以下の項目の実装</p>
<ul>
<li>JFrameクラスのインスタンスを生成</li>
<li>閉じるボタン押下時のアプリケーションの振る舞いを決定</li>
<li>ウィンドウの初期サイズ（幅、高さ）をピクセル単位で設定</li>
<li>ウィンドウの表示場所を規定（画面の中央に表示）</li>
<li>mainFrameのContentPaneを取得（contentPane）</li>
<li>［JLabel］クラスのインスタンス（label）を生成</li>
<li>［JButton］クラスのインスタンス（button）を生成</li>
<li>contentPaneにlabelを追加</li>
<li>contentPaneにbuttonを追加</li>
<li>ウィンドウの表示</li>
</ul>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">package swing.sample;
// 必要なクラスのインポート
import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class SwingAppMain {
	/**
	　* @param args
	*/
	public static void main(String[] args) {
		// JFrameクラスのインスタンスを生成
		JFrame mainFrame = new JFrame("サンプル");
		// 閉じるボタン押下時のアプリケーションの振る舞いを決定
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// ウィンドウの初期サイズ（幅、高さ）をピクセル単位で設定
		mainFrame.setSize(320, 160);
		// ウィンドウの表示場所を規定
		mainFrame.setLocationRelativeTo(null);

		// JFrameよりContentPaneを取得
		Container contentPane = mainFrame.getContentPane();
		// ラベルのインスタンスを生成
		JLabel label = new JLabel("SwingLabel");
		// ボタンのインスタンスを生成
		JButton button = new JButton("SwingButton");
		// ラベルをContentPaneに配置
		contentPane.add(label, BorderLayout.CENTER);
		// ボタンをContentPaneに配置
		contentPane.add(button, BorderLayout.SOUTH);

		// ウィンドウを表示
		mainFrame.setVisible(true);
	}
}</pre><p>５．［実行］→［Javaアプリケーション］を選択して、実行する</p>
<p>実行した結果、タイトルバーに「サンプル」、ラベルとボタンが配置されたウィンドウが開く</p>
<p>&nbsp;</p>
<h2>各コンポーネントの役割と機能</h2>
<h3>ContentPane</h3>
<p>ContentPaneとは、JFrameの表示領域。<br />
JFrameに表示したいコンポーネントは、ContentPaneに追加する必要がある。</p>
<h4>ContentPaneの取得</h4>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">Container contentPane = mainFrame.getContentPane();</pre><p>上記コードのgetContentPaneメソッドで、ContentPaneを取得している。<br />
ContentPaneは、Containerクラスの型で取得できるが、JFrameの中でJPanelとして生成されている。</p>
<h3>JPanelクラス</h3>
<p>JPanelは、複数のコンポーネントを配置できるコンテナ（コンポーネントを張り付ける台紙のイメージ）。<br />
Swingでは、JPanelのような中間コンテナにコンポーネントを張り付ける感覚で画面を作成する。</p>
<h4>コンポーネントの配置</h4>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">contentPane.add(label, BorderLayout.CENTER);
contentPane.add(button, BorderLayout.SOUTH);</pre><p>上記コードで、ContentPaneにコンポーネントを追加することができる。<br />
addメソッドの第1パラメータでは、ContentPaneに配置したいコンポーネントを指定。<br />
第2パラメータでは、コンポーネントを配置する位置を指定。<br />
BorderLayout.CENTERは、コンポーネントをContentPaneの中心に配置することを意味している。（BorderLayoutクラスの定数）</p>
<h4>レイアウトマネージャ</h4>
<p>コンテナ内のコンポーネントのレイアウトに関してはレイアウトマネージャが管理している。<br />
レイアウトマネージャにはBorderLayoutや、GridLayoutなどさまざまな種類のものがある。<br />
これらのレイアウトマネージャを使用することでコンテナ内の統一的なレイアウトを簡単に実現することができる。</p>
<h3>BorderLayoutクラス</h3>
<p>BorderLayoutは、「east、west、south、north、center」の5つの領域に分けてコンポーネントを配置する。<br />
1つの表示領域には、1つのコンポーネントを配置することができる。<br />
設定されたコンポーネントは、その領域を満たすサイズで表現される。</p><pre class="urvanov-syntax-highlighter-plain-tag">Package swing.sample;
import java.awt.BorderLayout;
import javax.swing.Jbutton;
import javax.swing.Jframe;
import javax.swing.Jpanel;
public class BorderLayoutSample {
	/**
	　* @param args
	　*/
	public static void main(String[] args) {
		Jframe mainFrame = new Jframe(“BorderLayoutSample”);
		mainFrame.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);
		mainFrame.setSize(320, 160);
		mainFrame.setLocationRelativeTo(null);
		Jpanel contentPane = (Jpanel) mainFrame.getContentPane();
		Jbutton north = new Jbutton(“north”);
		Jbutton west = new Jbutton(“west”);
		Jbutton east = new Jbutton(“east”);
		Jbutton center = new Jbutton(“center”);
		Jbutton south = new Jbutton(“south”);
		contentPane.add(north, BorderLayout.NORTH);
		contentPane.add(west, BorderLayout.WEST);
		contentPane.add(east, BorderLayout.EAST);
		contentPane.add(center, BorderLayout.CENTER);
		contentPane.add(south, BorderLayout.SOUTH);
		mainFrame.setVisible(true);
	}
}</pre><p></p>
<h3>Jlabelクラス</h3>
<p>Jlabelクラスは、文字列やイメージの表示に使用するクラス。</p>
<h4>インスタンスの生成</h4>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">JLabel label = new JLabel("SwingLabel");</pre><p>上記コードで、JLabelクラスのインスタンスを生成している。<br />
コンストラクタには、JLabelで表示したい文字列を設定している。<br />
また、表示したい文字列はインスタンスを生成した後で設定することも可能。<br />
その場合は、JLabelクラスのsetTextメソッドを使用する。</p>
<h4>表示文字列の配置位置の制御</h4>
<p>JLabelは、表示文字列の配置位置を制御することができる。</p><pre class="urvanov-syntax-highlighter-plain-tag">label.setHorizontalAlignment(SwingConstants.CENTER);</pre><p>上記コードで、labelインスタンスに設定した文字列が中央に表示される。<br />
etHorizontalAlignmentは、表示文字列の横軸に沿った配置位置を制御するメソッド。<br />
パラメータのSwingConstants.CENTERで表示文字列を配置する位置を指定する。<br />
SwingConstantsは、JLabelが継承しているインターフェイスで、コンポーネントの配置に関する定数が定義されている。<br />
JLabel、JButton等のSwingConstantsを継承したクラスは、SwingConstantsの定数を使用することで、配置の指定に関する表現が統一されている。</p>
<h3>JButtonクラス</h3>
<p>JButtonクラスは、プッシュボタンを表現するクラス。JLabel同様、イメージを表示することも可能。</p>
<h4>インスタンスの生成</h4>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">JButton button = new JButton("SwingButton");</pre><p>上記コードで、JButtonクラスのインスタンスを生成している。<br />
コンストラクタには、JButtonで表示したい文字列を設定している。<br />
JLabelと同じく、setTextメソッドを使用することで後から表示文字列を設定することができる。</p>
<h4>有効無効の制御</h4>
<p>ボタンの有効無効を制御するには、setEnabledメソッドを使用する。</p><pre class="urvanov-syntax-highlighter-plain-tag">button.setEnabled(false);</pre><p>上記コードで、buttonインスタンスで生成したボタンが無効状態となる。<br />
setEnabledメソッドは、パラメータのboolean値で有効無効を指定することができる。<br />
trueの場合が有効、falseの場合が無効を意味する。<br />
このsetEnabledメソッドは、トップレベルコンテナ（JFrame等）以外のすべてのSwingコンポーネントが継承しているJComponentクラスのメソッド。<br />
よって、トップレベルコンテナ以外のSwingコンポーネントはsetEnabledメソッドにより、有効無効を制御することができる。<br />
JLabelもsetEnabledメソッドを使用して有効無効を制御することができる。</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-2395674201"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-591111032"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/502/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">502</post-id>	</item>
		<item>
		<title>JavaでSwingを利用したGUIアプリケーションの作成１（プロジェクトの作成とウィンドウの表示）</title>
		<link>https://knowledge.reontosanta.com/archives/500</link>
					<comments>https://knowledge.reontosanta.com/archives/500#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Thu, 01 Oct 2015 04:34:57 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=500</guid>

					<description><![CDATA[GUIアプリケーション（ウィンドウ、ボタン、メニューやアイコンといっ&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>GUIアプリケーション（ウィンドウ、ボタン、メニューやアイコンといった部品を使ったユーザーインターフェイス（操作画面）を提供するアプリケーション）を開発する為にJavaでは、「Swing」というクラスライブラリ（クラス、インターフェイス群）が用意されている。</p>
<p>まずは、ウィンドウを表示するだけの単純なGUIアプリケーションを作成する。</p>
<p>&nbsp;</p>
<h2>プロジェクトの作成</h2>
<p>プロジェクト名「SwingSample01」を作成する。</p>
<p>１．[ファイル]⇒[新規]⇒[プロジェクト]を選択</p>
<p>２．[Javaプロジェクト]を選択し[次へ]をクリック</p>
<p>３．プロジェクト名等を入力し[完了]をクリック</p>
<ul>
<li>プロジェクト名に「SwingSample01」を入力</li>
<li>プロジェクト・レイアウトで[プロジェクト・フォルダーを・・・]を選択</li>
</ul>
<p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-3691119869"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>クラスの作成</h2>
<p>GUIアプリケーションの起動およびウィンドウの作成を行う「SwingAppMain」クラスを作成する。</p>
<p>１．[ファイル]⇒[新規]⇒[クラス]を選択</p>
<p>２．[新規Javaクラス]ダイアログで各項目を入力し[完了]をクリック</p>
<ul>
<li>パッケージに「swing.sample」を入力</li>
<li>名前に「SwingAppMain」を入力</li>
<li>public static void main(String[] args)をチェック</li>
</ul>
<p>３．作成したクラスに「javax.swing.JFrame」をインポート</p><pre class="urvanov-syntax-highlighter-plain-tag">package swing.sample;
// 「javax.swing.JFrame」をインポート
import javax.swing.JFrame;
public class SwingAppMain {
	/**
	* @param args
	*/
	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
	}
}</pre><p>４．mainメソッド内で「JFrame」クラスのインスタンス（mainFrame）を生成し初期設定を行う</p>
<p>以下の項目の実装</p>
<ul>
<li>JFrameクラスのインスタンスを生成</li>
<li>閉じるボタン押下時のアプリケーションの振る舞いを決定</li>
<li>ウィンドウの初期サイズ（幅、高さ）をピクセル単位で設定</li>
<li>ウィンドウの表示場所を規定（画面の中央に表示）</li>
<li>ウィンドウの表示</li>
</ul>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">package swing.sample;
// 「javax.swing.JFrame」をインポート
import javax.swing.JFrame;

public class SwingAppMain {
	/**
	* @param args
	*/
	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		// JFrameクラスのインスタンスを生成
		JFrame mainFrame = new JFrame("サンプル");
		// 閉じるボタン押下時のアプリケーションの振る舞いを決定
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// ウィンドウの初期サイズ（幅、高さ）をピクセル単位で設定
		mainFrame.setSize(320, 160);
		// ウィンドウの表示場所を規定
		mainFrame.setLocationRelativeTo(null);
		// ウィンドウを表示
		mainFrame.setVisible(true);
	}
}</pre><p>５．［実行］→［Javaアプリケーション］を選択して、実行する</p>
<p>実行した結果、タイトルバーに「サンプル」と表示されたウィンドウが開く。</p>
<p>&nbsp;</p>
<h2>JFrame</h2>
<p>ウィンドウを作成するためのクラス。<br />
Swingを利用したGUIアプリケーションでは、必ず初めにJFrameクラスのインスタンスを生成し、その後、生成したインスタンスのメソッドを介してウィンドウの初期設定を行う。</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-654889962"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-2723850105"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/500/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">500</post-id>	</item>
		<item>
		<title>Javaのjava.util.loggingでログ出力を設定ファイルで制御する</title>
		<link>https://knowledge.reontosanta.com/archives/668</link>
					<comments>https://knowledge.reontosanta.com/archives/668#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Thu, 30 Jul 2015 06:08:36 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=668</guid>

					<description><![CDATA[ロガーの設定を外部のプロパティファイル（構成ファイル）から与えること&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>ロガーの設定を外部のプロパティファイル（構成ファイル）から与えることができる。</p>
<p>loggerインスタンスを作成する度にコード内で設定を記述するのは非効率であり、ログレベル等の変更をするにもリビルドが必要になってしまう。</p>
<p>プロパティファイルを利用すれば、上記の問題を解決できる。</p>
<p>&nbsp;</p>
<h2>標準出力へログ出力するハンドラを定義</h2>
<p>標準出力へログ出力するハンドラを通常のクラスとして定義する。</p>
<p>ログレベルの設定は、プロパティファイルで行うので指定不要。</p><pre class="urvanov-syntax-highlighter-plain-tag">package logging.test;

import java.util.logging.StreamHandler;

/*
 * 標準出力へログ出力するハンドラ
 */
public class StdOutHandler extends StreamHandler {
	{
		//標準出力への出力設定
		setOutputStream(System.out);
	}
}</pre><p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-2018979333"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>プロパティファイルを作成する</h2>
<p>ハンドラの指定、ルートロガーのログレベル設定、標準出力ハンドラの設定、SimpleFormatterのフォーマット変更を記述し、実行コードと同じディレクトリに配置する。</p><pre class="urvanov-syntax-highlighter-plain-tag">#Specified handler
handlers= logging.test.StdOutHandler
#Log level setting of the root logger
.level= ALL
#Setting the standard output handler
logging.test.StdOutHandler.level = ALL
#Format change of SimpleFormatter
java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS.%1$tL %4$s [%3$s] %5$s (%2$s) %6$s%n</pre><p>&nbsp;</p>
<h2>ログを標準出力へ出力する</h2>
<p>定義しておいたプロパティファイルを読み込んで、ログ出力を行う。</p><pre class="urvanov-syntax-highlighter-plain-tag">package logging.test;

import java.io.IOException;
import java.util.logging.LogManager;
import java.util.logging.Logger;

public class StandardOutput {
	public static void main(String[] args) {
		// プロパティファイルの読み込み
		try {
			LogManager.getLogManager().readConfiguration(StandardOutput.class.getResourceAsStream("customLog.properties"));
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		// Loggerクラスのインスタンスを生成
		Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
		// ログ出力
		logger.fine("ログ出力テスト：fine");
		logger.info("ログ出力テスト：info");
		logger.severe("ログ出力テスト：severe");
	}
}</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-3493367147"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-2109383807"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/668/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">668</post-id>	</item>
		<item>
		<title>Javaのjava.util.loggingでログを標準出力に出力する</title>
		<link>https://knowledge.reontosanta.com/archives/665</link>
					<comments>https://knowledge.reontosanta.com/archives/665#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Thu, 30 Jul 2015 06:08:15 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=665</guid>

					<description><![CDATA[標準APIであるjava.util.loggingを利用してログを出&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>標準APIであるjava.util.loggingを利用してログを出力する場合、通常はログがエラー出力に出力される。</p>
<p>これはデフォルトのログ設定ファイルの設定上、ルートロガーのハンドラがConsoleHandlerとなっており、ConsoleHandlerはエラー出力を使う仕様になっている為。</p>
<p>ログの出力先を標準出力に変更するには、別途ハンドラを定義する必要がある。</p>
<p>&nbsp;</p>
<h2>標準出力へログ出力するハンドラを定義</h2>
<p>標準出力へログ出力するハンドラを通常のクラスとして定義する。</p><pre class="urvanov-syntax-highlighter-plain-tag">package logging.test;

import java.util.logging.Level;
import java.util.logging.StreamHandler;

/*
 * 標準出力へログ出力するハンドラ
 */
public class StdOutHandler extends StreamHandler {
	{
		// 標準出力への出力設定
		setOutputStream(System.out);
		// ログレベルの設定（ALLに設定しないとログレベルをコントロールできない）
		setLevel(Level.ALL);
	}
}</pre><p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-3383933128"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>ログを標準出力へ出力する</h2>
<p>定義しておいた標準出力へログ出力するハンドラをロガーに追加して、ログ出力を行う。</p>
<p>その際、デフォルトのログ設定ファイルで管理されているルートロガーのハンドラ（ConsoleHandler）へログメッセージを発行しないように制御しないとエラー出力、標準出力それぞれにログが出力される。</p><pre class="urvanov-syntax-highlighter-plain-tag">package logging.test;

import java.util.logging.Level;
import java.util.logging.Logger;

public class StandardOutput {
	public static void main(String[] args) {
		// Loggerクラスのインスタンスを生成
		Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
		// 標準出力へログを出力するハンドラを追加
		logger.addHandler(new logging.test.StdOutHandler());
		// ルートロガーのハンドラ（ConsoleHandler）へログメッセージを発行しない
		logger.setUseParentHandlers(false);
		// ログレベル設定
		logger.setLevel(Level.ALL);
		// ログ出力
		logger.fine("ログ出力テスト：fine");
		logger.info("ログ出力テスト：info");
		logger.severe("ログ出力テスト：severe");
	}
}</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-3669236037"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-700042073"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/665/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">665</post-id>	</item>
		<item>
		<title>Javaでログを出力する（java.util.loggingパッケージ利用）</title>
		<link>https://knowledge.reontosanta.com/archives/648</link>
					<comments>https://knowledge.reontosanta.com/archives/648#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Fri, 24 Jul 2015 03:54:25 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=648</guid>

					<description><![CDATA[Javaでログを出力するには、Javaの標準APIであるjava.u&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>Javaでログを出力するには、Javaの標準APIであるjava.util.loggingパッケージを利用しする方法がある。</p>
<p>&nbsp;</p>
<h2>ログを出力する</h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">// Loggerクラスのインスタンスを生成する
final Logger logger = Logger.getLogger("SampleLogging");
// ログを出力する
logger.log(Level.FINEST, "ログ出力テスト：finest");
logger.log(Level.FINER, "ログ出力テスト：finer");
logger.log(Level.FINE, "ログ出力テスト：fine");
logger.log(Level.CONFIG, "ログ出力テスト：config");
logger.log(Level.INFO, "ログ出力テスト：info");
logger.log(Level.WARNING, "ログ出力テスト：warning");
logger.log(Level.SEVERE, "ログ出力テスト：severe");</pre><p>Java標準APIでのログ出力の基本は、java.util.logging.Loggerクラス。</p>
<p>Logger.getLogger()で、ロガーに設定する名称をパラメータで渡し、ロガー（Loggerクラスのインスタンス）を取得する。</p>
<p>ロガーに設定する名称としてFQCN（完全修飾クラス名：this.getClass().getName()）を利用することが多い。</p>
<p>log(Level level, String msg)メソッドで、ログレベルとログメッセージをパラメータで渡し、ログを出力する。（ログレベルについては後述）</p>
<p>尚、上記の例では標準エラー出力にのみログ内容が出力され、ファイルには出力されない。</p>
<p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-1588293856"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>ログをファイルに出力する</h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">// Loggerクラスのインスタンスを生成する
final Logger logger = Logger.getLogger("SampleLogging");
try {
    // 出力ファイルを指定する
    FileHandler fh = new FileHandler("SampleLog.log");
    logger.addHandler(fh);
} catch (IOException e) {
    e.printStackTrace();
}
// ログを出力する
logger.log(Level.FINEST, "ログ出力テスト：finest");
logger.log(Level.FINER, "ログ出力テスト：finer");
logger.log(Level.FINE, "ログ出力テスト：fine");
logger.log(Level.CONFIG, "ログ出力テスト：config");
logger.log(Level.INFO, "ログ出力テスト：info");
logger.log(Level.WARNING, "ログ出力テスト：warning");
logger.log(Level.SEVERE, "ログ出力テスト：severe");</pre><p>java.util.logging.FileHandlerクラスを使うことでファイルにも出力できる。</p>
<p>上記の例では、実行ディレクトリのSampleLog.logというファイルにログが出力される。</p>
<p>ただし、出力結果はXML形式となる。</p>
<p>&nbsp;</p>
<h2>ログファイルの出力書式を変更する</h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">// Loggerクラスのインスタンスを生成する
final Logger logger = Logger.getLogger("SampleLogging");
try {
    // 出力ファイルを指定する
    FileHandler fh = new FileHandler("SampleLog.log");
    // 出力フォーマットを指定する
    fh.setFormatter(new java.util.logging.SimpleFormatter());
    logger.addHandler(fh);
} catch (IOException e) {
    e.printStackTrace();
}
// ログを出力する
logger.log(Level.FINEST, "ログ出力テスト：finest");
logger.log(Level.FINER, "ログ出力テスト：finer");
logger.log(Level.FINE, "ログ出力テスト：fine");
logger.log(Level.CONFIG, "ログ出力テスト：config");
logger.log(Level.INFO, "ログ出力テスト：info");
logger.log(Level.WARNING, "ログ出力テスト：warning");
logger.log(Level.SEVERE, "ログ出力テスト：severe");</pre><p>Java標準APIでのログ出力の標準設定はXML形式になっているが、FileHandlerに対してjava.util.logging.SimpleFormatterクラスを設定することで、コンソール出力と同じ書式でファイルに出力できる。</p>
<p>&nbsp;</p>
<h2>ログレベルを変更する</h2>
<p>ログレベルは、文字通りログ出力制御のレベルを指定するために利用されるもので、java.util.logging.Levelクラスで定義されている。</p>
<p>Java標準APIでのログ出力の標準設定では、ログレベルがINFOまでになっており、INFOレベルより下のレベルのログは出力されない。</p>
<p>ログレベル、対応するLoggerクラスの簡易メソッド、それぞれの意味は下記の通り。</p>
<p><h2 id="tablepress-21-name" class="tablepress-table-name tablepress-table-name-id-21">ログレベルの種類（レベルの昇順）</h2>

<table id="tablepress-21" class="tablepress tablepress-id-21" aria-labelledby="tablepress-21-name">
<thead>
<tr class="row-1">
	<th class="column-1">Levelクラス定数</th><th class="column-2">Loggerクラス<br />
簡易メソッド</th><th class="column-3">意味</th>
</tr>
</thead>
<tbody class="row-striping row-hover">
<tr class="row-2">
	<td class="column-1">Level.FINEST</td><td class="column-2">finest(String msg)</td><td class="column-3">詳細レベル（高）／最も詳細</td>
</tr>
<tr class="row-3">
	<td class="column-1">Level.FINER</td><td class="column-2">finer(String msg)</td><td class="column-3">詳細レベル（中）／詳細</td>
</tr>
<tr class="row-4">
	<td class="column-1">Level.FINE</td><td class="column-2">fine(String msg)</td><td class="column-3">詳細レベル（低）／普通</td>
</tr>
<tr class="row-5">
	<td class="column-1">Level.CONFIG</td><td class="column-2">config(String msg)</td><td class="column-3">設定／構成</td>
</tr>
<tr class="row-6">
	<td class="column-1">Level.INFO</td><td class="column-2">info(String msg)</td><td class="column-3">情報</td>
</tr>
<tr class="row-7">
	<td class="column-1">Level.WARNING</td><td class="column-2">warning(String msg)</td><td class="column-3">警告</td>
</tr>
<tr class="row-8">
	<td class="column-1">Level.SEVERE</td><td class="column-2">severe(String msg)</td><td class="column-3">致命的／重大</td>
</tr>
</tbody>
</table>
</p><pre class="urvanov-syntax-highlighter-plain-tag">// Loggerクラスのインスタンスを生成する
final Logger logger = Logger.getLogger("SampleLogging");
try {
    // 出力ファイルを指定する
    FileHandler fh = new FileHandler("SampleLog.log");
    // 出力フォーマットを指定する
    fh.setFormatter(new java.util.logging.SimpleFormatter());
    logger.addHandler(fh);
} catch (IOException e) {
    e.printStackTrace();
}
// 出力レベルをCONFIG以上に設定する
logger.setLevel(Level.CONFIG);
// ログを出力する
logger.log(Level.FINEST, "ログ出力テスト：finest");
logger.log(Level.FINER, "ログ出力テスト：finer");
logger.log(Level.FINE, "ログ出力テスト：fine");
logger.log(Level.CONFIG, "ログ出力テスト：config");
logger.log(Level.INFO, "ログ出力テスト：info");
logger.log(Level.WARNING, "ログ出力テスト：warning");
logger.log(Level.SEVERE, "ログ出力テスト：severe");</pre><p>setLevel()メソッドを使うことで、出力レベルの指定ができる。（&#8221;Level.ALL&#8221;ですべてのログレベルを出力）</p>
<p>ただし、これで変更されるのはファイルに対する出力レベルのみで、コンソールへの出力は変わらない。</p><pre class="urvanov-syntax-highlighter-plain-tag">// Loggerクラスのインスタンスを生成する
final Logger logger = Logger.getLogger("SampleLogging");
// ログを出力する
logger.finest("ログ出力テスト：finest");
logger.finer("ログ出力テスト：finer");
logger.fine("ログ出力テスト：fine");
logger.config("ログ出力テスト：config");
logger.info("ログ出力テスト：info");
logger.warning("ログ出力テスト：warning");
logger.severe("ログ出力テスト：severe");</pre><p>&nbsp;</p>
<h2>例外のスタックトレースを出力する</h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">// Loggerクラスのインスタンスを生成する
final Logger logger = Logger.getLogger("SampleLogging");
try {
    // 出力ファイルを指定する
    FileHandler fh = new FileHandler("SampleLog.log");
    // 出力フォーマットを指定する
    fh.setFormatter(new java.util.logging.SimpleFormatter());
    logger.addHandler(fh);
} catch (IOException e) {
    e.printStackTrace();
}
// 出力レベルをCONFIG以上に設定する
logger.setLevel(Level.CONFIG);
// 例外を発生させ、ログを出力する
try {
    String s = null;
    s.toString();
} catch (NullPointerException e) {
    // スタックトレースを出力する
    logger.log(Level.SEVERE, "例外発生", e);
}</pre><p>log(Level level, String msg, Throwable thrown)メソッドを利用することで、例外やエラーのスタックトレースを出力することができる。</p>
<p>&nbsp;</p>
<h2>追加モードで出力する</h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">// Loggerクラスのインスタンスを生成する
final Logger logger = Logger.getLogger("SampleLogging");
try {
    // 出力ファイルを追加モードで指定する
    FileHandler fh = new FileHandler("SampleLog.log", true);
    // 出力フォーマットを指定する
    fh.setFormatter(new java.util.logging.SimpleFormatter());
    logger.addHandler(fh);
} catch (IOException e) {
    e.printStackTrace();
}
// 出力レベルをALLに設定する
logger.setLevel(Level.ALL);
// ログを出力する
logger.log(Level.FINEST, "ログ出力テスト：finest");
logger.log(Level.FINER, "ログ出力テスト：finer");
logger.log(Level.FINE, "ログ出力テスト：fine");
logger.log(Level.CONFIG, "ログ出力テスト：config");
logger.log(Level.INFO, "ログ出力テスト：info");
logger.log(Level.WARNING, "ログ出力テスト：warning");
logger.log(Level.SEVERE, "ログ出力テスト：severe");</pre><p>出力ファイルを追加モードで指定しない場合、実行の度にログファイルが上書きされる。（過去のログが消える）</p>
<p>これを回避する為には、パラメータが2つあるFileHandlerのコンストラクタを使い、第2パラメータにtrueを設定する。</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-3921666646"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-1822289158"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/648/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">648</post-id>	</item>
		<item>
		<title>Javaで日時を加算／減算する</title>
		<link>https://knowledge.reontosanta.com/archives/497</link>
					<comments>https://knowledge.reontosanta.com/archives/497#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Tue, 07 Jul 2015 08:44:31 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=497</guid>

					<description><![CDATA[Javaで日時を加算／減算するには、Calendarクラスのaddメ&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>Javaで日時を加算／減算するには、Calendarクラスのaddメソッドを利用する。</p>
<h2>addメソッド</h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">public abstract void add(int field, int amount)</pre><p>カレンダーの規則に基づいて、指定された時間量を指定されたカレンダーフィールドに加算または減算する。</p>
<p>例えば、カレンダーの現在時刻から 5 日を引く場合は、次の呼び出しを実行する。</p><pre class="urvanov-syntax-highlighter-plain-tag">add(Calendar.DAY_OF_MONTH, -5)</pre><p></p>
<h4>【パラメータ】<br />
field：カレンダーフィールド<br />
amount：フィールドに追加される日付または時刻の量</h4>
<p>尚、日を1ずつ増加させていき、その月の最後の日になりさらに追加すると月が1増加され日は1に戻る。</p>
<p>ただし、注意する点としては日が31日などの場合に月を1だけ増加させた場合、増加後の月が30日までしか無い場合などは日も30に変更される。</p>
<p>その後に31日まである月になったとしても日は30日のままとなる。</p>
<p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-974786335"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>サンプルプログラム</h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">import java.util.Calendar;

class testCalendar{
  public static void main(String args[]){

    Calendar calendar = Calendar.getInstance();

    System.out.println("日時を2005/12/30に設定する");
    calendar.set(2005, 11, 30);
    dispCalendar(calendar);

    System.out.println("-- -- -- -- -- --");

    System.out.println("日を1ずつ増加させる");
    for (int i = 0 ; i &lt; 6 ; i++){
      calendar.add(Calendar.DAY_OF_MONTH, 1);
      dispCalendar(calendar);
    }

    System.out.println("-- -- -- -- -- --");

    System.out.println("日時を2006/1/31に設定する");
    calendar.set(2006, 0, 31);
    dispCalendar(calendar);

    System.out.println("-- -- -- -- -- --");

    System.out.println("月を1ずつ増加させる");
    for (int i = 0 ; i &lt; 4 ; i++){
      calendar.add(Calendar.MONTH, 1);
      dispCalendar(calendar);
    }
  }

  private static void dispCalendar(Calendar calendar){
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH) + 1;
    int day = calendar.get(Calendar.DATE);

    StringBuffer sb = new StringBuffer();
    sb.append("設定されている日時は");
    sb.append(year + "年" + month + "月" + day + "日");

    System.out.println(new String(sb));
  }
}</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-729591535"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-2970319932"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/497/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">497</post-id>	</item>
	</channel>
</rss>
