Java AWT 描画処理 まとめ

paintメソッド以外からの描画


ボタンクリックやマウスクリックなどpaintメソッド以外からの描画処理を行います。

下記のコードはマウスクリックした座標に円を描画します。
GraphicsインスタンスはコンポーネントのgetGraphicsメソッドで取得します。
getGraphicsメソッドで取得したGraphicsインスタンスは、使用後disposeします。

package graphicsSample;

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class GraphicSample03 extends Frame{

private static final long serialVersionUID = 1L;

public static void main(String args[]){
new GraphicSample03();
}

public GraphicSample03(){
this.setTitle("GraphicSample03");
this.setSize(300,300);
this.addMouseListener(new MyMouseAdapter());
this.setVisible(true);
}

private class MyMouseAdapter extends MouseAdapter{

public void mouseClicked(MouseEvent arg0) {
Graphics g = getGraphics();
try{
g.setColor(Color.darkGray);
g.drawOval(arg0.getX(), arg0.getY(), 50, 50);
}finally{
g.dispose();
}

}
} 

}






しかし、画面をリサイズすると描画が消えてしまいます。

ダブルバッファリングを利用して画面をリサイズしても描画が消えないようにする


対応策としてよく用いられているのが「ダブルバッファリング」です。
これは描画処理用のイメージ領域を別に作成し、まず必要な描画を全てそのイメージ領域に行っておいてから、最後にイメージ領域をフレームにまとめて描画します。

まずイメージ領域をインスタンスフィールドに用意します。
マウスクリックではこのイメージ領域に描画を行います。
paintメソッドでそのイメージ領域を描画します。

リサイズされるとpaintメソッドが実行されイメージ領域から再描画されます。
package graphicsSample;

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class GraphicSample04 extends Frame{

private static final long serialVersionUID = 1L;

public static void main(String args[]){
new GraphicSample04();
}

//バッファ用イメージ
Image Img = null;

public GraphicSample04(){
this.setTitle("GraphicSample04");
this.setSize(300,300);
this.addMouseListener(new MyMouseAdapter());  
this.setVisible(true);
}

public void paint(Graphics g) {
//バッファ用イメージとグラフィックを作成します。
//コンストラクタではcreateImageインスタンスを作成できないのでココで初期化する。
if (Img == null){
Img = this.createImage(this.getWidth(),this.getHeight());
}
//イメージを描画します。
g.drawImage(Img,0,0,this);
}

private class MyMouseAdapter extends MouseAdapter{
public void mouseClicked(MouseEvent arg0) {
//バッファ用イメージに描画
Img.getGraphics().setColor(Color.darkGray);
Img.getGraphics().drawOval(arg0.getX(), arg0.getY(), 50, 50);
//paintを呼び出します。
repaint();
}
}
}



これで画面をリサイズしても描画は消えません。

しかし、画面を大きくしても描画領域は大きくならないため、大きくなった部分をマウスクリックしても円が描画されません。

画面のサイズに合わせて描画領域を変更する


componentResizedイベントで画面サイズに合わせて描画領域を変更します。
package graphicsSample;

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;


public class GraphicSample05 extends Frame{

private static final long serialVersionUID = 1L;

public static void main(String args[]){
new GraphicSample05();
}

//バッファ用イメージ
Image backImg = null;
//バッファ用グラフィック
//Graphics backGraphic =null;

public GraphicSample05(){
this.setTitle("GraphicSample05");
this.setSize(300,300);
this.addMouseListener(new MyMouseAdapter());
this.addComponentListener(new MyComponentListener());
this.setVisible(true);
}

public void paint(Graphics g) {
//バッファ用イメージとグラフィックを作成します。
//コンストラクタではcreateImage、getGraphicsインスタンスを作成できないのでココで初期化する。
if (backImg == null){
backImg = this.createImage(this.getWidth(),this.getHeight());
//backGraphic = backImg.getGraphics();
}
//ブッファイメージを描画します。
g.drawImage(backImg,0,0,this);
}

private class MyMouseAdapter extends MouseAdapter{
public void mouseClicked(MouseEvent arg0) {
//ブッファ用イメージに描画
//backGraphic.setColor(Color.darkGray);
//backGraphic.drawOval(arg0.getX(), arg0.getY(), 50, 50);
backImg.getGraphics().setColor(Color.darkGray);
backImg.getGraphics().drawOval(arg0.getX(), arg0.getY(), 50, 50);
//paintを呼び出します。
repaint();
}
}

private class MyComponentListener extends ComponentAdapter{
public void componentResized(ComponentEvent arg0) {
//リサイズ後の現在サイズを取得します
Rectangle rec = getBounds(); 
//イメージのサイズより現在のサイズが大きい場合
if ((backImg.getWidth(null) <= rec.width ) | (backImg.getHeight(null) <= rec.height)){
//新たなイメージを作ります。
Image newImg = createImage(rec.width, rec.height);
//新たなイメージに古いイメージを描画します。
newImg.getGraphics().drawImage(backImg, 0, 0, null);
//新たなイメージをインスタンス変数に保存します。
backImg = newImg;
}
}
}
}

Java クラス名を変更するには

名前を変えたいクラスを選択し
eclipseの「りファクタリング」メニューの「名前の変更」を選択します。


やっとクラス名を変える方法がわかった・・・

javaよりeclipseの使い方を習得する方がしんどいよ~。・゚・(ノД`)・゚・。

Java AWT 実行ファイルに埋めこれたリソースファイルから画像を表示する

画像やテキストファイルを実行ファイルに埋め込むにはで埋め込んだ画像ファイルを表示します。


ClassクラスのgetResouceメソッドを使用しリソースファイルのURLインスタンスを取得します。
ComponentクラスのcreateImageメソッドを使用し、URLインスタンスからImageインスタンスを作成します。

そしてFrameクラスのpaintメソッドで作成したImageインスタンスを描画します。

package graphicsSample;

import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.ImageProducer;
import java.net.URL;

public class GraphicSample02 extends Frame{

private static final long serialVersionUID = 1L;

public static void main(String args[]){
new GraphicSample02();
}

Image img = null;

public GraphicSample02(){
this.setTitle("GraphicSample02");
this.setSize(500,500);

//リソースよりイメージ画像を取得します。
URL url = this.getClass().getResource("Sample1.jpg");
try{
img = this.createImage((ImageProducer)url.getContent());
}catch(Exception ex){}


this.setVisible(true);
}

public void paint(Graphics g) {
//イメージ画像を描画します。
g.drawImage(img,50,50,this);
}

}

Java 画像やテキストファイルを実行ファイルに埋め込むには

画像やテキストファイル(リソースファイル)を実行ファイルに埋め込むには
パッケージエクスプローラでパッケージを選択し、「ファイル」メニューの「インポート」を選択します。
起動した画面で「一般」ノードの「ファイルシステム」を選択して次へをクリックします。



参照ボタンをクリックし、画像ファイルのあるフォルダを選択します。
フォルダ内のファイルの一覧が表示されるので、埋め込むファイルを選択します。



パッケージエクスプローラでファイルが追加されていることを確認します。

雑記 ツレがリストラにあいまして

うちのツレ(夫)が3月末で会社をリストラされました。
ツレは39歳。IT系で組み込み一筋です。
高スキルも高学歴もありませんw

この大不況でIT業界でも組み込み系は特に厳しいようです。
転職活動も厳しく社員数15名の会社で1名の採用枠に対し応募者は50名を超えるそうです。
履歴書を送り求人に応募するも、予想外の応募者に処理しきれず書類選考に1か月かかった会社もありました。
転職サイトに公開されたらすぐに応募しないと、後半は書類すら見てもらえない可能性もあります。

ツレの転職活動は3か月間。7月から就職先が決まりました。
転職サイトから応募した会社は20社。
うち2社の面接をし、そのうち1社に採用していただきました。
あとはいつもお世話になっている知り合いの社長からの紹介で2社の面接をしました。
採用して頂いた会社からはスキルや経歴より、何かビビビと感じるものがあったから採用したと言われたそうです(*´∀`*)アッタカーイ

本当の所は20社程度の応募で決まるとは思わなかったです。
100社ぐらい応募しないとダメなんじゃないかと。
実際ツレにも100社まであきらめずに応募しろと言ってましたし。

しかし、今回リストラされて本当にラッキーでした。
不況で厳しい組み込み業界の中、3次受け、4次受けで偽装請負や多重派遣だけで成り立っているような会社は、採用を控えているでしょう。
今求人を出している会社は不況でフィルタされ優良企業である可能性が高いです。
ツレも給料こそ下がったものの、久しぶりに底辺から抜け出せたようです。

その上、ツレも私も今回のリストラは自分自身を見直す良い機会になりました。
最近モチベーションが下がり気味だった私も、新たな目標を設定しモチベーションが復活しましたし、
ツレも色々反省しなければいけない点に気づいてくれたようです。

ここまでは新しい就職先が決まったから言えるキレイ言ですが。
実際の転職活動はやはり精神的にしんどかったです。




今回はそんなツレが吐いた名言集をご紹介。



俺の人格を全否定する気か!!


( ̄д ̄) つまんない。想定の範囲内。













本を読むのは嫌いなんだよ!!



Σ(´∀`;) おまえは小学生か!!











おまえは俺を鬱にさせる気か!!



.∵・(゚ε゚ )ブッ!!
「親父にもブタレタ事ないのにぃ!」と被って面白かった。
プロポーズの言葉はわすれたけれど、これは一生覚えてると思うwww







ツレより優秀な人たちはたくさんいると思います。
転職活動は「あせらず、あわてず、あきらめず!」

.NET(Mobile) SIPパネルを切り替えるには

Touch Diamond (X04HT)のSIPはデフォルトで以下の5種類があります。
・10キー
・ひらがな/カタカナ
・ローマ字/かな
・手書き入力
・手書き検索

このSIPパネルを切り替えます。
方法は2つあります。

Microsoft.WindowsCE.Forms.InputMethodクラスを使用する方法です。
フォームにInputPanelを配置し、以下のコードを実行する。
Public Class Form1

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim im As Microsoft.WindowsCE.Forms.InputMethod
For Each im In Me.InputPanel1.InputMethods
Me.ListBox1.Items.Add(im.Name)
Next im

End Sub

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles ListBox1.SelectedIndexChanged
Dim strIM As String
strIM = ListBox1.SelectedItem.ToString()

Dim im As Microsoft.WindowsCE.Forms.InputMethod
For Each im In Me.InputPanel1.InputMethods
If im.Name = strIM Then
InputPanel1.CurrentInputMethod = im
End If
Next im
End Sub

End Class


こちらはAPI「SipSetCurrentIM」を使用します。
フォームにInputPanelを配置する必要はありません。
Imports System.Runtime.InteropServices

Public Class Form1

Private _InputMethod As New Dictionary(Of String, Guid)

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
For Each im As Microsoft.WindowsCE.Forms.InputMethod In Me.InputPanel1.InputMethods
_InputMethod.Add(im.Name, im.Clsid)
Me.ListBox1.Items.Add(im.Name)
Next im
End Sub

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles ListBox1.SelectedIndexChanged
Dim strIM As String = ListBox1.SelectedItem.ToString()
Dim guid As Guid = Me._InputMethod(strIM)

SipSetCurrentIM(guid.ToByteArray)
End Sub

 _
Private Shared Function SipSetCurrentIM(ByVal clsid As Byte()) As Boolean
End Function

End Class

.NET(Mobile) Touch Diamond (X04HT)のデフォルト10キーSIPの入力モードを切り替える

Touch Diamond (X04HT)のデフォルト10キーSIPの入力モードを切り替えるには
レジストリ「HKEY_CURRENT_USER\Software\Keytouch\Multiplay」の値を操作します。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
SetKey10InputMode(CType(Me.ComboBox1.SelectedIndex, Key10ModeType))
End Sub

Public Enum Key10ModeType
NumHalf = 0
NumFull = 1
AlphaHalf = 2
AlphaFull = 3
Hiragana = 4
KatakanaHalf = 5
KatakanaFull = 6
End Enum

Private Sub SetKey10InputMode(ByVal mode As Key10ModeType)
Dim sReg As String = "HKEY_CURRENT_USER\Software\Keytouch\Multiplay"

Select Case mode
Case Key10ModeType.NumHalf
Microsoft.Win32.Registry.SetValue(sReg, "ShiftModeEx", 9)
Microsoft.Win32.Registry.SetValue(sReg, "ShiftMode", 8)
Microsoft.Win32.Registry.SetValue(sReg, "ActiveIME", 1)
Microsoft.Win32.Registry.SetValue(sReg, "NumericMode", 0)
Microsoft.Win32.Registry.SetValue(sReg, "PasswordMode", 0)

Case Key10ModeType.NumFull
Microsoft.Win32.Registry.SetValue(sReg, "ShiftModeEx", 8)
Microsoft.Win32.Registry.SetValue(sReg, "ShiftMode", 7)
Microsoft.Win32.Registry.SetValue(sReg, "ActiveIME", 1)
Microsoft.Win32.Registry.SetValue(sReg, "NumericMode", 0)
Microsoft.Win32.Registry.SetValue(sReg, "PasswordMode", 0)

Case Key10ModeType.AlphaHalf
Microsoft.Win32.Registry.SetValue(sReg, "ShiftModeEx", 7)
Microsoft.Win32.Registry.SetValue(sReg, "ShiftMode", 6)
Microsoft.Win32.Registry.SetValue(sReg, "ActiveIME", 1)
Microsoft.Win32.Registry.SetValue(sReg, "NumericMode", 0)
Microsoft.Win32.Registry.SetValue(sReg, "PasswordMode", 0)


Case Key10ModeType.AlphaFull
Microsoft.Win32.Registry.SetValue(sReg, "ShiftModeEx", 6)
Microsoft.Win32.Registry.SetValue(sReg, "ShiftMode", 5)
Microsoft.Win32.Registry.SetValue(sReg, "ActiveIME", 1)
Microsoft.Win32.Registry.SetValue(sReg, "NumericMode", 0)
Microsoft.Win32.Registry.SetValue(sReg, "PasswordMode", 0)

Case Key10ModeType.Hiragana
Microsoft.Win32.Registry.SetValue(sReg, "ShiftModeEx", 0)
Microsoft.Win32.Registry.SetValue(sReg, "ShiftMode", 0)
Microsoft.Win32.Registry.SetValue(sReg, "ActiveIME", 202)
Microsoft.Win32.Registry.SetValue(sReg, "NumericMode", 0)
Microsoft.Win32.Registry.SetValue(sReg, "PasswordMode", 0)

Case Key10ModeType.KatakanaHalf
Microsoft.Win32.Registry.SetValue(sReg, "ShiftModeEx", 3)
Microsoft.Win32.Registry.SetValue(sReg, "ShiftMode", 2)
Microsoft.Win32.Registry.SetValue(sReg, "ActiveIME", 202)
Microsoft.Win32.Registry.SetValue(sReg, "NumericMode", 0)
Microsoft.Win32.Registry.SetValue(sReg, "PasswordMode", 0)

Case Key10ModeType.KatakanaFull
Microsoft.Win32.Registry.SetValue(sReg, "ShiftModeEx", 2)
Microsoft.Win32.Registry.SetValue(sReg, "ShiftMode", 1)
Microsoft.Win32.Registry.SetValue(sReg, "ActiveIME", 202)
Microsoft.Win32.Registry.SetValue(sReg, "NumericMode", 0)
Microsoft.Win32.Registry.SetValue(sReg, "PasswordMode", 0)

End Select
End Sub



ちなみに

W-ZERO3[es]本体表面の10キーを制御するのは
レジストリ「HKEY_CURRENT_USER\Software\Sharp\PhoneStatus」を操作します。

DT5200は本体表面の10キーを制御するのは
カシオのAPI「Calib.SystemLibNet.Api.SysSetInputMode」を使用します。
CASIOシステムライブラリマニュアル

モバイルのレジストリはVisualStudioの付属ツール「リモートレジストリエディタ」で見ることができます。