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

目次

JRubyにJavaから日本語渡して返してもらう。 2008/08/31

JRubyです。

Javaから日本語を渡してJRuby側で判断して文字列を返すというコードを目指します。

ここ数日いろいろトライして結構検討はずれなことしてます。
※ここでやっていることは徒労なのかもしれませんが....

require "kconv"
を使ってスクリプト側で、日本語をtoutf8して、Java側から渡された文字列と比較するといい感じでした。
あとスクリプト側からJavaに返す際に、utf8してあげると、Java側でうまく表示できました。

使ったJavaはjava6です。
JRubyは、jruby-complete-1.1.2.jarです。実行は、eclipseで行いコンソールで出力を確認しています。

うまくいかなかったスクリプト

case v
when "沖縄"
"沖縄!!"
when "東京"
"東京!!"
when "神戸"
"神戸!!"
else
"該当せず。"
end


結果
?Y???????B



うまくいったスクリプト
require "kconv"して、文字列をtoutf8していってます。
こんなことしなくてもいいのかもしれないです。
require "kconv"
case v
when "沖縄".toutf8
"沖縄!!".toutf8
when "東京".toutf8
"東京!!".toutf8
when "神戸".toutf8
"神戸!!".toutf8
else
"該当せず。".toutf8
end


結果
沖縄!!


以下、Javaコードです。

package test_jruby;

import java.io.IOException;

import org.jruby.Ruby;

import static test_jruby.ExperimentationJRubyScriptBase.*;

public class Test_japanese_1 {

public static void main(String[] args) throws IOException {

Ruby ruby = Ruby.newInstance();

String script = script("test_japanese_1.jruby", "MS932");

String result = evalByJRuby(ruby, script, new Object[][]{{"v", "沖縄"}});

System.out.println(result);
}

}


package test_jruby;

import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.bsf.util.IOUtils;
import org.jruby.Ruby;
import org.jruby.RubyRuntimeAdapter;
import org.jruby.javasupport.JavaEmbedUtils;
import org.jruby.javasupport.JavaUtil;
import org.jruby.runtime.builtin.IRubyObject;

public class ExperimentationJRubyScriptBase {


/**
* <p>
* このメソッドで受け取るscriptはメソッド定義のされていない裸のスクリプトを想定しています。
* </p>
*
* @param ruby
* @param script
* @param objects
* @return
*/
public static String evalByJRuby(Ruby ruby, String script,
Object[][] objects) {

/*
* メソッド引数を作成する
*/
List<IRubyObject> list = new ArrayList<IRubyObject>();

//
final String M = "doprocess" + System.nanoTime();

StringBuilder builder = new StringBuilder();

builder.append("def " + M + " (");
if (objects != null) {
for (int i = 0; i < objects.length; i++) {
Object[] objects2 = objects[i];
if (2 <= objects2.length) {
builder.append(objects2[0].toString() + ",");
list.add(JavaUtil.convertJavaToRuby(ruby, objects2[1],
objects2[1].getClass()));
}
}

}

// 最後のカンマがあれば削除
if (builder.charAt(builder.length() - 1) == ',') {
builder.deleteCharAt(builder.length() - 1);
}
final String LS = System.getProperty("line.separator");
builder.append(")").append(LS).append(script).append("end");

script = builder.toString();
// System.out.println(script);
RubyRuntimeAdapter rubyRuntimeAdapter = JavaEmbedUtils
.newRuntimeAdapter();

IRubyObject[] params = new IRubyObject[list.size()];

list.toArray(params);

IRubyObject result = rubyRuntimeAdapter.eval(ruby, script).callMethod(
ruby.getCurrentContext(), M, params);

ruby.tearDown();

// System.out.println("*** " + result.getClass());

if (result instanceof org.jruby.RubyString) {
org.jruby.RubyString s = (org.jruby.RubyString) result;
return s.getUnicodeValue();
}
return result.toString();
}

static public String script(String filename, String enc) throws IOException {
String script = IOUtils.getStringFromReader(new InputStreamReader(
ExperimentationJRubyScriptBase.class
.getResourceAsStream(filename), enc));
return script;
}

}

FileFilterです。 2008/08/31

Javaです。

ファイルとディレクトリの振り分け
あと、更新時間でソート。

import java.io.File;
import java.io.FileFilter;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;

public class TestFileList {

public static void main(String[] args) {

File[] filesDir = new File("c:\\tmp\\").listFiles(new FileFilter() {

@Override
public boolean accept(File pathname) {
return pathname.isDirectory();
}
});

for (File file : filesDir) {
System.out.println(file + ": "
+ new Date(file.lastModified()).toLocaleString());
}

System.out.println("===========================");
System.out.println("===========================");
System.out.println("===========================");
System.out.println("===========================");

File[] files = new File("c:\\tmp\\").listFiles(new FileFilter() {

@Override
public boolean accept(File pathname) {
return !pathname.isDirectory();
}
});

Arrays.sort(files, new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
return new Long(o1.lastModified()).compareTo(new Long(o2
.lastModified()));
}
});

for (File file : files) {
System.out.println(file + ": "
+ new Date(file.lastModified()).toLocaleString());
}

}

}

jruby エンコード実験 その2 2008/08/30

JRubyです。

Javaから一部の処理をJRubyにまかせてその結果をJava側に戻すというプログラむをしたいのですが、日本語を渡してJRuby側でマッチさせようとしてくれません。
※僕が単純にまちがっている可能性大。

$paramにはJava側で"沖縄"を入れているとして、

if $param == "沖縄" then

をしたいのですが、失敗します。

いろいろ試してみました。
その結果、jruby側での値をいったんto_java_bytesを使って配列にしてそれをjava側でStringにして比較するという方法でマッチしました。

参考

JRubyスクリプト
p "沖縄"
p $param
b = String.from_java_bytes "沖縄".to_java_bytes
p b
$jruby_support::out("沖縄".to_java_bytes)
$jruby_support::out($param)

if $param == $jruby_support::convert("沖縄".to_java_bytes) then
print "yes okinawa \n"
else
print "not okinawa \n"
end

if $param == "沖縄" then
print "yes okinawa \n"
else
print "not okinawa \n"
end

if $param == Java::java::lang::String::new("沖縄".to_java_bytes) then
print "yes okinawa \n"
else
print "not okinawa \n"
end


結果
"\211\253\223\352"
"\346\262\226\347\270\204"
"\211\253\223\352"
*** out arg bytes
-119 -85 -109 -22
*** out arg string
-119 -85 -109 -22
yes okinawa
not okinawa
not okinawa


import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import org.apache.bsf.BSFException;
import org.apache.bsf.util.IOUtils;
import org.jruby.Ruby;
import org.jruby.javasupport.JavaEmbedUtils;
import org.jruby.javasupport.JavaUtil;
import org.jruby.runtime.GlobalVariable;
import org.jruby.runtime.builtin.IRubyObject;
import org.jruby.util.KCode;

public class JRUBYTest4 {

public static void main(String[] args) throws BSFException,
UnsupportedEncodingException, IOException {
String script = IOUtils
.getStringFromReader(new InputStreamReader(TestBSF_jruby.class
.getResourceAsStream("test_jruby_4.jruby"), "utf8"));
Ruby ruby = Ruby.newInstance();
//ruby.setKCode(KCode.SJIS);
//ruby.setKCode(KCode.UTF8);
//ruby.setKCode(KCode.NONE);

IRubyObject param = JavaEmbedUtils.javaToRuby(ruby, "沖縄");
IRubyObject param2 = JavaEmbedUtils.javaToRuby(ruby, "abcd");
IRubyObject jrubySupport = JavaEmbedUtils.javaToRuby(ruby, new JRubySupport());
ruby.defineVariable(new GlobalVariable(ruby, "$param", param));
ruby.defineVariable(new GlobalVariable(ruby, "$param2", param2));
ruby.defineVariable(new GlobalVariable(ruby, "$jruby_support", jrubySupport));

Object obj = ruby.evalScriptlet(script);
System.out.println(obj);
ruby.tearDown();
}

static public class JRubySupport {
public void out(String s) throws UnsupportedEncodingException {
System.out.println("*** out arg string");
for (byte b : s.getBytes()) {
System.out.print(b + " ");
}
System.out.println();

}
public void out(byte[] s) throws UnsupportedEncodingException {
System.out.println("*** out arg bytes");
for (byte b : s) {
System.out.print(b + " ");
}
System.out.println();

}
public String convert(byte[] b){
return new String(b);
}
public String convert(String s){
return s;
}
}

}

jruby エンコード実験 2008/08/30

JRubyです。

javaからjrubyにパラメータを渡してそのパラメータとjrubyスクリプト側で設定した値をマッチさせたいと思ったのですが、日本語だとどうも上手くいかないです。

解決策がみつからないのでとりあえず実験コードです。
osx上で動作させているeclipseで実験
jdk1.5 jruby 1.1.3

条件

スクリプトファイルはsjisで保存。
スクリプトを読み込ませるときにsjis指定で読み込ませます。
ruby.setKCode(KCode.NONE);


出力
"\211\253\223\352"
"\346\262\226\347\270\204"
"abcd"
"abcd"


条件
スクリプトファイルはsjisで保存。
スクリプトを読み込ませるときにsjis指定で読み込ませます。
ruby.setKCode(KCode.SJIS);


出力
"沖縄"
"豐也\270\204"
"abcd"
"abcd"


条件
スクリプトファイルはutf8で保存。
スクリプトを読み込ませるときにutf8指定で読み込ませます。
ruby.setKCode(KCode.NONE);


出力
"\211\253\223\352"
"\346\262\226\347\270\204"
"abcd"
"abcd"


条件
スクリプトファイルはutf8で保存。
スクリプトを読み込ませるときにutf8指定で読み込ませます。
ruby.setKCode(KCode.UTF8);


出力
"\211\253\223\352"
"豐也ク?"
"abcd"
"abcd"


jrubyスクリプト
p "沖縄"
p $param
p "abcd"
p $param2


使ったjavaコード
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import org.apache.bsf.BSFException;
import org.apache.bsf.util.IOUtils;
import org.jruby.Ruby;
import org.jruby.javasupport.JavaEmbedUtils;
import org.jruby.runtime.GlobalVariable;
import org.jruby.runtime.builtin.IRubyObject;
import org.jruby.util.KCode;

public class JRUBYTest3 {

public static void main(String[] args) throws BSFException,
UnsupportedEncodingException, IOException {
String script = IOUtils
.getStringFromReader(new InputStreamReader(TestBSF_jruby.class
.getResourceAsStream("test_jruby_3_utf8.jruby"), "utf8"));
// String script = IOUtils
// .getStringFromReader(new InputStreamReader(TestBSF_jruby.class
// .getResourceAsStream("test_jruby_3_sjis.jruby"), "sjis"));
Ruby ruby = Ruby.newInstance();
//ruby.setKCode(KCode.SJIS);
ruby.setKCode(KCode.UTF8);
//ruby.setKCode(KCode.NONE);

IRubyObject param = JavaEmbedUtils.javaToRuby(ruby, "沖縄");
IRubyObject param2 = JavaEmbedUtils.javaToRuby(ruby, "abcd");

ruby.defineVariable(new GlobalVariable(ruby, "$param", param));
ruby.defineVariable(new GlobalVariable(ruby, "$param2", param2));

Object obj = ruby.evalScriptlet(script);
System.out.println(obj);
ruby.tearDown();
}

}

writer系でのエンコーディングの指定 2008/08/30

Javaです。
Write系を使用してのエンコーディングの指定は、OutputStreamWriterで行えます。

writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(file, true), enc));

実寸表示!? - ものさしに向けて 2008/08/26

画面上で表示されているものがリアルな世界と同じサイズをもつように表示するためには、ディスプレイの物理サイズ(何インチ)かをプログラム上で取得できないとだめなのではと考えた次第です。

Javaとかでは、簡単にモニタの解像度は取得できますが、そのモニタの物理サイズ(何インチ)とどういう比率のものなのか取得する手段がちょっとわからないです。

実際のサイズがわかれば使われている解像度から、何ピクセルで何センチともとまると思うので実寸表示のものさしが作れると思うのですが...

参考
画面サイズ - Wikipedia

画面サイズ(インチ)、画面縦横(cm) - ものさしに向けて 2008/08/26

コンピュータで使われるディスプレイを「何〜インチのモニタ」といったりします。正直このインチ単位がよくわかってませんでした。1インチは2.54センチだそうです。
あと、モニタのサイズで使われるこのインチはモニタの対角線のサイズのことです。

このインチから縦横の実寸サイズをセンチで計算してみます。あとこれまた知らなかったのですが、この液晶のディスプレイの縦横のサイズ比率がいろいろあるようです。代表的なものが横縦4:3,16:9,16:10のようです。

参考



多分当たっていると思うのですが....

package t004;

import static java.lang.Math.*;

public class Test_Print_Monitor_Inch {

static class I_am_Pythagorean {
final double f = 2.54;// 1インチ 2.54センチ

public double a;
public double b;
public double c;

/**
* ピタゴラス一派
* @param a 縦(インチ)
* @param b 横(インチ)
* @param c 対角線(インチ)
*/
public I_am_Pythagorean(double a, double b, double c) {
this.a = a;
this.b = b;
this.c = c;
}

public void selfTest(){
// c2 = a2 + b2;
System.out.printf("%f = %f", c, sqrt(pow(a, 2) + pow(b, 2)));
}

// inch
public String toString() {
return String.format("a[%.3f] b:[%.3f] c:[%.3f]", a, b, c);
}
public String toStringWithCM() {
return String.format("a[%.3f]cm b:[%.3f]cm c:[%.3f]cm", a*f, b*f, c*f);
}
public String toStringWithCM_2() {
return String.format("a[%.1f]cm b:[%.1f]cm c:[%.1f]cm", a*f, b*f, c*f);
}
public String toStringWithCM_3() {
return String.format("横[%.2f]cm 縦:[%.2f]cm 対角線:[%.2f]cm", a*f, b*f, c*f);
}
}

public static void main(String[] args) {
for (int i = 1; i < 32; i++) {
System.out.printf("モニタ[%d]inch %n", i);
I_am_Pythagorean tri = a(i);//4:3
I_am_Pythagorean tri_w = a_wide(i);//16:9
I_am_Pythagorean tri_w2 = a_wide2(i);//16:10

System.out.println("4:3 :" + tri.toStringWithCM_3());
System.out.println("16:9 :" + tri_w.toStringWithCM_3());
System.out.println("16:10 :" + tri_w2.toStringWithCM_3());
// tri_w2.selfTest();
System.out.println();
}

}

/**
* 画面縦横比率 4:3
* @param c
* @return
*/
static I_am_Pythagorean a(double c) {
// 4:3
// c2 = a2 + b2;
double a = sqrt(pow(c, 2) * (16 / 25d));
double b = a * (3 / 4d);
return new I_am_Pythagorean(a, b, c);
}

/**
* 画面縦横比率 16:9
* @param c
* @return
*/
static I_am_Pythagorean a_wide(double c) {
// 16:9
double a = sqrt(pow(c, 2) * (256 / 337d));
double b = a * (9 / 16d);
return new I_am_Pythagorean(a, b, c);
}

/**
* 画面縦横比率 16:10
* @param c
* @return
*/
static I_am_Pythagorean a_wide2(double c) {
// 16:10
double a = sqrt(pow(c, 2) * (64 / 89d));
double b = a * (10 / 16d);
return new I_am_Pythagorean(a, b, c);
}
}


結果です。
モニタ[1]inch
4:3 :横[2.03]cm 縦:[1.52]cm 対角線:[2.54]cm
16:9 :横[2.21]cm 縦:[1.25]cm 対角線:[2.54]cm
16:10 :横[2.15]cm 縦:[1.35]cm 対角線:[2.54]cm

モニタ[2]inch
4:3 :横[4.06]cm 縦:[3.05]cm 対角線:[5.08]cm
16:9 :横[4.43]cm 縦:[2.49]cm 対角線:[5.08]cm
16:10 :横[4.31]cm 縦:[2.69]cm 対角線:[5.08]cm

モニタ[3]inch
4:3 :横[6.10]cm 縦:[4.57]cm 対角線:[7.62]cm
16:9 :横[6.64]cm 縦:[3.74]cm 対角線:[7.62]cm
16:10 :横[6.46]cm 縦:[4.04]cm 対角線:[7.62]cm

モニタ[4]inch
4:3 :横[8.13]cm 縦:[6.10]cm 対角線:[10.16]cm
16:9 :横[8.86]cm 縦:[4.98]cm 対角線:[10.16]cm
16:10 :横[8.62]cm 縦:[5.38]cm 対角線:[10.16]cm

モニタ[5]inch
4:3 :横[10.16]cm 縦:[7.62]cm 対角線:[12.70]cm
16:9 :横[11.07]cm 縦:[6.23]cm 対角線:[12.70]cm
16:10 :横[10.77]cm 縦:[6.73]cm 対角線:[12.70]cm

モニタ[6]inch
4:3 :横[12.19]cm 縦:[9.14]cm 対角線:[15.24]cm
16:9 :横[13.28]cm 縦:[7.47]cm 対角線:[15.24]cm
16:10 :横[12.92]cm 縦:[8.08]cm 対角線:[15.24]cm

モニタ[7]inch
4:3 :横[14.22]cm 縦:[10.67]cm 対角線:[17.78]cm
16:9 :横[15.50]cm 縦:[8.72]cm 対角線:[17.78]cm
16:10 :横[15.08]cm 縦:[9.42]cm 対角線:[17.78]cm

モニタ[8]inch
4:3 :横[16.26]cm 縦:[12.19]cm 対角線:[20.32]cm
16:9 :横[17.71]cm 縦:[9.96]cm 対角線:[20.32]cm
16:10 :横[17.23]cm 縦:[10.77]cm 対角線:[20.32]cm

モニタ[9]inch
4:3 :横[18.29]cm 縦:[13.72]cm 対角線:[22.86]cm
16:9 :横[19.92]cm 縦:[11.21]cm 対角線:[22.86]cm
16:10 :横[19.39]cm 縦:[12.12]cm 対角線:[22.86]cm

モニタ[10]inch
4:3 :横[20.32]cm 縦:[15.24]cm 対角線:[25.40]cm
16:9 :横[22.14]cm 縦:[12.45]cm 対角線:[25.40]cm
16:10 :横[21.54]cm 縦:[13.46]cm 対角線:[25.40]cm

モニタ[11]inch
4:3 :横[22.35]cm 縦:[16.76]cm 対角線:[27.94]cm
16:9 :横[24.35]cm 縦:[13.70]cm 対角線:[27.94]cm
16:10 :横[23.69]cm 縦:[14.81]cm 対角線:[27.94]cm

モニタ[12]inch
4:3 :横[24.38]cm 縦:[18.29]cm 対角線:[30.48]cm
16:9 :横[26.57]cm 縦:[14.94]cm 対角線:[30.48]cm
16:10 :横[25.85]cm 縦:[16.15]cm 対角線:[30.48]cm

モニタ[13]inch
4:3 :横[26.42]cm 縦:[19.81]cm 対角線:[33.02]cm
16:9 :横[28.78]cm 縦:[16.19]cm 対角線:[33.02]cm
16:10 :横[28.00]cm 縦:[17.50]cm 対角線:[33.02]cm

モニタ[14]inch
4:3 :横[28.45]cm 縦:[21.34]cm 対角線:[35.56]cm
16:9 :横[30.99]cm 縦:[17.43]cm 対角線:[35.56]cm
16:10 :横[30.15]cm 縦:[18.85]cm 対角線:[35.56]cm

モニタ[15]inch
4:3 :横[30.48]cm 縦:[22.86]cm 対角線:[38.10]cm
16:9 :横[33.21]cm 縦:[18.68]cm 対角線:[38.10]cm
16:10 :横[32.31]cm 縦:[20.19]cm 対角線:[38.10]cm

モニタ[16]inch
4:3 :横[32.51]cm 縦:[24.38]cm 対角線:[40.64]cm
16:9 :横[35.42]cm 縦:[19.92]cm 対角線:[40.64]cm
16:10 :横[34.46]cm 縦:[21.54]cm 対角線:[40.64]cm

モニタ[17]inch
4:3 :横[34.54]cm 縦:[25.91]cm 対角線:[43.18]cm
16:9 :横[37.63]cm 縦:[21.17]cm 対角線:[43.18]cm
16:10 :横[36.62]cm 縦:[22.89]cm 対角線:[43.18]cm

モニタ[18]inch
4:3 :横[36.58]cm 縦:[27.43]cm 対角線:[45.72]cm
16:9 :横[39.85]cm 縦:[22.41]cm 対角線:[45.72]cm
16:10 :横[38.77]cm 縦:[24.23]cm 対角線:[45.72]cm

モニタ[19]inch
4:3 :横[38.61]cm 縦:[28.96]cm 対角線:[48.26]cm
16:9 :横[42.06]cm 縦:[23.66]cm 対角線:[48.26]cm
16:10 :横[40.92]cm 縦:[25.58]cm 対角線:[48.26]cm

モニタ[20]inch
4:3 :横[40.64]cm 縦:[30.48]cm 対角線:[50.80]cm
16:9 :横[44.28]cm 縦:[24.91]cm 対角線:[50.80]cm
16:10 :横[43.08]cm 縦:[26.92]cm 対角線:[50.80]cm

モニタ[21]inch
4:3 :横[42.67]cm 縦:[32.00]cm 対角線:[53.34]cm
16:9 :横[46.49]cm 縦:[26.15]cm 対角線:[53.34]cm
16:10 :横[45.23]cm 縦:[28.27]cm 対角線:[53.34]cm

モニタ[22]inch
4:3 :横[44.70]cm 縦:[33.53]cm 対角線:[55.88]cm
16:9 :横[48.70]cm 縦:[27.40]cm 対角線:[55.88]cm
16:10 :横[47.39]cm 縦:[29.62]cm 対角線:[55.88]cm

モニタ[23]inch
4:3 :横[46.74]cm 縦:[35.05]cm 対角線:[58.42]cm
16:9 :横[50.92]cm 縦:[28.64]cm 対角線:[58.42]cm
16:10 :横[49.54]cm 縦:[30.96]cm 対角線:[58.42]cm

モニタ[24]inch
4:3 :横[48.77]cm 縦:[36.58]cm 対角線:[60.96]cm
16:9 :横[53.13]cm 縦:[29.89]cm 対角線:[60.96]cm
16:10 :横[51.69]cm 縦:[32.31]cm 対角線:[60.96]cm

モニタ[25]inch
4:3 :横[50.80]cm 縦:[38.10]cm 対角線:[63.50]cm
16:9 :横[55.35]cm 縦:[31.13]cm 対角線:[63.50]cm
16:10 :横[53.85]cm 縦:[33.65]cm 対角線:[63.50]cm

モニタ[26]inch
4:3 :横[52.83]cm 縦:[39.62]cm 対角線:[66.04]cm
16:9 :横[57.56]cm 縦:[32.38]cm 対角線:[66.04]cm
16:10 :横[56.00]cm 縦:[35.00]cm 対角線:[66.04]cm

モニタ[27]inch
4:3 :横[54.86]cm 縦:[41.15]cm 対角線:[68.58]cm
16:9 :横[59.77]cm 縦:[33.62]cm 対角線:[68.58]cm
16:10 :横[58.16]cm 縦:[36.35]cm 対角線:[68.58]cm

モニタ[28]inch
4:3 :横[56.90]cm 縦:[42.67]cm 対角線:[71.12]cm
16:9 :横[61.99]cm 縦:[34.87]cm 対角線:[71.12]cm
16:10 :横[60.31]cm 縦:[37.69]cm 対角線:[71.12]cm

モニタ[29]inch
4:3 :横[58.93]cm 縦:[44.20]cm 対角線:[73.66]cm
16:9 :横[64.20]cm 縦:[36.11]cm 対角線:[73.66]cm
16:10 :横[62.46]cm 縦:[39.04]cm 対角線:[73.66]cm

モニタ[30]inch
4:3 :横[60.96]cm 縦:[45.72]cm 対角線:[76.20]cm
16:9 :横[66.41]cm 縦:[37.36]cm 対角線:[76.20]cm
16:10 :横[64.62]cm 縦:[40.39]cm 対角線:[76.20]cm

モニタ[31]inch
4:3 :横[62.99]cm 縦:[47.24]cm 対角線:[78.74]cm
16:9 :横[68.63]cm 縦:[38.60]cm 対角線:[78.74]cm
16:10 :横[66.77]cm 縦:[41.73]cm 対角線:[78.74]cm

JScrollPaneにJTextPaneをのっけてopaque 2008/08/25

Javaです。Swingです。はまったのでメモ。
JScrollPaneのものをのっけてそのコンポーネントの不透明をfalseにしても効かなかった。
そういう場合は、のっけられたJScrollPaneのgetViewport().setOpaque(false)にする。

scrollpane.getViewport().setOpaque(false)


気がつかないなぁ

参考

boolean値の反転 2008/08/24
2013/09/27

ブール値の反転です。

4種類の書き方。

public class TestReverseBoolean { public static void main(String[] args) { boolean b = true; for (int i = 0; i < 7; i++) { if (b == true) { b = false; } else { b = true; } System.out.println(b); } System.out.println(); for (int i = 0; i < 7; i++) { b = !b; System.out.println(b); } System.out.println(); for (int i = 0; i < 7; i++) { b = b ? false : true; System.out.println(b); } // 2013-09-28 に追加 // コメントより System.out.println(); for (int i = 0; i < 7; i++) { b ^= true; System.out.println(b); } } }

デスクトップものさしを目指して 2008/08/24

Javaです。
デスクトップのものさしがあったら便利そうです。
ぼくがCSSを書くときに手放せないツール - ぼくはまちちゃん!(Hatena)

Javaで実現する場合は、Winodwの不透明がネックになりそうですが、とりあえずosxで。



いつものことですが、コードは適当です。

package t004;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JPanel;
import javax.swing.JWindow;

public class Test1 {

/**
* @param args
*/
public static void main(String[] args) {

JWindow frame = new JWindow();
frame.setAlwaysOnTop(true);
frame.setBackground(new Color(254, 254, 198, 100));

MyPanel panel = new MyPanel();
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(panel, BorderLayout.CENTER);

frame.setBounds(100, 100, 300, 30);
frame.setVisible(true);

}

static class MyPanel extends JPanel {

@Override
protected void paintComponent(Graphics g) {

int w = getWidth();
int h = getHeight() / 3;
System.out.println("*** w:" + w);
Graphics2D g2D = (Graphics2D) g;
g2D.setColor(Color.BLACK);
for (int x = 0; x < w; x += 5) {

if (x % 10 == 0) {
g2D.fillRect(x, 0, 1, h + 5);
} else {
g2D.fillRect(x, 0, 1, h);
}
if (x != 0 && x % 50 == 0)
g2D.drawString("" + x, x - 10, h + 20);

}

}

}
}

osx(Tiger) java5でのjava.awt.RobotのcreateScreenCaptureについて その2 2008/08/24

Javaです。mac osx(tiger)です。
どうしてもセカンダリモニタをキャプチャできません。

Robotの引数なしのコンストラクタを使うとセカンダリモニタが黒くなります。
次に各モニタごとのGraphicsDeviceを指定してやるやりかたでやりますと、キャプチャできることはできるのですが画面の半分だけでへんな乱れ方をした画像がとれます。
僕の環境だけなのか、コードが書き方が悪いのか....

不完全ですがテストコード

package t002;

import java.awt.AWTException;
import java.awt.DisplayMode;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;

import org.jdesktop.swingx.JXImageView;

public class TestCapture {

public static void main(String[] args) throws AWTException {
JXImageView panel = new JXImageView();
JFrame frame = new JFrame();
m(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel);
frame.setBounds(new Rectangle(100, 100, 300, 300));
frame.setAlwaysOnTop(true);
frame.setVisible(true);
}

public static void m(JXImageView panel) throws AWTException {

GraphicsConfiguration[] graphicsConfigurations = graphicsConfigurations();
for (GraphicsConfiguration graphicsConfiguration : graphicsConfigurations) {
Rectangle rectangle = graphicsConfiguration.getBounds();
System.out.println(rectangle);
// 各graphicsdeviceを使って初期化
Robot robot = new Robot(graphicsConfiguration.getDevice());

System.out.println("disp mode>>>"
+ dispMode(graphicsConfiguration.getDevice()
.getDisplayMode()));
Rectangle cap = new Rectangle(0, 0, rectangle.width,
rectangle.height);
BufferedImage image = robot.createScreenCapture(cap);
panel.setImage(image);
}

}

public static String dispMode(DisplayMode displayMode) {
StringBuilder builder = new StringBuilder();
builder.append(" width:[").append(displayMode.getWidth()).append("] ");
builder.append(" height:[").append(displayMode.getHeight())
.append("] ");
builder.append(" RefreshRate:[").append(displayMode.getRefreshRate())
.append("] ");
return builder.toString();
}

/**
* GraphicsConfigurationを全部取得
* @return
*/
public static GraphicsConfiguration[] graphicsConfigurations() {

List<GraphicsConfiguration> list = new ArrayList<GraphicsConfiguration>();
GraphicsEnvironment ge = GraphicsEnvironment
.getLocalGraphicsEnvironment();

for (GraphicsDevice graphicsDevice : ge.getScreenDevices()) {
for (GraphicsConfiguration graphicsConfiguration : graphicsDevice
.getConfigurations()) {
list.add(graphicsConfiguration);
}
}
return list.toArray(new GraphicsConfiguration[list.size()]);
}

public static Rectangle virtualBounds() {
Rectangle virtualBounds = new Rectangle();
GraphicsEnvironment ge = GraphicsEnvironment
.getLocalGraphicsEnvironment();

for (GraphicsDevice graphicsDevice : ge.getScreenDevices()) {
for (GraphicsConfiguration graphicsConfiguration : graphicsDevice
.getConfigurations()) {

// unionしている
virtualBounds = virtualBounds.union(graphicsConfiguration
.getBounds());
}
}
return virtualBounds;
}
}

JNLP extensionという仕組み 2008/08/24

Javaです。Java Web Startについてです。
JNLPから別のJNLPを読み込むための仕組みがあります。
この仕組みを使うと同じライブラリセットをもつアプリケーション同士でライブラリの共有ができます。

<resources>
- 略 -
<extension href="http://aaa/bbb.jnlp"/>
</resources>


呼ばれるJNLPには
<component-desc/>

を指定します。

参考
JNLP Tag Reference

osx(Tiger) java5でのjava.awt.RobotのcreateScreenCaptureについて 2008/08/23

Javaです。mac osx(Tiger)上でJava5の環境です。

スクリーンキャプチャができるjava.awt.RobotのcreateScreenCaptureを不可解な例外が発生。

Exception in thread "main" java.lang.NegativeArraySizeException
at apple.awt.CRobot.getRGBPixels(CRobot.java:197)
at java.awt.Robot.createScreenCapture(Robot.java:298)


使ってモニターがふたつの状態でおきました。
Windows環境では、同じコードで画面をまたがってキャプチャできたのですがmac osxでのAppleのJavaでは上記の例外が。

テストコード
package t002;

import java.awt.AWTException;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Robot;

public class TestRobotCapture {

public static void main(String[] args) throws AWTException {
final Robot robot = new Robot();

final Rectangle virtualBounds = virtualBounds();
// System.out.println(virtualBounds);
// x
for (int i = 0; i < virtualBounds.width; i++) {
// y
for (int j = 0; j < virtualBounds.height; j++) {
Rectangle rectangle = new Rectangle(i, j, 1, 1);
System.out.println(rectangle);
robot.createScreenCapture(rectangle);
}
}
}

static Rectangle virtualBounds() {
Rectangle virtualBounds = new Rectangle();
GraphicsEnvironment ge = GraphicsEnvironment
.getLocalGraphicsEnvironment();

for (GraphicsDevice graphicsDevice : ge.getScreenDevices()) {
for (GraphicsConfiguration graphicsConfiguration : graphicsDevice
.getConfigurations()) {
virtualBounds = virtualBounds.union(graphicsConfiguration
.getBounds());
}
}
return virtualBounds;
}
}


どうも左にプライマリディスプレイ、右にセカンダリのディスプレイがある環境です。
左のモニタのサイズをこえたところで例外が発生。

まだ実験していませんが、Robotには GraphicsDeviceを指定できるコンストラクタが用意されています。
これは、モニタ毎に指定してあげればいいのかもしれません。

native2asciiもどき 2008/08/21

Javaです。
jdkな環境についているくるnative2asciiのようなものです。


public class Test_native2ascii_2 {

public static void main(String[] args) {

String s = "てすと123 てすと";
System.out.println(dump(s));
}

static String dump(String value) {
StringBuilder sb = new StringBuilder();

for (int i = 0; i < value.length(); i++) {

String s = Integer.toHexString(value.codePointAt(i));

if (4 <= s.length()) {
sb.append("\\u" + s);
} else {
sb.append(value.charAt(i));
}
}

return sb.substring(0, sb.length());
}
}


\u3066\u3059\u3068123 \u3066\u3059\u3068


参考
[HOWTO][Java]文字コードを変換する - 午後の日記
Koders Code Search: Native2Ascii.java - Java - GPL

仮想デバイスの境界判定のために 2008/08/21

Javaです。
GraphicsConfigurationのJavadocから。

デスクトップ領域が物理的に複数の画面デバイスにまたがる仮想デバイスのマルチスクリーン環境では、GraphicsConfiguration オブジェクトの境界は、仮想の座標系を基準にしています。Javadoc


import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;

public class TestGraphicConfiguration___1 {

public static void main(String[] args) {
Rectangle virtualBounds = new Rectangle();
GraphicsEnvironment ge = GraphicsEnvironment
.getLocalGraphicsEnvironment();

for (GraphicsDevice graphicsDevice : ge.getScreenDevices()) {
for (GraphicsConfiguration graphicsConfiguration : graphicsDevice
.getConfigurations()) {

// unionしている
virtualBounds = virtualBounds.union(graphicsConfiguration
.getBounds());
}
}
System.out.println(virtualBounds);
}
}

PixelGrabberでgrabPixels 2008/08/20
2008/08/21

Javaです。

BufferedImageをgetScaledInstanceメソッドで返されるImageはOS依存っぽいクラスでした。
mac osxだとapple.awt.OSXImageでした。windowsでサンのjdkだとsun.awt.image.ToolkitImageでした。
この辺の知識がすごく曖昧。

何がしたいかといいますと、getScaledInstanceしたイメージから任意の位置のピクセルを取得したいということですが、BufferedImageですとgetRGB(int x, int y) メソッドがあるのですがImageインターフェイスにはないです。

どうしたものかと悩んで、「困ったときのJavadoc」というわけで、眺めていますと、その名もずばりPixelGrabberがありました。
このPixelGrabberには、getPixelsというメソッドがあります。new したあと呼んでもnullが返ってきてしまい戸惑いました。
理由は実際の取得のための呼び出しをしていなかったからです。

JavadocにstartGrabbingについての記述がありました。

PixelGrabber にピクセルの取り込み開始を要求します。


実際はgrabPixelsメソッドを呼ぶのがいいみたい。
Image または ImageProducer に、ピクセルの転送を開始し、転送を要求された矩形のピクセルがすべて転送されるまで待つことを要求します。


grabPixelsをしたあとstatusをみるというのが正しい使い方みたいですね。

マウスの位置の取得して画面キャプチャ 2008/08/19

Javaです。
ふと画面キャプチャを作成したくなり、どうやったらマウスの位置を取得するかで悩みました。
Java5から導入された、MouseInfoを使うといいようです。

それで画面キャプチャを行うのは、java.awt.Robotを使うとよいです。



マウスポインタの周り縦横50ピクセルキャプチャして連続して表示させています。
mac osxのユーティリティのDigital Color Meterを意識しています。

package t002;

import java.awt.AWTException;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.lang.reflect.InvocationTargetException;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import org.jdesktop.swingx.JXImageView;

public class TestMain {

public static void main(String[] args) throws AWTException {
JXImageView panel = new JXImageView();
JFrame frame = new JFrame();
m(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel);
frame.setVisible(true);
}

static void m(final JXImageView panel) throws AWTException {

final Robot robot = new Robot();

new Thread(new Runnable() {

public void run() {
while (true) {
PointerInfo pointerInfo = MouseInfo.getPointerInfo();
// System.out.println("Location of Mouse : "
// + pointerInfo.getLocation());
Point point = pointerInfo.getLocation();

int x = point.x - 50;
int y = point.y - 50;
x = 0 < x ? x : 0;
y = 0 < y ? y : 0;

final BufferedImage img = robot
.createScreenCapture(new Rectangle(x, y, 100, 100));
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
panel.setImage(img);
}
});
Thread.sleep(70L);
} catch (InterruptedException ex) {
ex.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}

}).start();

}

}


参考
Screen上にあるMouseの位置を取得する - Java Swing Tips

JTable グリッドの線 2008/08/19

Javaです。Swingです。JTableのグリッドの線について。

グリッドの非表示は、setShowGrid(boolean showGrid)を使う。
で、それで、設定してもセルの間に枠線がでてしまう。



そういう時には、セル間のスペースをなくす設定をします。

table.setIntercellSpacing(new Dimension(0,0));




参考
[JavaHouse-Brewers:27609] JTable のグリッド線の非表示

JTable 列の選択 2008/08/19




ちょっと悩んだけど、JTableで任意の矩形で選択するのにどうするのかなぁと、
setColumnSelectionAllowedというメソッドがありました。

このモデルの列を選択できるかどうかを設定します。

org.jdesktop.animation.timing.interpolation.PropertySetterを使ってpainterのプロパティを変化させようとした。 2008/08/17

org.jdesktop.swingx.painterを使って色が変化するエフェクトをつけたいので、いろいろ調べています。




timingframeworkを使うと簡単にアニメーションとかできそうなので、試しつつ、org.jdesktop.animation.timing.interpolation.PropertySetterを使ってpainterのプロパティを変化させようとしたのですが、どうも値は変更されているが、画面の再描画がされない。

具体的には、CheckerboardPainterの色をマウスオーバー時に変更したい。
JXPanelにマウスがのっかると色が黒から青へ変化。ぬけるともとの色にもどる。

Animator animator = PropertySetter.createAnimator(1000, checkerboardPainter,
"LightPaint", Color.BLACK, Color.BLUE);

MouseTrigger mouseTrigger = MouseTrigger.addTrigger(panel, animator,
MouseTriggerEvent.ENTER, true);

上記だとどうもうまくいかない。
windowサイズを変えたりとかするといろが変わってくれたりした。
※osx上で。

で、考えたのは、painter上のpropertyが変更されたというイベントを受け取ったらpanelにrepaintさせるという方法。

checkerboardPainter.addPropertyChangeListener(new PropertyChangeListener(){
public void propertyChange(PropertyChangeEvent evt) {
System.out.println("***");
panel.repaint();
}});


できたけど、もっといい方法を模索中。
panelにpainterを設定してそのpainterからpanelに対して、repainntを走らせるのもなぁ....

文字列のクリップボードへコピー 2008/08/16
2010/12/04

Javaです。
文字列のクリップボードへコピーです。

参考
Java クリップボードへコピー / Chat&Messenger

システムのクリップボードを取り出して文字列を渡してあげます。
その際に、java.awt.datatransfer.StringSelectionを使います。

String を転送する際に必要な能力を実装する Transferable です。


Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
StringSelection selection = new StringSelection(text);
clipboard.setContents(selection, selection);

JTextField setTextしたあと、setCaretPositionを0にしてあげる。 2008/08/16

Javaです。
JTextFieldでsetTextしたあとキャレットがおしりにいってしまいます。
そんなときはsetCaretPosition(0)してあげます。
おしりにいく場合の不都合は、入力文字より表示領域が小さい場合に先頭の文字がみえなくなってしまうという場合ですかね。

ファイルからmd5 2008/08/16

Javaです。
MD5を求めます。
APIにMessageDigestがありますのでそれを使用します。

static String md5(File file) throws NoSuchAlgorithmException, IOException {
MessageDigest digest = MessageDigest.getInstance("MD5");

FileInputStream stream = new FileInputStream(file);

try {
byte[] buf = new byte[8192];
int len = 0;
while (0 <= (len = stream.read(buf))) {
digest.update(buf, 0, len);
}

byte[] hash = digest.digest();
return toHexString(hash);
} finally {
try {
stream.close();
} catch (IOException e) {

}
}

}

ShapePainter - そしてdrop me 2008/08/16

Javaです。swingxです。


BasicStrokeの使い方よくわかないです.....

下記のコードはなんとなくできたのでよろしくないかもです。
背景の市松模様はCheckerboardPainterです。

BasicStrokeからcreateStrokedShapeするとshapeが作れるので、それをShapePainterに渡してます。

static private Painter getPainter() {

CheckerboardPainter cbp = new CheckerboardPainter();

RoundRectangle2D.Double rrd = new RoundRectangle2D.Double(0, 0, 140,
140, 20, 20);

float[] dash = { 18, 15 };
Shape shape = new BasicStroke(10, BasicStroke.CAP_SQUARE,
BasicStroke.JOIN_MITER, 20, dash, 3).createStrokedShape(rrd);

ShapePainter p = new ShapePainter(shape);
p.setAntialiasing(true);
p.setBorderPaint(Color.DARK_GRAY);
p.setFillPaint(Color.DARK_GRAY);


TextPainter textPainter = new TextPainter("Drop me");
Font font = new Font("Arial", Font.BOLD, 24);
textPainter.setAntialiasing(true);
textPainter.setFillPaint(Color.DARK_GRAY);
textPainter.setFont(font);
return (new CompoundPainter(cbp, p, textPainter));
}

ドラッグしてドロップミー 2008/08/15

Javaです。

画面上からドラッグしてドロップします。

なんとなくできた感じですが、importするときとちがってコードがちょっとわかりずらいかなぁ

ドロップが成功した場合の処理は、exportDoneに書きます。

ドロップする相手が別アプリケーションの場合どうなるんだろう....


import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.TransferHandler;

public class DragAndDropMe {

public static void main(String[] args) {

JFrame frame = new JFrame();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JPanel panel = new JPanel();
panel.setTransferHandler(new TransferHandler() {

private static final long serialVersionUID = 1L;

@Override
protected void exportDone(JComponent source, Transferable data,
int action) {
System.out.println("*** exportDone: " + source + " " + data
+ " " + action);
}

@Override
public int getSourceActions(JComponent c) {
System.out.println("*** getSourceActions");
return COPY;
}

@Override
protected Transferable createTransferable(JComponent c) {

System.out.println("*** createTransferable");

return new Transferable() {

@Override
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException {

System.out.println("+++ getTransferData :[" + flavor
+ "]");
return null;
}

@Override
public DataFlavor[] getTransferDataFlavors() {
System.out.println("+++ getTransferDataFlavors");
return new DataFlavor[] { DataFlavor.stringFlavor,
DataFlavor.javaFileListFlavor };
}

@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return false;
}

};
}
});

panel.addMouseMotionListener(new MouseAdapter() {

@Override
public void mouseDragged(MouseEvent e) {
super.mouseDragged(e);
panel.getTransferHandler().exportAsDrag(
(JComponent) e.getSource(), e, TransferHandler.COPY);
}

});

frame.getContentPane().add(panel);
frame.setVisible(true);

}

}

drop me 最小サンプル 2008/08/15
2008/08/16

Javaです。

画面パネルにファイルをドラッグして処理するためのサンプルです。
JComponentにsetTransferHandlerがあります。
それにjavax.swing.TransferHandlerを設定します。

まず、importできるか確認して、オッケーなら、importDataが呼ばれます。
TransferSupportはjava6からのようですね。

参考
「Java SE 6完全攻略」第31回 Swingでのドラッグ&ドロップ その3:ITpro


import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.TransferHandler;

public class DropMe {

public static void main(String[] args) {

JFrame frame = new JFrame();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel panel = new JPanel();
panel.setTransferHandler(new TransferHandler() {

private static final long serialVersionUID = 1L;

@Override
public boolean canImport(TransferSupport support) {
System.out.println("*** canImport");
return true;
}

@Override
public boolean importData(TransferSupport support) {
System.out.println("*** importData");
return super.importData(support);
}

});

frame.getContentPane().add(panel);
frame.setVisible(true);

}

}

SwingWorkerメモ isEventDispatchThread 2008/08/13

java6から含まれるようになったSwingWorkerです。

実行すると、
doInBackgroundはisEventDispatchThread:falseです。
doneはisEventDispatchThread:trueです。

doneから直接画面のコンポーネントを触ってもオッケーかな。

参考
SwingWorkerを使った処理の中断と進捗状況表示 - Java Swing Tips

含まれているかどうか 2008/08/12

Javaです。


final static Pattern pattern = Pattern.compile("[,|\\n|\"]");


任意の文字列に含まれているかどうかをみるときは、
これを使うときは、matches()ではなく、find()を使うこと。

matches()は、
領域全体をこのパターンとマッチします。


find()は、
入力シーケンスからこのパターンとマッチする次の部分シーケンスを検索します。


Orz....

jpegの圧縮後の画像 2008/08/10

Javaです。
画像のファイルサイズを小さくする方法は、実際の画像のサイズを小さくして保存するか、圧縮率を高くして保存するかだと思います。

圧縮率を調整してその結果画像を表示する簡単なアプリです。



左側のパネルに画像をドラッグアンドドロップします。スライダーで圧縮率を調整します。その結果が右パネルに表示されます。

swingxのライブラリを使っています。swingxのorg.jdesktop.swingx.JXImageViewは、ドラッグアンドドロップした画像を変換して表示してくれるコンポーネントです。便利です。


あと、
を使ってます。
swingworkerがjava6から含まれてますが、とりあえずjava5で。

画面はnetbeans6で作りました。あと、作った画面にあいたコンポーネントのフィールド変数をpublicにしてfinalにして外から直で触るという方法をとってます。

以下コード。

package img;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Iterator;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import org.jdesktop.swingworker.SwingWorker;

public class Main {

public static void main(String[] args) {

final Frame frame = new Frame();


frame.panelControl.slider.addChangeListener(new ChangeListener() {

public void stateChanged(ChangeEvent e) {
// System.out.println(e);
JSlider source = (JSlider) e.getSource();
if (!source.getValueIsAdjusting()) {

final float f = (int) source.getValue() / 100f;
final BufferedImage bufferedImage = (BufferedImage) frame.panelControl.imageView
.getImage();
if (bufferedImage == null)
return;

source.setEnabled(false);
frame.panelControl.imageView.setEditable(false);

new SwingWorker<String, String>() {


byte[] bs;

@Override
protected String doInBackground() throws Exception {

bs = a(bufferedImage, f);

return null;
}

@Override
protected void done() {
System.out.println("*** done");
frame.panelControl.slider.setEnabled(true);
frame.panelControl.imageView.setEditable(true);

if (bs == null)
return;

try {

BufferedImage image = ImageIO
.read(new ByteArrayInputStream(bs));
frame.panelControl.imagePanel2.setImage(image);

} catch (IOException e) {
e.printStackTrace();
return;
}
String result;
result = (bs.length / 1024d) + "";
frame.panelControl.textInfo.setText("" + result
+ "Kbyte");

}

}.execute();

}

}
});

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(100, 100, 300, 500);
frame.setVisible(true);

}

static byte[] a(BufferedImage image, float compress) {
return image(image, compress);
}

static byte[] image(BufferedImage image, float compress) {
Iterator<ImageWriter> wfiles = ImageIO
.getImageWritersByFormatName("jpg");

byte[] bs = new byte[0];
if (wfiles.hasNext()) {
ImageWriter imageWriter = wfiles.next();

try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageOutputStream sto = ImageIO
.createImageOutputStream(byteArrayOutputStream);
imageWriter.setOutput(sto);

ImageWriteParam param = imageWriter.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(compress);

imageWriter.write(null, new IIOImage(image, null, null), param);
imageWriter.dispose();

bs = (byteArrayOutputStream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}

}
return bs;
}
}

/*
* PanelControl.java
*
* Created on 2008/08/10, 18:16
*/

package img;

/**
*
* @author nakawakashigeto
*/
public class PanelControl extends javax.swing.JPanel {

/** Creates new form PanelControl */
public PanelControl() {
initComponents();
}

/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {

jScrollPane1 = new javax.swing.JScrollPane();

setName("Form"); // NOI18N

slider.setMajorTickSpacing(5);
slider.setPaintLabels(true);
slider.setPaintTicks(true);
slider.setValue(85);
slider.setName("slider"); // NOI18N

imageView.setName("imageView"); // NOI18N

org.jdesktop.layout.GroupLayout imageViewLayout = new org.jdesktop.layout.GroupLayout(imageView);
imageView.setLayout(imageViewLayout);
imageViewLayout.setHorizontalGroup(
imageViewLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 211, Short.MAX_VALUE)
);
imageViewLayout.setVerticalGroup(
imageViewLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 184, Short.MAX_VALUE)
);

jScrollPane1.setName("jScrollPane1"); // NOI18N

textInfo.setColumns(20);
textInfo.setRows(5);
textInfo.setName("textInfo"); // NOI18N
jScrollPane1.setViewportView(textInfo);

imagePanel2.setName("imagePanel2"); // NOI18N

org.jdesktop.layout.GroupLayout imagePanel2Layout = new org.jdesktop.layout.GroupLayout(imagePanel2);
imagePanel2.setLayout(imagePanel2Layout);
imagePanel2Layout.setHorizontalGroup(
imagePanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 199, Short.MAX_VALUE)
);
imagePanel2Layout.setVerticalGroup(
imagePanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 184, Short.MAX_VALUE)
);

org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 448, Short.MAX_VALUE)
.add(slider, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 448, Short.MAX_VALUE)
.add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
.add(imageView, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(18, 18, 18)
.add(imagePanel2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())))
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(imageView, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(imagePanel2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(slider, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 54, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
}// </editor-fold>//GEN-END:initComponents


// Variables declaration - do not modify//GEN-BEGIN:variables
public final org.jdesktop.swingx.JXImageView imagePanel2 = new org.jdesktop.swingx.JXImageView();
public final org.jdesktop.swingx.JXImageView imageView = new org.jdesktop.swingx.JXImageView();
private javax.swing.JScrollPane jScrollPane1;
public final javax.swing.JSlider slider = new javax.swing.JSlider();
public final javax.swing.JTextArea textInfo = new javax.swing.JTextArea();
// End of variables declaration//GEN-END:variables

}


/*
* Frame.java
*
* Created on 2008/08/10, 19:42
*/

package img;

/**
*
* @author nakawakashigeto
*/
public class Frame extends javax.swing.JFrame {

/** Creates new form Frame */
public Frame() {
initComponents();
}

/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setName("Form"); // NOI18N

panelControl.setName("panelControl"); // NOI18N

org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, panelControl, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 420, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(panelControl, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 303, Short.MAX_VALUE)
);

pack();
}// </editor-fold>//GEN-END:initComponents

/**
* @param args the command line arguments
*/

public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Frame().setVisible(true);
}
});
}

// Variables declaration - do not modify//GEN-BEGIN:variables
public final img.PanelControl panelControl = new img.PanelControl();
// End of variables declaration//GEN-END:variables

}