Swing

SwingSet3

知らない間に出ていた。結構変更されているが、何かこう「まじめ」になったな。 SwingSet3(Java WebStart JNLP) 最新のJava SE 6 Update N Early AccessのSDKをインストールしても入っているらしい。

JTableのセルエディタ/レンダラのコンポーネントは共有できない

なお、ComboBoxCellRendererはJComboBoxを継承しているので、そのままDefaultCellEditorのコンストラクタに指定することで、セルエディタとレンダラでGUIコンポーネントを共有することもできる。 JTableのセルエディタ/レンダラとBeansBinding 実際に行って…

JTableのセルエディタ/レンダラとBeansBinding

JTableは比較的簡単にセルを描画するセルレンダラ、セルを編集するセルエディタを追加することができる。 その中でも特に簡単なのは、カラムの型に合わせて使いたいセルエディタ/レンダラをJTableに登録する方法だ。 例えば、List型の値を編集するセルエディ…

BeansBindingとDxO

BeansBindingはJavaBeans間であれば、型が違うプロパティもバインドすることができる。その際に基本的な型の変換は自動的に行ってくれるが、それ以外はプロパティの型を変換するためのコンバータを設定する必要がある。 Binding binding = Bindings.createAu…

BeansbindingとDTO

Beansbindingをいろいろと触っている。 このライブラリィだが、下記の.NETのデータバインドのように、 GUIControl | | | | GUIControl | BindingSource || DataSource | GUIControl | | | | 間にBindingSourceを仲介してデータソース・オブジェクトとGUIコン…

Java SE 6 Update N build 12

アップデート後、SwingWorker#doInBackground()メソッドの起動に結構目立つ遅延が入るようになった。 スレッド周りで何か変わった模様。

既存のクラスの .form ファイルを生成できますか?

できません。 既存のクラスの .form ファイルを生成できますか? - 日本語 NetBeans ユーザー FAQ ということはNetBeans(Matisse)で編集したJFrameクラスを他のIDEに持っていくことはできても、他のIDEで編集したそれをNetBeansで取り込むことはできない、と…

とは言うものの

NetBeans6のプロジェクトウィザードから生成したSwingのデスクトップ(C.R.U.D)アプリケーションは Java Persistent API Java Beans Binding (JSR-295) Swing Application Framework (JSR-296) これらを組み合わせて作られている本格的なデータバインディング…

HttpURLConnectionとCookieサポートのちぐはぐさ

以前のエントリで、Java6では永続Cookieの読み書きサポートが追加されたと書いたが、これはあくまでJava Plugin環境又はJava Web Start環境での話であり、一般的なSwingアプリケーションでは以下のコードのようにデフォルトのCookieManagerを生成して取得で…

HTTPによるサーバ上のDBとの同期

判り難いタイトルを変えた。 .NETではDataSetをDiffgramでサーバに送信できたように、DBのテーブルのイメージ、それも更新ログを含めたイメージをHTTPを介して表現できるプロトコルってJavaではなにが使えるんだろう。 JSDK上で似たものを探すとなるとRowSet…

コンポーネントをフォーカス遷移順に並べる

バリデーションネタ。 JFlame上のGUIコンポーネントに関してバリデーションを実施する場合、以下の2通りで実施する必要がある。 個々のGUIに対して行うバリデーション JFlame上の全てのGUIに対して行うバリデーション 前者はフォーカスの遷移やキーストロー…

JTable - セルレンダラに依存せずセルの色設定を行う

JTableはセルの描画の諸元をテーブルセルレンダラ(以降セルレンダラ)に任せており、通常はJTableに設定されたテーブルモデル(AbstractTableModel)が扱う型によって内部でデフォルトのセルレンダラが使用される。よって、セルの描画をカスタマイズする場合の…

UIDefaults

自分でGUIを設定、描画する際、例えば色を設定する場合はその絶対値を指定してしまうとルックアンドフィールの変更に対応できなくなってしまうので、UIManagerを通して取得したシステム値(というか、スタイル/テーマといった方が解りやすいか)値をセットして…

TableCellEditorのバリデーションとイベント

例えばJTextFieldやJComboBox等の文字列を入力することのできるコンポーネントの場合であれば、バリデーションを実施するのはフォーカスの遷移時と、データがキーボード等で入力される時である。それぞれ、FocusListener、KeyListenerのイベント通知か、Docu…

JTableとオリジン

JTableのセル座標系のAPIは(行、列)であり(Row, Col)となる。Microsoft系は伝統的に(Col, Row)なので、判っていても混乱する。 まあ慣れの問題なのだが、何故差異が出るのだろう。ベクトルなら{行:列}であり、そこからきているのか? でも表ならば「列:行」だ…

IMEで変換中の文字か否かを判断する

GUIにおいて入力可能なコンポーネントで桁数制限をかけたり、桁数到達を判定したり、クリップボードからの文字貼付けを監視したりするのは常套の実装であり、C#ではKeyPressイベントの捕捉とネィティブウインドウによる特定のメッセージ捕捉で実現していた。…

Nimbus Look-and Feel

Java SE 6 Update N(元のConsumer JREプロジェクト)で導入される新しいルックアンドフィールである"Nimbus"を試してみた。 Nimbus - A New Look-and-Feel for Swing以下、アプリケーションのルックアンドフィールを "Windows" -> "Metal" -> "Nimbus"と変え…

ClientProperty

最近は文句ばかり書いているが別にSwingの全てが気に入らないわけではない。完成度が高いだけに、設計の古さや、複雑さなどのちょっとした所が気になるのだ。例えばJComponentクラスのClientPropertyが何気に便利だ。これは内部に持っているテーブル(正確に…

We are the Robot

JavaにはRobotクラスというキーボードやマウスオペレーションを人間の代わりに実行してくれるクラスがある。本来はテストの自動化のために用意されたらしいのだが、非常に便利なのでそれだけの用途では勿体無い。例えばWindowsのクリップボード操作(切り取り…

PaintListenerは何故用意されていないんだ

ウォータマークやコピーライトの描画処理のために、共通の描画をGUIの再描画処理に挿し込みたい。.NET WindowFormsコントロールの場合であればこれは簡単でPaintイベントデリゲートにコードをアタッチすれば良いのだが、Swingにはこれに相当するものが無い。…

ボタンのフォーカス遷移を循環させる

意外に簡単に出来てしまったので、逆に忘れないようにメモ。 Windowsでは上のようにパネルなどのダイアログやパネル等のコンテナの上にボタンが複数載っている構成では、上下左右の矢印キーでボタンのフォーカスをサイクルできるようになっている。(通常の遷…

MenuElementインタフェースによる階層には注意

このようにメニュー階層が定義されている場合、考えるコードとオブジェクトの階層は コード JMenuBar menuBar = new JMenuBar(); JMenu menuA = new JMenu("A"); menuA.add(new MenuItem("A_1")); menuA.add(new MenuItem("A_2")); menuA.add(new MenuItem("…

ブロッカ後日談とWindowsの作法

昨日アップしたBlockerだが、ブロック時にJOptionPane等でTopMostにダイアログを表示するとダイアログ上のキーボード入力も出来なくなってしまうことに気がついた。 ダイアログを表示する場合にはBlockerを使わないか、又はダイアログの表示時のみはガードし…

GlassPaneとブロッカ

GlassPaneとはSwingのフレーム上を構成するいくつかのペイン(レイヤ)のうち、一番上部にあるペインを指す。ここは名前通り「ガラス区画」と呼ばれており、デフォルトの実装では不可視のパネルとして実装されている。How to Use Root Panes - The Java Tutori…

Swingとスレッドと再描画

.NET WindowFormsのプログラマがSwingのアプリケーションを書く際に嵌る原因はいろいろあると思うが、その中でも一番は表題にもあるようにちょっとしたことで画面の再描画が止まってしまうことではないだろうか。 Swingの場合、GUIの基本的な処理が実行され…

JFC(Swing)と負の遺産(その2)

前回のエントリではSwingのイベント処理に関して、任意のコードを任意のイベントにアタッチするには 1.イベント(イベントID)に合わせたリスナオブジェクトを生成しなくてはならない 2.生成したリスナオブジェクトに合わせたリスナ登録メソッドを実行しなくて…

JFC(Swing)と負の遺産

Java、それもSwingのイベント周りはアクション、イベント、アクションリスナを使ったオーソドックスなオブザーバパターンのモデルであり、リスナの記述を匿名クラス(無名クラス)でクロージャ的に記述できるのと相まって、それ自体はOOP的で好きなのだが、い…

継続こそ力

11月から始めたSwingアプリケーション向けフレームワークの実装、DIコンテナの実装が完了したのは日記で報告したが、そもそもの目標であった「年内で画面を表示する所まで辿り着く」にぎりぎり到達できそうだ。といってもDIコンテナで必要なクラスのインスタ…

アノテーションを使って、GUIコンポーネントのTabOrderを設定する

今年最後のJavaネタ。最初にSwingでGUIアプリケーションを書く場合に一番面食らったのが「タブオーダを設定するための方法が無い」ということだった。 その後のGUIビルダの殆どが影響を受けたVisual Basicファミリの伝統であり、GUIコンポーネント(コントロ…

GroupLayoutの難解さ

J2SE6で導入されたSwingの新しいレイアウトマネジャであるGroupLayoutクラスだが、そもそもIDEから自動生成されることを前提にしているのか、単に私の読解能力が低いのか、いろいろな所で散見される解説を読んでもさっぱり解った気がしない。クラス GroupLay…