プログラマメモ2 - programmer no memo2

目次

Java World (ジャバ・ワールド) 2007年 02月号 クロージャ 2006/12/30

Java World (ジャバ・ワールド) 2007年 02月号 [雑誌]
B000LPRI72


クロージャに関しての記事があります。
現在のjavaにクロージャを導入に関しての仕様の案がいろいろと読めます。

このフレーズの原典ってなんだろう?

「クロージャは貧乏人のオブジェクト(Closures are a poor man's objects)」

「オブジェクトは貧乏人のクロージャ(Objects are a poor man's closures)」



ふと、思ったのだが、プログラミング言語ってはじめにどの言語を自分のネイティブにするかで思考法まで決定されるような気がする。

JavaWorld休刊、そういえばCマガジンも休刊していた。 2006/12/30
2006/12/30

何だかんだいってJavaWorldはたまに買っていたので、休刊はショック。
Cマガジンもなんだかんだいってたまに買っていたので、ショック。

インターネットで情報を集めたりすることができるが、やはり雑誌とかでまとめて読めたほうがうれしかったりするのに、例えば、トイレでも読めたのに。

JavaWorld Online - 最先端Javaテクノロジーの実践活用誌
「JavaWorld」定期刊行休止のお知らせ - IDGジャパン
C MAGAZINE - www.Cmagazine.jp

bogus weblog: 今年の廃刊雑誌

うーん
いい状況ではないような気がするなぁ

LL 2006/12/30

Lightweight Language Ring

継続ベースのフレームワーク 2006/12/30

とりあえずリンク


Kahua Project

LISPのS式でWebアプリを書けるオープンソースのフレームワーク「Kahua 1.0」リリース:ITpro


IBM dW:Java:境界を越える: 継続とWeb開発、そしてJavaプログラミング - Japan

なんでも継続、Perl で。 : torus solutions!

なんでも継続

再帰の技法 2006/12/30

「再帰の技法」という本を買いました。
再帰の技法??基本的考え方・アルゴリズム・プログラミング
玉井 浩
4434085972


何故かわかりませんが、「再帰」はかっこいいと思います。

本を購入するときの決め手は、買う瞬間のノリみたいのが大きいのですが、
この本を買う決めてになったのは、本の厚さが適度なうすさだこと、値段が1500円で手頃なこと、フィボナッチ数列をとりあげているところで、メモ化についてふれていたことと、行列の積で解く例があったことです。

コンピュータ書籍のコーナーにはアルゴリズムを羅列しているだけの本とか結構あると思うのですが、そんな無駄にてんこもりな本で、泣かされた身としては、この本はよいと思います。

再帰がかっこいい理由は、プログラマが目にみえない動きをコントロールしている感じがする、からでしょうか。僕には再帰は魔法の感じがします。

この本はおすすめです。

divを使用してメッセージを伝える。 2006/12/29

チェック用の関数
divにメッセージを表示します。エラーダイアログでないほうがよいです。エラーダイアログだと、ユーザがエラーダイアログにたいするアクションをおこさないといけないからです。

function check(){
document.getElementById("msg").innerHTML = "入力されていない項目があります。";
document.getElementById("msg").style.color = "white";
document.getElementById("msg").style.background = "#cc4444";
document.getElementById("msg").align = "center";
return false;
}


フォームで送信するまえに、チェック関数を動作させます。その際に、関数がtrueを返すとsubmitされます。
<form name="f" action="send.php" method="post" onsubmit="return check();">

formのオブジェクトからphpの連想配列を出力 2006/12/29
2006/12/30

htmlのformからphpで値受信する部分を書くのが面倒な場合に使用。

// this function arugument document.form object!!
function output_php_array(f){
var s = "";
var for_php_var = function(name){
return "'"+name+"'=>$_POST['"+name+"']";
};

var arr = new Array();
for(var i=0;i<f.length;i++){
arr.push(for_php_var(f[i].name));
}
//for easy read
arr.sort();
for(var i=0;i<f.length;i++){
s += arr[i];
if(i<f.length-1) s +=",";
s += "<br>";
}

s = "$data = array(" + s + ");";
document.write(s+"<br>");
}


開発時に、htmlのbodyのonloadにしこんで、画面に出力して、phpのソースにコピペして使用する。

$data = array('address'=>$_POST['address'],
'area'=>$_POST['area']};

の感じの文字列が出力される。

つくって後から考えるとあまり使いでがないですが。

つくらないで後悔するよりつくって後悔ですね。

初心にかえる 2006/12/29
2006/12/30

年がかわります。ちょっと怠けた一年だったなという後悔と、ブログが前進するための動機になるということを確信したのであります。

[SML 3868] SmalltalkとJava プログラマのためのトレーニ ング

javaプログラマは読んでおいたほうがよいと思います。

僕自身、実践しようと思いつつ、なんと長い年月がたったことか!!

実はこれプリントアウトしてカバンに入れてずーともっていたのですが、それでもだめだめな自分に反省です。
この青木淳さんの投稿には、

・関数型言語をやりなさい(落としなさい)。(ML, Concurrent Clean, Haskell, DrScheme など)
とあります。

・話を聞くと判ったつもりになります。でも実際に手を動かさない
 と身につきません。
ともあります。

反省しきりな2006年でした。

来年の目標にこのプログラムメモを400突破です。
可能な限りコードを断片でもいいから残すようにします。

Ajax+JavaScriptコマンドブックを買いました。 2006/12/29

Ajax+JavaScriptコマンドブック
市井 あきら
4797336633

javascriptのレファレンスが欲しくて、javascript本を買いました。

インターネットで調べものすると検索迷子になったり、ノイズがまじってたりするので、レファレンス本は必要ですね。

この本に決めたのは、大きさが手頃だったことと、「コンストラクタ定義とプロトタイプ」の項目をみて決めました。

プロトタイプって昔からあるようですね。勉強不足だった。

自分の本棚のjavascript本で一番多く参照した本は、
JavaScript
上田 学
4274061981

この本でしたが、この本、1997年の出版でした。もうぼろぼろですが、なつかしいので、しばらく捨てれそうにありません。

昔からあるのに使っていなかった。

for-in文

これみためがかっこいいのでばりばり使っていきたいのですが。。。

これ使うかもしれない
in演算子
指定したオブジェクト名に指定したプロパティ名/配列インデックスがある場合、trueを返す演算子。
書式 プロパティ名/配列インデックス名 in オブジェクト名


昔はなかった
try...catch...finally
throw文


他にもいろいろありますねー!!
じっくり勉強していきましょう。

カリー化 クロージャ ラムダ がよくわからない 2006/12/28
2008/01/20

本気でよくわからないもの
カリー化、クロージャ、ラムダ
カリー化、クロージャ、ラムダがよくわからないです。

おそらく僕の使っているプログラミング言語、javaメインだからなのかもしれないです。
これってまずい気もしますが、だからといってお仕事するのに差し支えないレベルでプログラムを記述することはできます。

クロージャがjavaにくわわるというニュースを読んだりしますと、わからないというのもまずそうな感じがしてきま。
わかると何やら幸せになれそうな感じがするので、習うより慣れよで、プログラムでためしていこうと思います。

これらの用語には知的好奇心をくすぐる何かがあるように思えます。

おそらく大学が理系でない人、LL言語に接することが少ない人は、接する機会がないですよね、きっと。

ところで、「計算機プログラムの構造と解釈」というのがあります。
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
489471163X
ほんもの魔法使いのための本という趣きがあると感じるのは僕だけでしょうか。


まず、カリー化から。カリー化はcurrying。

この技法は、Christopher Stracheyにより論理学者ハスケル・カリーに因んで名付けられたが、実際に考案したのはMoses Schönfinkel とゴットロープ・フレーゲである。引用:カリー化 - goo Wikipedia (ウィキペディア) 記事検索


カリー化を基盤としているプログラミング言語もある。特にMLとHaskellでは関数は常に一つの引数のみを取り、複数の引数を取る関数とは、単にネストされた複数の一引数関数の糖衣構文にすぎない。関数をとして扱える言語、たとえばLISP、Scheme、Eiffel、Perl、Ruby、Python、R言語、S言語、JavaScriptなどでは、カリー化関数を作ることができる。
引用:カリー化 - goo Wikipedia (ウィキペディア) 記事検索

ML、Haskellだと言語自体がカリー化を基盤としているようです。

調べていないですが、上記の言語全部、mac osx上でためせるはずです。

実行環境をつくることからはじめないといけませんね。

実際の定義は、
複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること。引用:カリー化 - goo Wikipedia (ウィキペディア) 記事検索

とあるが、よくわからないです。

入門Haskellという本を買ってきましたが、いまいちよくわかりません。p.49にでてくるのですが、やはりはじめから読まないといけないでっしょうか。
入門Haskell―はじめて学ぶ関数型言語
向井 淳
4839919623


理解するためには、高階関数(higher-order function)、関数型言語が鍵になりそうです。
高階関数(こうかいかんすう、英: higher-order function)とは、プログラミング言語において、関数を引数にしたり、あるいは関数を戻り値とするような関数の事である。引数や戻り値の関数もまた高階関数となり得る。これは主に関数型言語やその背景理論であるラムダ計算において多用される。
高階関数 - goo Wikipedia (ウィキペディア) 記事検索

ラムダという用語もでてきました。

ボールドをしましたが、「プログラミング言語において、関数を引数にしたり、あるいは関数を戻り値とするような関数の事である。引数や戻り値の関数もまた高階関数となり得る」ということらしいです。

関数ポインタをやりとりして、使う???、オブジェクトのやりとりとどうちがうのでしょうか。この辺あたりから、僕の計算機にたいする理解不足が露呈してますね。


ちなみに、調べているとこういうのがありました。
なぜ関数プログラミングは重要か
重要なんですね。


ところで、
ラムダ式をC++で実現する【前編】すーぱーぷろぐらみんてくにーーく!
に、他の関数を引数にとる関数を高階関数と呼ぶ、とありました。
関数を渡すためには、C++では、関数ポインタで渡すか、templateで渡すかです。
ラムダ式をC++で実現する【前編】すーぱーぷろぐらみんてくにーーく!

とありました。なんとなくイメージがわいてきますかね。

ECMA-262 2006/12/28

Standard ECMA-262

定義がダウンロードできます。

D言語 Walter Brightさん 2006/12/28

Walter Bright Home Page
D言語をつくった人のようです。
いろいろコンパイラを手がけてるようです。
ボーイング757のとかの開発にかかわっていたようです。

Digital Mars - ECMAScript
javascriptの実装も行っているようです。

javascript html 印刷 2006/12/26

単にブラウザの印刷機能をよびだすだけど。。。

<INPUT type="button" name="print" value="印刷する" onClick="print();">

php用の備忘録メモ メモ メモ 2006/12/26

phpの連想配列

$data = array("num_a"=>$num_a,
"num_b"=>"num_b",
"amount"=>$amount);


キーをとりだす

foreach (array_keys($data) as $key){
echo $key;
}


PHP: 配列 - Manual

money_formatを使用する際のおまじない。金額フォーマット。

setlocale(LC_MONETARY, 'ja_JP');
//金額フォーマット
$amount = money_format("%!.0n", $amount);


文字列の最後にあるスラッシュをとる。

if(substr($s, strlen($s) -1) == "/"){
$s = substr_replace($s,"", strlen($s) -1);
}


下三桁を000にする。
よくないかも。

/*
* 切り捨てようの関数
*/
function myround($a){
$a = floor($a);
$a = $a / 1000;
$a = round($a);
$a = $a * 1000;
return $a;
}

$a = "1234567890.12345";
echo myround($a);
// 結果 1234568000

php メール送信 文字化け対策 2006/12/26

phpを使用してメールを送信する際に、サブジェクトの文字化けしないような設定。


$subject = "日本語";
$subject = iconv("utf-8", "ISO-2022-JP", $subject);
$subject = base64_encode($subject);
$subject = "=?ISO-2022-JP?B?$subject?=";
$ret = mail("xxx@xxx", $subject, iconv("utf-8", "ISO-2022-JP", $body));

int値からBitSetに変換 2006/12/25

int値をBitSetに変換してみます。

シナリオ

int値のビットを操作しやすいようにBitSetにして、操作後、int値に戻す必要があります。


ユーティリティメソッドです。
int値からBitSetにします。
public static BitSet toBitSet(int n) {
final int shift31 = 1 << 31;
BitSet bitSet = new BitSet();
for (int i = 0; i <32; i++) {
bitSet.set(31 - i, (((n << i) & shift31) >>> 31)==0?false:true);
}
return bitSet;
}



BitSetからint値にします。
public static int toint(BitSet bitSet) {
int ret = 0;
for (int i = 31; 0 <= i; i--) {
ret |= (bitSet.get(i) ? 1 : 0) << i;
}
return ret;
}


動かしてみます。単純に値を相互に変換させて結果を出力させてみます。
テストコードです。
public static void main(String[] args) {
BitSet bitSet = toBitSet(Integer.MAX_VALUE);
System.out.println(toint(bitSet));
System.out.println(Integer.MAX_VALUE);
bitSet = toBitSet(Integer.MIN_VALUE);
System.out.println(toint(bitSet));
System.out.println(Integer.MIN_VALUE);
}


結果
2147483647
2147483647
-2147483648
-2147483648


ビット操作してフラグをたてるときなどに使えそうですね。

統計局 2006/12/24

統計局には、
エクセルのデータがいろいろあります。
統計局ホームページ統計局


最近は、ブラウザ上でオフィスライクなウェブアプリケーションが動くようになっています。
エクセルのファイルをローカルダウンロードしなくてもオープンしてみることができるサービスがあったらいいなぁと思うのですが、ないものでしょうか。

ふと思いついたのですが、java web startで直にURL指定してみれるのでもいいかなと思いました。探せば、誰かそのようなツールをつくっているかもしれませんね。

bookmarkletにurlをドラッグして、起動するでもいいですね。

googleのスプレッドシートを利用するとweb上のエクセルを直接開けます。
URL入力




いろいろ調べてみますと、ITmedia Biz.ID:OfficeファイルをダブルクリックしてGoogle Officeで開くITmedia Biz.ID:OfficeファイルをダブルクリックしてGoogle Officeで開くというのがありました。

osxのeclipseでgwt(google web toolkit)を使う 2006/12/23

eclipse上のexplorerでダブルクリック起動するのには、拡張子をcommandにするといいようです。


参考
実装技術: GoogleWebToolkitを始めよう 第1回

mac osx wgetインストール 2006/12/23

まっさらなmacbookにwgetをインストールします。

(1)xcodeインストール
(2)macportsインストール
(3)wgetをインストール

という手順で行います。

(1)xcodeインストール
開発環境がインストールされていない場合には、インストールします。
appleのサイトからダウンロードします。
http://developer.apple.com/tools/download/

(2)macportsインストール
macportsをダウンロードします。
wgetをcurlを使用して、ダウンロードします。

curl -O http://svn.macports.org/repository/macports/downloads/DarwinPorts-1.3.2/DarwinPorts-1.3.2.tar.bz2


解凍して,./configure,make sudo make installでコンパイルしてインストールします。

ちなみにxcodeがインストールされていないと./configure時に下記のようなエラーがでます。
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details.


パスをportに通します。
cd ~/
.bash_profile

export PATH=/opt/local/bin:$PATH
を追加します(ファイルがなければ作成)。

(3)wgetをインストール
port install wget
でインストールします。

参考:
wget のインストール

リンク集 2006/12/23

気になったことがら。

メールアドレス画像化ジェネレーター集

パスファインダ

ステルス・ウェブ・デザイン

50-beautiful-css-based-web-designs-in-2006

Web 2.0 how-to design guide

使えるライブラリ調査のためにもMaven 2006/12/23
2008/01/28

ブログや、ニュースサイトで紹介されたライブラリや、フレームワークをいろいろためしたいと思うのですが、導入環境を構築するのが手間だったりします。

はじめに、プロジェクトのWEBサイトにいき、バイナリー、ソース、javadocをダウンロード。
チュートリアルを眺めて、cutアンドcopyでeclipse上で実行しています。

案外、はじめのダウンロードが面倒だったりします。

mavenのレポジトリーサーチのサービスが便利そうです。

http://maven.ozacc.com/

jasperreports ireport eclipseプラグインからの実行 macosx 2006/12/20

mac osx上のeclipseからireportプラグンを利用する際のメモ
(1)
ユーザホームの.ireportディレクトリに手でireport1.2.8.locationというファイルを作成して、ireportのディレクトリのパスを書いておく。
(2)
ireportをあらかじめ起動させておく。
(3)
eclipse上からjrxmlファイルをクリックでireportから編集できる。

ユーザホームディレクトリの.ireportの中身をチェックしておいたほうがよいみたいです。

webstart起動時のエラー 2006/12/20

java web start(jws)で起動ファイルエラーになる

activation.jarは別の証明書でサインされているので、extentionを使用して別のJNLPから読みこむようにするとよい。

BitSetの値をintで表現する 2006/12/20

javaにはビット操作のためにjava.util.BitSetクラスが用意されています。

シナリオ:

ビット操作はBitSetで行いたいが、その値の受けわたしはint値で行いたい


BitSetの値をint値にしてみます。

/**
* BitSetをint値で表現します。
* @param bitSet
* @return
*/
public static int toint(BitSet bitSet){
int ret = 0;
for(int i=31;0<=i;i--){
ret |=(bitSet.get(i)?1:0)<<i;
}
return ret;
}



簡単なテスト
import java.util.BitSet;
public class TestBitset {

public static void main(String[] args) {
min();
max();
}

static void min(){
System.out.println("MIN_VALUE");
BitSet bitSet = new BitSet();
bitSet.set(31);
System.out.println(toint(bitSet));
System.out.println(Integer.MIN_VALUE);
}

static void max(){
System.out.println("MAX_VALUE");
BitSet bitSet = new BitSet();
for(int i=0;i<31;i++){
bitSet.set(i);
}

System.out.println(toint(bitSet));
System.out.println(Integer.MAX_VALUE);
}
/**
* BitSetをint値で表現します。
* @param bitSet
* @return
*/
public static int toint(BitSet bitSet){
int ret = 0;
for(int i=31;0<=i;i--){
ret |=(bitSet.get(i)?1:0)<<i;
}
return ret;
}
}


結果
MIN_VALUE
-2147483648
-2147483648
MAX_VALUE
2147483647
2147483647

Integer.toBinaryString 2006/12/19
2006/12/19


public class TestInteger {
public static void main(String[] args) {
printBinaryString(Integer.MIN_VALUE);
printBinaryString(Integer.MAX_VALUE);
printBinaryString(0);
printBinaryString(-1);
printBinaryString(1);
printBinaryString(2);
printBinaryString(-2);
}

public static void printBinaryString(int i) {
System.out.println("[" + i + "] " + Integer.toBinaryString(i));
}
}



結果
[-2147483648] 10000000000000000000000000000000
[2147483647] 1111111111111111111111111111111
[0] 0
[-1] 11111111111111111111111111111111
[1] 1
[2] 10
[-2] 11111111111111111111111111111110


IntegerのtoBinaryStringメソッドは32ビット幅で表示してくれるわけではないので、
整数のビット表示をするプログラムを参考にして表示してみます。


public class TestInteger {
public static void main(String[] args) {
printBinaryString(Integer.MIN_VALUE);
printBinaryString(Integer.MAX_VALUE);
printBinaryString(0);
printBinaryString(-1);
printBinaryString(1);
printBinaryString(2);
printBinaryString(-2);
}

public static void printBinaryString(int i) {
System.out.println("[" + i + "] " + Integer.toBinaryString(i));
System.out.println("[" + i + "] " + toBinaryString(i));
}

public static String toBinaryString(int n){
final int shift31 = 1 << 31;

StringBuffer buffer = new StringBuffer();
for (int i = 0; i < 32; i++) {
buffer.append(((n << i) & shift31) >>> 31);
}
return new String(buffer);
}
}


[-2147483648] 10000000000000000000000000000000
[-2147483648] 10000000000000000000000000000000
[2147483647] 1111111111111111111111111111111
[2147483647] 01111111111111111111111111111111
[0] 0
[0] 00000000000000000000000000000000
[-1] 11111111111111111111111111111111
[-1] 11111111111111111111111111111111
[1] 1
[1] 00000000000000000000000000000001
[2] 10
[2] 00000000000000000000000000000010
[-2] 11111111111111111111111111111110
[-2] 11111111111111111111111111111110



正直、ビット演算子は苦手です。Orz...

よく使うプラグイン 2006/12/18

eclipseでよく使っているプラグイン
http://www.sysdeo.com/eclipse/tomcatplugin
プラグインフォルダにほうりこんでる。

Matisseプラグイン 2006/12/18

Matisseプラグインを作成しているそうです。
Matisseプラグイン
eclipse + netbeansをいったりきたりしている身としては是非とも使ってみたいです。

コードを書くならeclipseのほうがしっくりくる自分としては、期待大です。

webstartボタンを作ってみた 2006/12/10
2007/06/14


イラストレータの使い方をの練習をかねてwebstartボタンをつくってみた。
はやりの反射ををとりいれてみた。

アクアボタン 2006/12/09
2013/09/07


以前から作成してみたいと思っていたアクアボタンを作成してみました。
プログラムで作成してるわけではありませんが...

作成はイラストレータで行いました。
参考:アクアボタンの作り方

オブジェクトグラフをフラットなMapの構造に写すことはできない 2006/12/09

うまく説明できなくてもどかしいのですが、《オブジェクトグラフをフラットなMapの構造に写すことができない》というのはなぜか。

最近の自分のコーディングのスタイルがクラスを設計し、オブジェクトを組み合わせたコンポジットなオブジェクトを操作するのではなく、フラットなMapにデータをもたせて操作するというのにシフトしてきている。

wikipedia:graph

mac osxでも使えるjavaデコンパイラ 2006/12/07

各種OSでも使えるデコンパイラ
jad
http://www.kpdus.com/jad.html

JadClipse - Eclipse plugin
http://sourceforge.net/projects/jadclipse/

インターフェイスにはIをつけている。インターフェイス名+implつけるのは好きではない。 2006/12/06

業務系のクラスでインタフェイスの実装クラス名に「インタフェイス名+Impl」って名前をつけるのはダサいよね。


というのを読んだ。

ちなみに自分は、
インターフェイスにはIをつけるようにしている。それで実装クラスにimplはつけない。
正直なことをいえば、I+名前にしろ、名前+Implでも、好きではないが、強いて言えば、I+名前のほうが好ましい。


実装の流れとしては、上から下に固有の実装が入る流れで、
I+名前インターフェイス
Abstract+名前クラス
Default+名前クラス
.
.
.
様々な実装クラス

ちなみにDIコンテナのSeasarでみかけたimplはかっこいいとは思わなかった。

gifファイルの出力 2006/12/02

javaプログラムから gifファイルを出力する方法です。
gif-plugin
を使用しています。

サンプルコードです。

BufferedImage bufferedImage = new BufferedImage(w,h, BufferedImage.TYPE_INT_ARGB);
new NeuQuantQuantizerOP().filter(bufferedImage, bufferedImage);
ImageIO.write(bufferedImage, "gif", new File("filename.gif"));


扱う imageが使用しているカラーを 調整するためNeuQuantQuantizerOPを使用しています。
使用しない場合 Too many colorでエラーとなります。
If the source image contains more than 256 colours you most likely will want to reduce the number of colours used. You can do so by using the included NeuQuantQuantizerOP

だそうです。

角丸 2006/12/02
2008/11/14

スティーブ・ジョブズ氏は角丸四角形を基本図形に含めることを激しく主張していたvia オレンジニュース


意識していなかったのですが、角丸はあちらこちらでみかけますね。
もっと手軽に角丸を使いたいのですが、なかなか手軽にはいかない部分もあります。
webのデザインでもまだCSSにコーナー用の gif画像を用意したりであったりと 、手間がかかるようです。 javaアプリケーションでもまだ手軽というわけではなさそうですが、 swingxのライブラリを使用すると手軽に表現できそうです。

swingx



サンプルコードはorg.jdesktop.swingx.painterを利用して角丸画像を手軽に作成する方法です。上記の画像を作成します。パラメータを与える入力を部分を作成工夫すればいろいろな角丸な画像をつくれそうですね。


import java.awt.BorderLayout;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestMainForOutRoundPanel extends JFrame {

private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private RoundPanel roundPanel = null;
private JPanel jPanel = null;
private JButton jButton = null;

private RoundPanel getRoundPanel() {
if (roundPanel == null) {
roundPanel = new RoundPanel();
}
return roundPanel;
}

private JPanel getJPanel() {
if (jPanel == null) {
jPanel = new JPanel();
jPanel.setLayout(new GridBagLayout());
jPanel.add(getJButton(), new GridBagConstraints());
}
return jPanel;
}

private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setText("out");
jButton.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

BufferedImage bufferedImage = new BufferedImage(roundPanel.getWidth(),
roundPanel.getHeight(),
BufferedImage.TYPE_INT_ARGB);
Graphics2D graphic = bufferedImage.createGraphics();
roundPanel.paintComponent2(graphic);

try {
ImageIO.write(
bufferedImage,
"png",
new File("filename.png"));
} catch (Exception ee) {
ee.printStackTrace();
}

}
});
}
return jButton;
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
TestMainForOutRoundPanel thisClass = new TestMainForOutRoundPanel();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
});
}

public TestMainForOutRoundPanel() {
super();
initialize();
}

private void initialize() {
this.setSize(474, 343);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");
}
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getRoundPanel(), BorderLayout.CENTER);
jContentPane.add(getJPanel(), BorderLayout.SOUTH);
}
return jContentPane;
}

} // @jve:decl-index=0:visual-constraint="10,10"


import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.RenderingHints;

import org.jdesktop.swingx.JXPanel;
import org.jdesktop.swingx.painter.CompoundPainter;
import org.jdesktop.swingx.painter.RectanglePainter;

public class RoundPanel extends JXPanel {

public RoundPanel() {
RectanglePainter roundRect = new RectanglePainter(10,
10,
10,
10,
37,
37,
true,
Color.black,
10,
Color.ORANGE);
roundRect.setAntialiasing(RenderingHints.VALUE_ANTIALIAS_ON);
CompoundPainter compound = new CompoundPainter(roundRect);
setBackgroundPainter(compound);
}

@Override
protected void paintComponent(Graphics g) {

super.paintComponent(g);
Dimension dimension = this.getSize();
int w = (int) (dimension.getWidth() / 2);
int h = (int) (dimension.getHeight() / 2);
Font font = new Font("", 0, 32);
g.setColor(Color.WHITE);
g.setFont(font);
g.drawString("角丸(round corner)", 18, h);
}

public void paintComponent2(Graphics graphics) {
paintComponent(graphics);
}

}

JFormDesigner 2006/12/02

javaの開発ツールを探す基準を自分なりのルールがあります 。まず第一に windowsのみだけでなく、 mac osxで使用することができることです。

JFormDesigneはosxのeclipseではいままで使用できなかったと思うのですが、新しいバージョンでは使用できるようです。ただし、 Java6が必要なようです。

JFormDesigner Changes

Supports Eclipse 3.1, 3.2 or later (Mac OS X: Eclipse 3.2 and Java 6 DP 6 or later required; Linux: Java 5 or later required).