定型文コピーボードを作ってみよう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 を使う方法もあります。
それらに置き換えてみるのも良い練習になるでしょう。
この記事へのコメントはこちら