Java @ mock

テキストエディタソースver1.2

最終更新:

Bot(ページ名リンク)

- view
管理者のみ編集可

テキストエディタソースver1.2

Main.java


/**
 *
 * メインクラスです。
 * @author mock
 * @version 1.2
 *
 */
public class Main {

	/**
	 * メインメソッドです
	 * @param args
	 */
	public static void main([[String]][] args) {
		new TextEditor();
	}

}



TextEditor.java


import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JTextArea;

/**
 * テキストエディタクラスです
 *
 * @author mock
 */
public class TextEditor extends JFrame implements ActionListener {

	/** serialVersionUID */
	private static final [[long]] serialVersionUID = 1L;

	/** テキストエリア */
	public JTextArea textArea;

	/** ファイル選択 */
	public JFileChooser fileChooser = new JFileChooser();

	/** logic */
	public Logic logic = new LogicImpl();

	/** actionLogic */
	public ActionLogic actionLogic = new ActionLogicImpl();

	/**
	 * コンストラクタ
	 *
	 * @throws HeadlessException
	 */
	public TextEditor() throws HeadlessException {
		TextAreaProperties textAreaProperties = logic.getInitProperties();
		setTitle(Constants.UNDIFINED_TITLE);
		logic.createMenuBar(getRootPane(), this);
		textArea = logic.createTextArea(textAreaProperties, this);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		pack();
	}

	/*
	 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
	 */
	@Override
	public void actionPerformed(ActionEvent actionEvent) {
		String actionCommand = actionEvent.getActionCommand();
		TextEditorModel model = new TextEditorModel();
		model.setFrame(this);
		model.setTextArea(textArea);
		model.setFileChooser(fileChooser);
		if (actionCommand.equals(Constants.MenuItem.NEW.toString())) {
			fileChooser = actionLogic.newFile(model);
		} else if (actionCommand.equals(Constants.MenuItem.OPEN.toString())) {
			actionLogic.openFile(model);
		} else if (actionCommand.equals(Constants.MenuItem.SAVE.toString())) {
			actionLogic.save(model);
		} else if (actionCommand.equals(Constants.MenuItem.SAVE_AS.toString())) {
			actionLogic.saveAs(model);
		} else if (actionCommand.equals(Constants.MenuItem.VERSION.toString())) {
			actionLogic.showVersionInfo(model);
		}
	}
}



TextEditorModel.java


import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JTextArea;

/**
 * テキストエディタに関するモデルです
 * @author mock
 *
 */
public class TextEditorModel {

	/** フレーム */
	private JFrame frame;

	/** ファイルチューザ */
	private JFileChooser fileChooser;

	/** テキストエリア */
	private JTextArea textArea;

	/**
	 * @return the frame
	 */
	public JFrame getFrame() {
		[[return]] frame;
	}

	/**
	 * @param frame the frame to set
	 */
	public void setFrame(JFrame frame) {
		this.frame = frame;
	}

	/**
	 * @return the fileChooser
	 */
	public JFileChooser getFileChooser() {
		return fileChooser;
	}

	/**
	 * @param fileChooser the fileChooser to set
	 */
	public void setFileChooser(JFileChooser fileChooser) {
		this.fileChooser = fileChooser;
	}

	/**
	 * @return the textArea
	 */
	public JTextArea getTextArea() {
		return textArea;
	}

	/**
	 * @param textArea the textArea to set
	 */
	public void setTextArea(JTextArea textArea) {
		this.textArea = textArea;
	}
}



Constants.java


import java.awt.event.KeyEvent;

/**
 * 定数を集めたクラスです。
 *
 * @author mock
 *
 */
public class Constants {

	/** 新規のタイトル名 */
	public static final String UNDIFINED_TITLE = "UNDIFINED_TITLE";

	/** バージョン */
	public static final String VERSION = "ver1.2";

	/** バージョン情報タイトル */
	public static final String VERSION_TITLE = "VERSION";

	/** ファイル(F)メニューラベル */
	public static final String MENU_FILE_LABEL = "ファイル(F)";

	/** ヘルプ(H)メニューラベル */
	public static final String MENU_HELP_LABEL = "ヘルプ(H)";

	public static final String INI_FILE_NAME = "texteditor.ini";

	/**
	 * メニュー項目に関する定数
	 *
	 * @author mock
	 *
	 */
	public enum MenuItem {
		NEW("新規(N)", KeyEvent.VK_N),

		OPEN("開く(O)", KeyEvent.VK_O),

		SAVE("上書き保存(S)", KeyEvent.VK_S),

		SAVE_AS("名前を付けて保存(A)", KeyEvent.VK_A),

		VERSION("バージョン情報(A)", KeyEvent.VK_A), ;

		/** メニュー項目ラベル */
		private String label;

		/** メニュー項目ニーモニック */
		private [[int]] mnemonic;

		/**
		 * @param label
		 *            メニュー項目ラベル
		 * @param mnemonic
		 *            メニュー項目ニーモニック
		 */
		MenuItem(String label, int mnemonic) {
			this.label = label;
			this.mnemonic = mnemonic;
		}

		/**
		 * @return メニュー項目ラベル
		 */
		public final String getLabel() {
			return this.label;
		}

		/**
		 * @return メニュー項目ニーモニック
		 */
		public final int getMnemonic() {
			return this.mnemonic;
		}
	}
}



TextAreaProperties.java


/**
 * テキストエリアに関するプロパティクラスです
 * @author mock
 */
public class TextAreaProperties {

	/** 幅 */
	private int width;

	/** 高さ */
	private int height;

	/** タブサイズ */
	private int tabSize;

	/** フォントサイズ */
	private int fontSize;

	/**
	 * @return the width
	 */
	public int getWidth() {
		return width;
	}

	/**
	 * @param width the width to set
	 */
	public void setWidth(int width) {
		this.width = width;
	}

	/**
	 * @return the height
	 */
	public int getHeight() {
		return height;
	}

	/**
	 * @param height the height to set
	 */
	public void setHeight(int height) {
		this.height = height;
	}

	/**
	 * @return the tabSize
	 */
	public int getTabSize() {
		return tabSize;
	}

	/**
	 * @param tabSize the tabSize to set
	 */
	public void setTabSize(int tabSize) {
		this.tabSize = tabSize;
	}

	/**
	 * @return the fontSize
	 */
	public int getFontSize() {
		return fontSize;
	}

	/**
	 * @param fontSize the fontSize to set
	 */
	public void setFontSize(int fontSize) {
		this.fontSize = fontSize;
	}

}



Logic.java


import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JRootPane;
import javax.swing.JTextArea;

/**
 * テキストエディタに関するロジックのインターフェースです
 *
 * @author mock
 */
public interface Logic {

	/**
	 * 初期設定プロパティを取得します
	 *
	 * @return テキストエリアに関するプロパティ
	 */
	public TextAreaProperties getInitProperties();

	/**
	 * メニューバーを作成します
	 *
	 * @param rootPane
	 *            コンテナ
	 * @param actionListener
	 *            アクションリスナー
	 */
	public void createMenuBar(JRootPane rootPane, ActionListener actionListener);

	/**
	 * メニュー項目を設定します
	 *
	 * @param item
	 *            メニュー項目
	 * @param actionListener
	 *            アクションリスナー
	 * @return メニュー項目
	 */
	public JMenuItem setMenuItem(Constants.MenuItem item,
			ActionListener actionListener);

	/**
	 * テキストエリアを作成します
	 *
	 * @param properties
	 *            テキストエリアに関するプロパティ
	 * @param frame
	 *            フレーム
	 * @return テキストエリア
	 */
	public JTextArea createTextArea(TextAreaProperties properties, JFrame frame);

	/**
	 * ファイルにテキスト内容を書き込みます
	 *
	 * @param file
	 *            ファイル
	 * @param text
	 *            テキスト内容
	 * @return 処理結果
	 */
	public [[boolean]] writeFile(File file, String text);

}



LogicImpl.java


import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JRootPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

/**
 * テキストエディタに関するロジックの実装クラスです
 *
 * @author mock
 */
public class LogicImpl implements Logic {

	/*
	 * @see Logic#getInitProperties()
	 */
	@Override
	public TextAreaProperties getInitProperties() {
		TextAreaProperties textAreaProperties = new TextAreaProperties();
		try {
			Properties properties = new Properties();
			properties.load(new FileInputStream(Constants.INI_FILE_NAME));

			// 幅の設定
			String width = properties.getProperty("textAreaWidth");
			textAreaProperties.setWidth(Integer.parseInt(width));

			// 高さの設定
			String height = properties.getProperty("textAreaHeight");
			textAreaProperties.setHeight(Integer.parseInt(height));

			// タブサイズの設定
			String tabSize = properties.getProperty("tabSize");
			textAreaProperties.setTabSize(Integer.parseInt(tabSize));

			// フォントサイズの設定
			String fontSize = properties.getProperty("fontSize");
			textAreaProperties.setFontSize(Integer.parseInt(fontSize));

		} catch (IOException e) {
			e.printStackTrace();
		}
		return textAreaProperties;
	}

	/*
	 * @see Logic#createMenuBar(javax.swing.JRootPane,
	 *      java.awt.event.ActionListener)
	 */
	@Override
	public void createMenuBar(JRootPane rootPane, ActionListener actionListener) {
		JMenuBar menuBar = new JMenuBar();
		rootPane.setJMenuBar(menuBar);
		// ファイル(F)
		JMenu menuFile = new JMenu(Constants.MENU_FILE_LABEL);
		menuFile.setMnemonic(KeyEvent.VK_F);
		menuBar.add(menuFile);
		// ファイル(F)>新規(N)
		JMenuItem menuItemNew = setMenuItem(Constants.MenuItem.NEW,
				actionListener);
		menuFile.add(menuItemNew);
		// ファイル(F)>開く(O)
		JMenuItem menuItemOpen = setMenuItem(Constants.MenuItem.OPEN,
				actionListener);
		menuFile.add(menuItemOpen);
		// ファイル(F)>上書き保存(S)
		JMenuItem menuItemSave = setMenuItem(Constants.MenuItem.SAVE,
				actionListener);
		menuFile.add(menuItemSave);
		// ファイル(F)>名前を付けて保存(A)
		JMenuItem menuItemSaveAs = setMenuItem(Constants.MenuItem.SAVE_AS,
				actionListener);
		menuFile.add(menuItemSaveAs);
		// ヘルプ(H)
		JMenu menuHelp = new JMenu(Constants.MENU_HELP_LABEL);
		menuHelp.setMnemonic(KeyEvent.VK_H);
		menuBar.add(menuHelp);
		// ヘルプ(H)>バージョン情報(A)
		JMenuItem menuItemVersion = setMenuItem(Constants.MenuItem.VERSION,
				actionListener);
		menuHelp.add(menuItemVersion);
	}

	/*
	 * @see Logic#setMenuItem(Constants.MenuItem, java.awt.event.ActionListener)
	 */
	@Override
	public JMenuItem setMenuItem(Constants.MenuItem item,
			ActionListener actionListener) {
		JMenuItem menuItem = new JMenuItem(item.getLabel());
		menuItem.setMnemonic(item.getMnemonic());
		menuItem.setActionCommand(item.toString());
		menuItem.addActionListener(actionListener);
		return menuItem;
	}

	/*
	 * @see Logic#createTextArea(TextAreaProperties, javax.swing.JFrame)
	 */
	@Override
	public JTextArea createTextArea(TextAreaProperties properties, JFrame frame) {
		JTextArea textArea = new JTextArea();
		JScrollPane scrollPane = new JScrollPane(textArea);
		scrollPane.setPreferredSize(new Dimension(properties.getWidth(),
				properties.getHeight()));
		frame.getContentPane().add(scrollPane);
		textArea.setBackground(Color.BLACK);
		textArea.setForeground(Color.WHITE);
		textArea.setSelectionColor(Color.BLUE);
		textArea.setSelectedTextColor(Color.PINK);
		textArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, properties
				.getFontSize()));
		textArea.setTabSize(properties.getTabSize());
		textArea.setCaretColor(Color.WHITE);
		textArea.setLineWrap(true);
		textArea.grabFocus();
		return textArea;
	}

	/*
	 * @see Logic#writeFile(java.io.File, java.lang.String)
	 */
	@Override
	public boolean writeFile(File file, String text) {
		try {
			FileWriter fileWriter = new FileWriter(file);
			fileWriter.write(text);
			fileWriter.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return true;
	}

}



ActionLogic.java


import javax.swing.JFileChooser;

/**
 * アクションに関するロジックのインターフェースです
 * @author mock
 *
 */
public interface ActionLogic {

	/**
	 * 新規ファイルを開きます
	 * @param model テキストエディタに関するモデル
	 * @return JFileChooser
	 */
	public JFileChooser newFile(TextEditorModel model);

	/**
	 * ファイルを開きます
	 * @param model テキストエディタに関するモデル
	 */
	public void openFile(TextEditorModel model);

	/**
	 * ファイルに上書き保存します
	 * @param model テキストエディタに関するモデル
	 */
	public void save(TextEditorModel model);

	/**
	 * ファイルに名前を付けて保存します
	 * @param model テキストエディタに関するモデル
	 */
	public void saveAs(TextEditorModel model);

	/**
	 * バージョン情報ダイアログを表示します
	 * @param model テキストエディタに関するモデル
	 */
	public void showVersionInfo(TextEditorModel model);
}



ActionLogicImpl.java


import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;

/**
 * アクションに関するロジックの実装クラスです
 * @author mock
 *
 */
public class ActionLogicImpl implements ActionLogic {

	/** logic */
	public Logic logic = new LogicImpl();

	/*
	 * @see ActionLogic#newFile(TextEditorModel)
	 */
	@Override
	public JFileChooser newFile(TextEditorModel model) {
		JFrame frame = model.getFrame();
		JTextArea textArea = model.getTextArea();
		frame.setTitle(Constants.UNDIFINED_TITLE);
		textArea.setText("");
		return new JFileChooser();
	}

	/*
	 * @see ActionLogic#openFile(TextEditorModel)
	 */
	@Override
	public void openFile(TextEditorModel model) {
		try {
			JFrame frame = model.getFrame();
			JTextArea textArea = model.getTextArea();
			JFileChooser fileChooser = model.getFileChooser();
			if (fileChooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) {
				File selectedFile = fileChooser.getSelectedFile();
				FileReader fileReader = new FileReader(selectedFile);
				textArea.read(fileReader, null);
				fileReader.close();
				frame.setTitle(fileChooser.getName(selectedFile));
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/*
	 * @see ActionLogic#save(TextEditorModel)
	 */
	@Override
	public void save(TextEditorModel model) {
		JTextArea textArea = model.getTextArea();
		JFileChooser fileChooser = model.getFileChooser();
		// ファイルが既に開かれている場合
		if (fileChooser.getSelectedFile() != null) {
			logic.writeFile(fileChooser.getSelectedFile(), textArea.getText());
			return;
		}
		saveAs(model);
	}

	/*
	 * @see ActionLogic#saveAs(TextEditorModel)
	 */
	@Override
	public void saveAs(TextEditorModel model) {
		JFrame frame = model.getFrame();
		JTextArea textArea = model.getTextArea();
		JFileChooser fileChooser = model.getFileChooser();
		// ファイルダイアログ「保存」が選択された場合
		if (fileChooser.showSaveDialog(frame) == JFileChooser.APPROVE_OPTION) {
			logic.writeFile(fileChooser.getSelectedFile(), textArea.getText());
			File selectedFile = fileChooser.getSelectedFile();
			frame.setTitle(fileChooser.getName(selectedFile));
		}
	}

	/*
	 * @see ActionLogic#showVersionInfo(TextEditorModel)
	 */
	@Override
	public void showVersionInfo(TextEditorModel model) {
		JFrame frame = model.getFrame();
		JOptionPane.showMessageDialog(frame, Constants.VERSION,
				Constants.VERSION_TITLE, JOptionPane.INFORMATION_MESSAGE);
	}

}
ウィキ募集バナー