定型文コピーボードを作ってみよう2

 

ツール(小さなソフト)を考えている時は、便利に使えると思えても
実際に作ってみるとかえって面倒(使いにくかった)という事もあります。

毎度、管理人イガジーです。

ですから、あまり構想に凝らずに、パパッと作って使ってみるのが1番です。
これをプロトタイピング(試作)と呼びます。
細かいことは後回しにして、主要部分を作って動かしてみると、
新しいアイデアも生まれて、頭の中で考えているよりも良いものが生み出せるのです。
そうするためには、簡単に作れる環境(言語)が必要になるのですが
Java(とEclipse)はそういうプロトタイピングに向いていると思います。

さて、定型文コピーボードのプログラム例を以下に示します。

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;

public class JCopyBoard {
	JFrame f=new JFrame("CopyBoard");
	JPanel p=new JPanel();
	JPanel p2=new JPanel();
	Clipboard clp;
	String []msgs={
		"m月d日(曜)",	// 特殊処理0
		"yyyy/m/d",		// 特殊処理1
		"毎度、管理人イガジーです。\n",
		"<pre><code></code></pre>\n",
		"いつもお世話になっています。\nMLTLabのイガジーです。\n",
		"ご質問等はこちら→<a href=\"http://www.mltlab.com/mform/m1form.php\" target=\"_blank\">メールフォーム</a>",
		"よく使う定形文を追加してください。\n",
	};
	int lines=msgs.length;
	JRadioButton []rb = new JRadioButton[lines];
	ButtonGroup bg=new ButtonGroup();

	JCopyBoard(){
		clp=Toolkit.getDefaultToolkit().getSystemClipboard();

		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		p.setLayout(new GridLayout(lines,1));
		JScrollPane sc=new JScrollPane(p);
		f.add(sc,BorderLayout.CENTER);

		for (int i=0;i<lines;++i) {
			rb[i]=new JRadioButton(msgs[i]);
			bg.add(rb[i]);
			p.add(rb[i]);
		}
		rb[0].setSelected(true);
		JButton cpy=new JButton("Copy");
		cpy.addActionListener(new CpyS());
		p2.add(cpy);
		JButton end=new JButton("End");
		end.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				System.exit(0);
			}
		});
		p2.add(end);
		f.add(p2,BorderLayout.SOUTH);
		f.setSize(300,200);
		f.setVisible(true);
	}
	public static void main(String[] args) {
		new JCopyBoard();
	}

	class CpyS implements ActionListener {
		final String wn[]={
				"日","月","火","水","木","金","土"
			 //	"sun","mon","tue","wed","thu","fri","sat"
			};

		@Override
		public void actionPerformed(ActionEvent e) {
			StringSelection ss=null;
			Calendar ca;
			int yy,mm,dd,wd;
			for (int i=0;i<lines;++i){
				if (rb[i].isSelected()){
					switch (i) {
					  case 0:
						ca=new GregorianCalendar();
						mm=ca.get(Calendar.MONTH)+1;
						dd=ca.get(Calendar.DAY_OF_MONTH);
						wd=ca.get(Calendar.DAY_OF_WEEK);
						ss=new StringSelection(String.format("%d月%2d日(%s)\n",mm,dd,wn[wd-1]));
						break;
					  case 1:
						ca=new GregorianCalendar();
						yy=ca.get(Calendar.YEAR);
						mm=ca.get(Calendar.MONTH)+1;
						dd=ca.get(Calendar.DAY_OF_MONTH);
						ss=new StringSelection(String.format("%d/%d/%d\n",yy,mm,dd));
						break;
					  default:
						ss=new StringSelection(rb[i].getText());
					}
					break; // for
				}// endif rb.isSelected
			}
			clp.setContents(ss, ss);
		}// actionPerformed
	} // class CpyC
}

昨日の画面イメージに対して、年月日の特殊処理が追加になっています。
単なる文字列のコピーであれば、テキストファイル(とエディタ/メモ帳)で
済みそうな気がしてきたためです。
範囲指定の手間が少しだけ簡略化できるとも言えますが、いざ使ってみると
あまりメリットが感じられず、メモ帳ではできない事として日付埋め込みを
強化してみました。
特殊処理を増やすことを考えて、switch – case にしてみましたが
if – else if – else if でもかまいません(好みです)。

GridLayoutで、複数行のJRadioButtonを並べていますが
Choice や List / JList を使う方法もあります。
それらに置き換えてみるのも良い練習になるでしょう。

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。