約 2,879,071 件
https://w.atwiki.jp/dmsb/pages/16.html
Javaソート豆知識 投稿者 K.M 日付 2007-09-26 23 57 下記Gさんの過去メールを抜粋 お疲れ様です、Gです。 こっちはその2です。 今度は少し難易度が上がります。その分、使用頻度も減ります。 いつも大変お世話になっております。 Gです。 使い慣れると意外と手軽なJavaソート。 昔は自分でソートアルゴリズム書いてましたよ。 (大学で習った講義の中で社会に出てから、一番役に立ったのはアルゴリズムだな~。まともに聞いてなかったけど) ま、そんなJavaソートですが、漢字を含んだ文字列は文字コード順、 オラクルSQLのORDERBY句によるソートは音読み順となってソートが行われるようです。 例:文字配列 "0","世","中\","1" があった場合、 オラクルのORDERBY句 "0","1","世","中\" javaソート "0","1","中\","世" となってしまいます。 これは文字コードソートの仕様だそうで、回避方針は調べた限り見つかりませんでした。 (ちなみに↑の例にてエクセル2003でデータの並び替えを行った場合Javaソートと同じ結果となりました) 漢字のソートを行いたい場合、SQLのソートを利用する 又は、文字コード順によるソートとなる事を事前に確認することが必要なようです。 ちなみに、ソートが食い違うのは漢字のみで英数や平仮名カタカナのソートは文字コードの関係上、なんとかなるかもしれません。 (一応正規表現とほぼ同じ順序で並んでるので) 参考サイト http //www.asahi-net.or.jp/~DP8T-ASM/java/tips/I18NStringCollation.html http //otndnld.oracle.co.jp/products/database/oracle10g/application_development/pdf/TWP_Sorting_10gR1.pdf http //otndnld.oracle.co.jp/products/database/oracle10g/application_development/pdf/BWP_Power_of_Globalization_Technology_10gR2.pdf 以上、情報共有でした。 客先からよく来るんですよね、この要望。 ソートを行うときSQLだとおっそいから、DBアクセスしないようにしてくれ。とかそんなんが。 その場合、文字コード順になりますよ。と一言、釘を刺しておきましょう。
https://w.atwiki.jp/ce00582/pages/2496.html
class ron{ public static void saw() { double a,b; a=4; b=5; System.out.println(a+b); } } class java0803{ public static void main(String [] args) { ron.saw(); } }
https://w.atwiki.jp/ce00582/pages/1018.html
import java.awt.*; import java.awt.event.*; public class javadsge02 extends Frame{ public static void main(String[] args) { javadsge02 f = new javadsge02(); f.setSize(500, 500); f.setVisible(true); f.addWindowListener(new Adap()); } public void paint(Graphics g) { int s; int x[]=new int[101]; double y[]=new double[101]; int z[]=new int[101]; dsge fun=new dsge(); y=fun.pro2(); for (s=1;s 100;s++){ x[s]=5*s; z[s]=(int)(500-100*y[s]); } for (s=1;s 99;s++){ g.drawLine(x[s],z[s],x[s+1], z[s+1]); } } } class Adap extends WindowAdapter { public void windowClosing(WindowEvent e){ System.exit(0); } } class dsge{ public double[] pro2(){ double a; double beta; double ks; double h; double k[]=new double[101]; double cx[][]=new double[11][101]; double cp[][]=new double[11][101]; double th[]=new double[11]; double k1; double n1; int n2; int n3; int n; double c1; double r1; double ep; int m; int mx; int t; double uc; double kt[]=new double[101]; double ct[]=new double[101]; a=0.33; beta=0.95; ks=Math.pow((1 / beta - 1) / a , 1 / (a - 1)); h=2*ks/100; for (m=1;m 11;m++){ th[m]=1+0.01*m; } for (n=1;n 101;n++){ k[n]=n*h; } for (m=1;m 11;m++){ for (n=1;n 101;n++){ cx[m][n]=th[m]*Math.pow(k[n],a); } } t=0; while(t 100){ for (m=1;m 11;m++){ for (n=10;n 91;n++){ k1=k[n]+th[m]*Math.pow(k[n],a)-cx[m][n]; n1=k1/h; n2=(int)n1; n3=n2+1; uc=0; for (mx=1;mx 11;mx++){ c1=cx[mx][n2]+(n1-n2)*(cx[mx][n3]-cx[mx][n2]); r1=th[mx]*a*Math.pow(k1,a-1); uc=uc+(beta*(1+r1))/c1; } uc=0.1*uc; cp[m][n]=1/uc; } } ep=0; for (m=1;m 11;m++){ for (n=10;n 91;n++){ ep=ep+Math.pow(cx[m][n]-cp[m][n],2); } } for (m=1;m 11;m++){ for (n=10;n 91;n++){ cx[m][n]=cp[m][n]; } } if (ep 0.0001){ t=1000; } t=t+1; } kt[1]=k[45]; for (t=1;t 100;t++){ m=(int)(Math.random()*10)+1; n1=kt[t]/h; n2=(int)n1; n3=n2+1; ct[t]=cx[m][n2]+(n1-n2)*(cx[m][n3]-cx[m][n2]); kt[t+1]=kt[t]+th[m]*Math.pow(kt[t],a)-ct[t]; } return ct; } }
https://w.atwiki.jp/fujiyan/pages/45.html
参考サイト JavaScript - MDN 檜山正幸のキマイラ飼育記 - プログラマのためのJavaScript 時代はJavaScript Functionオブジェクトあれこれ JavaScriptでクラスもどき
https://w.atwiki.jp/aias-jsstyleguide2/pages/15.html
JavaScriptのスタイルに関するルール 各項目の左側にある三角ボタンで、詳細情報の表示・非表示を切り替えられます。また下のボタンを使うと全項目を一度に変更することができます。 全て切り替える 命名規則 原則として、関数はfunctionNamesLikeThis、変数はvariableNamesLikeThis、クラスはClassNamesLikeThis、列挙型はEnumNamesLikeThis、メソッドはmethodNamesLikeThis、定数はCONSTANT_VALUES_LIKE_THIS、名前空間はfoo.namespaceNamesLikeThis.bar、ファイルはfilenameslikethis.jsのように、それぞれ命名してください。 プロパティとメソッド private なプロパティ、メソッドには名前の末尾にアンダースコアをつけてください。 protected なプロパティ、メソッドには(publicと同様に)末尾にアンダースコアをつけません。 private と protected に関するより詳しい情報は、「可視性」の項を参照してください。 メソッドと関数のパラメータ 省略可能な関数の引数は名前の先頭をopt_としてください。 関数の引数の個数が可変である場合、最後の引数名はvar_argsとすべきです。ただしコード内ではvar_argsを参照するのではなく、argumentsオブジェクトを使って下さい。 @paramアノテーションによっても、省略可能な引数や個数の変化する引数を定義できます。Compilerは変数名とアノテーションのどちらの記法も受け入れますが、両者を共に使うのが好ましいやり方です。 GetterとSetter EcmaScript5では、プロパティに対するgetterとsetterは推奨されません。もし使うのなら、getterが監視中のプロパティの状態を変更しないようにしなければなりません。 /** * 間違い -- こうしてはいけません。 */ var foo = { get next() { return this.nextId++; } }; アクセサ関数 プロパティに対するgetterとsetterは必須ではありません。ただしそれを使う場合、getterは必ずgetFoo()、setterは必ずsetFoo(value)のように命名してください。(論理値を返すgetterであれば、isFoo()としてもかまいません。たいていはその方が自然です。) 名前空間 JavaScript自体は、パッケージや名前空間の仕組みをサポートしていません。 グローバル名の衝突はデバックが難しく、また2つのプロジェクトを統合するようなケースでは、手に負えない大きな問題となる可能性もあります。JavaSriptコードの共有を可能にするには、衝突を防ぐための約束事に従う必要があります。 グローバルコードには名前空間を適用する グローバルスコープに存在するコードは 必ず 、プロジェクトやライブラリと関連付けられた一意のプリフィックスをもつ擬似的な名前空間に属しているものとします。もしプロジェクト名が "Project Sloth" であれば、擬似的な名前空間名はsloth.*とするのがよいでしょう var sloth = {}; sloth.sleep = function() { ... }; Closure LibraryやDojo Toolkitを含む多くのライブラリは、名前空間を宣言するための高位の関数が提供されています。名前空間の宣言方法には一貫性を持たせてください goog.provide( sloth ); sloth.sleep = function() { ... }; 名前空間の所有権を尊重する ある名前空間の下位の名前空間で何かをする場合は、必ず親の名前空間の所有者にそのことを知らせてください。もしあなたがslothの下にhatsを作ろうとしているのであれば、Slothチームはあなたが使うsloth.hatsのことを必ず知っていなければなりません。 外部コードと内部コードでは異なる名前空間を使う 「外部コード」とは、あなたのコードベースの外部にあり、独立してコンパイルされた全てのコードのことです。外部コードと内部コードで使われている名前は、厳格に分離されなければなりません。もしあなたがfoo.hats.*という名前で提供される外部ライブラリを使っているのなら、内部コードはfoo.hats.*にいかなるシンボルも定義してはいけません。ライブラリの提供元が新しいシンボルを定義すると、そのコードは動作しなくなるおそれがあるからです foo.require( foo.hats ); /** * 間違い -- こうしてはいけません。 * @constructor * @extends {foo.hats.RoundHat} */ foo.hats.BowlerHat = function() { }; どうしても外部コードの名前空間に新しいAPIを追加する必要がある場合は、そのAPI関数だけを明示的にエクスポートしてください。ただしそうであっても、一貫性を保ち、Compilerがより効果的に最適化を行えるようにするため、内部コードは内部の名前で内部のAPIを呼び出すようにすべきです。 foo.provide( googleyhats.BowlerHat ); foo.require( foo.hats ); /** * @constructor * @extends {foo.hats.RoundHat} */ googleyhats.BowlerHat = function() { ... }; goog.exportSymbol( foo.hats.BowlerHat , googleyhats.BowlerHat); 可読性を上げるため長い名前に別名を付ける もしそうすることで可読性が向上するなら、完全な型名に対しローカルの別名を付けましょう。ローカル名は型の一番最後の部分にマッチするようにしてください /** * @constructor */ some.long.namespace.MyClass = function() { }; /** * @param {some.long.namespace.MyClass} a */ some.long.namespace.MyClass.staticHelper = function(a) { ... }; myapp.main = function() { var MyClass = some.long.namespace.MyClass; var staticHelper = some.long.namespace.MyClass.staticHelper; staticHelper(new MyClass()); }; 名前空間にローカルの別名をつけてはいけません。名前空間への別名付けにはgoog.scopeを使いましょう。 myapp.main = function() { var namespace = some.long.namespace; namespace.MyClass.staticHelper(new namespace.MyClass()); }; プロパティが列挙型である場合を除き、別名のプロパティ(やその他のメンバ)へのアクセスは避けて下さい /** @enum {string} */ some.long.namespace.Fruit = { APPLE a , BANANA b }; myapp.main = function() { var Fruit = some.long.namespace.Fruit; switch (fruit) { case Fruit.APPLE ... case Fruit.BANANA ... } }; myapp.main = function() { var MyClass = some.long.namespace.MyClass; MyClass.staticHelper(null); }; グローバルスコープでの別名の作成は絶対にしないでください。別名は関数ブロックの中でのみ使用可能とします。 ファイル名の命名規則 大文字小文字を区別するプラットフォームで混乱が生じることを避けるため、ファイル名には小文字のみを使って下さい。ファイル名は.jsで終わらねばならず、-と_以外の区切り文字を含んではいけません(より好ましいのは_より-の方です)。 独自のtoString()メソッド 副作用なしで常に成功すること。 独自のtoString()メソッドを定義することで、オブジェクトが自分自身を文字列化(string-ify)する方法を制御できます。それ自体はよいのですが、そのときメソッドは以下の点を保証していなければなりません。(1) 常に成功すること、(2)他の部分に影響を与えないこと。この基準を満たしていない場合、容易に深刻な問題が引き起こされることでしょう。例えばtoString()メソッドが内部でassert関数を呼び出しているとします。assertは処理が失敗した場合にオブジェクト名を出力しようとしますが、その時に呼び出すのはもちろんtoString()メソッドです。 変数初期化の遅延 OK。 変数は、宣言された時点で常に初期化が可能とは限りません。従って初期化の遅延は当然ありうることです。 明示的なスコープ 常にそうしてください。 常に明示的なスコープを使用し、移植性と明瞭さを向上させてください。例えば関数を作るとき、スコープチェーンの中にwindowがあることを仮定しないでください。いつかwindowがコンテントウィンドウを指していない別のアプリケーションでそれを使いたくなるかもしれません。 コードのフォーマット 詳しい情報を見るには開いてください。 基本的な考え方は C++ formatting rules に従い、さらに以下に説明する内容が追加されます。 波括弧 セミコロンの暗黙的な挿入を考慮し、波括弧を開くときはそれまでと同じ行で始めてください。例えばこのようにします if (something) { // ... } else { // ... } 配列とオブジェクトの初期化 きれいに収まるようなら、配列やオブジェクトの初期化を1行で行ってもかまいません var arr = [1, 2, 3]; // [の後と]の前にスペースを入れないでください。 var obj = {a 1, b 2, c 3}; // {の後と}の前にスペースを入れないでください。 配列とオブジェクトの初期化が複数行にわたる場合は、ブロックと同様、括弧を変数と同じ行に置き、スペース2つ分インデントしてください // オブジェクトの初期化 var inset = { top 10, right 20, bottom 15, left 12 }; // 配列の初期化 this.rows_ = [ "Slartibartfast" fjordmaster@magrathea.com , "Zaphod Beeblebrox" theprez@universe.gov , "Ford Prefect" ford@theguide.com , "Arthur Dent" has.no.tea@gmail.com , "Marvin the Paranoid Android" marv@googlemail.com , the.mice@magrathea.com ]; // メソッド呼び出しの中で使う例。 goog.dom.createDom(goog.dom.TagName.DIV, { id foo , className some-css-class , style display none }, Hello, world! ); 初期化リストの中で長い識別子や値の位置を揃えるのはやっかいな問題です。むしろ常に位置を揃えない方がよいでしょう。例えばこのようにします CORRECT_Object.prototype = { a 0, b 1, lengthyName 2 }; 下のようにはしません WRONG_Object.prototype = { a 0, b 1, lengthyName 2 }; 関数の引数 可能であれば、関数の引数リストは全て同じ行に書かれるべきです。もしそうすることで80文字の制限を超えてしまう場合、引数は読みやすい形式で改行されなくてはなりません。可能な限り80文字に近づけてスペースを節約するか、または引数ごとに改行を行って可読性を高めます。インデントはスペース4つ分、もしくは丸括弧で位置を揃えます。以下に示す例は引数を改行する際の最も一般的なパターンです // スペース4つ分インデントし、80文字で折り返します。関数名がとても長い場合に使います。 // 関数名が変わったときにインデントを修正する必要がなく、場所もあまりとりません。 goog.foo.bar.doThingThatIsVeryDifficultToExplain = function( veryDescriptiveArgumentNumberOne, veryDescriptiveArgumentTwo, tableModelEventHandlerProxy, artichokeDescriptorAdapterIterator) { // ... }; // スペース4つ分インデントし、各行に1つずつ引数を書きます。関数名が長い場合に使います。 // 関数名の変更の影響を受けず、また個々の引数を目立たせることができます。 goog.foo.bar.doThingThatIsVeryDifficultToExplain = function( veryDescriptiveArgumentNumberOne, veryDescriptiveArgumentTwo, tableModelEventHandlerProxy, artichokeDescriptorAdapterIterator) { // ... }; // 丸括弧に揃えてインデントし、80文字で折り返します。視覚的に引数をグループ化でき、 // かつスペースも少なくてすみます。 function foo(veryDescriptiveArgumentNumberOne, veryDescriptiveArgumentTwo, tableModelEventHandlerProxy, artichokeDescriptorAdapterIterator) { // ... } // 丸括弧に揃えてインデントし、各行に1つずつ引数を書きます。 // 個々の引数を目立たせることができます。 function bar(veryDescriptiveArgumentNumberOne, veryDescriptiveArgumentTwo, tableModelEventHandlerProxy, artichokeDescriptorAdapterIterator) { // ... } 関数の呼び出し自体がインデントされている場合、元の文もしくは関数呼び出しの開始位置を基準にスペース4つ分インデントしてかまいません。次の例は全て許容されるスタイルです if (veryLongFunctionNameA( veryLongArgumentName) || veryLongFunctionNameB( veryLongArgumentName)) { veryLongFunctionNameC(veryLongFunctionNameD( veryLongFunctioNameE( veryLongFunctionNameF))); } 無名関数の引渡し 関数呼び出しの引数リスト内で無名関数を宣言する場合、無名関数の内容は、文全体の左端からスペース2つ分、もしくは無名関数の宣言の左端からスペース2つ分インデントします。これは無名関数の内容を読みやすくする(関数全体が画面の右側に圧し潰された状態にならないようにする)ためです。 prefix.something.reallyLongFunctionName( whatever , function(a1, a2) { if (a1.equals(a2)) { someOtherLongFunctionName(a1); } else { andNowForSomethingCompletelyDifferent(a2.parrot); } }); var names = prefix.something.myExcellentMapFunction( verboselyNamedCollectionOfItems, function(item) { return item.name; }); goog.scopeによる別名 Closure Libraryが提供するgoog.scopeを使うと、名前空間を含むシンボルの長い名前を短く置き換えることができます。 goog.scopeの呼び出しは、1ファイルにつき1度だけ、グローバルスコープ内で行います。 呼び出しの開始部分goog.scope(function() {は、goog.provide、goog.require、トップレベルコメントの後に、正確に1行空けてから記述しなければなりません。呼び出しはファイルの最終行で閉じられなければなりません。またこのとき// goog.scopeというコメントを、ステートメント末尾のセミコロンからスペース2つ空けて追記してください。 C++の名前空間と同様に、goog.scopeの配下のコードはインデントしません。各行の先頭から記述を続けます。 作成した別名を、別のオブジェクト(例えば、ほとんどのコンストラクタ、列挙型、名前空間)へ再割り当てしないでください。次のようにしてはいけません(コンストラクタへの別名のつけ方は、下を参照してください) goog.scope(function() { var Button = goog.ui.Button; Button = function() { ... }; ... 別名は、シンボルの完全名の最後の部分と同じでなければなりません。 goog.provide( my.module.SomeType ); goog.require( goog.dom ); goog.require( goog.ui.Button ); goog.scope(function() { var Button = goog.ui.Button; var dom = goog.dom; // コンストラクタ宣言より後に別名化します。 my.module.SomeType = function() { ... }; var SomeType = my.module.SomeType; // いつもどおり、プロトタイプメソッドを宣言します SomeType.prototype.findButton = function() { // 上で別名化したButton this.button = new Button(dom.getElement( my-button )); }; ... }); // goog.scope 行折り返しのインデント 配列リテラルとオブジェクトリテラル、無名関数を除き、行の折り返しは全て 兄弟 の式に対し左揃えでインデントするか、 親 の式に対しスペース4つ(2つではなく)分深くインデントします(ここでいう 兄弟 や 親 は、丸括弧のネストの深さを指します)。 someWonderfulHtml = + getEvenMoreHtml(someReallyInterestingValues, moreValues, evenMoreParams, a duck , true, 72, slightlyMoreMonkeys(0xfff)) + ; thisIsAVeryLongVariableName = hereIsAnEvenLongerOtherFunctionNameThatWillNotFitOnPrevLine(); thisIsAVeryLongVariableName = siblingOne + siblingTwo + siblingThree + siblingFour + siblingFive + siblingSix + siblingSeven + moreSiblingExpressions + allAtTheSameIndentationLevel; thisIsAVeryLongVariableName = operandOne + operandTwo + operandThree + operandFour + operandFive * ( aNestedChildExpression + shouldBeIndentedMore); someValue = this.foo( shortArg, Some really long string arg - this is a pretty common case, actually. , shorty2, this.bar()); if (searchableCollection(allYourStuff).contains(theStuffYouWant) !ambientNotification.isActive() (client.isAmbientSupported() || client.alwaysTryAmbientAnyways())) { ambientNotification.activate(); } 空行 論理的に関連性のあるコードをまとめるため、空行を使ってください。例えば次のようにします doSomethingTo(x); doSomethingElseTo(x); andThen(x); nowDoSomethingWith(y); andNowWith(z); 二項または三項の演算子 演算子は必ず先行する行の側に置きます。それを除くと、改行やインデントは他のGoogleスタイルガイドと同じルールに従います。当初この演算子の配置はセミコロンの自動挿入への配慮から決定されましたが、実際にはセミコロンが二項演算子の前に挿入されることはありません。しかし一貫性を保つため、新しいコードもこのスタイルを守ってください。 var x = a ? b c; // 収まるなら1行にまとめます。 // 4文字分のインデントはOKです。 var y = a ? longButSimpleOperandB longButSimpleOperandC; // 最初のオペランドの位置までインデントするのもOKです。 var z = a ? moreComplicatedB moreComplicatedC; ドット演算子も同じです。 var x = foo.bar(). doSomething(). doSomethingElse(); 丸括弧 必要なときだけ使います。 丸括弧は控えめに、基本的には文法やセマンティクスが求める場合にだけ使います。 delete、typeof、voidのような単項演算子やreturn、throwのようなキーワードの後ろで丸括弧を使ってはいけません(case、in、newで使わないのと同様です)。 文字列 "より を使います。 一貫性の点で、ダブルクォート(")よりもシングルクォート( )の方が好ましいといえます。HTMLを含む文字列を作成する際には、シングルクォートの方が便利です var msg = This is some HTML ; 可視性(privateまたはprotectedなフィールド) JSDocアノテーションの@privateと@protectedの利用を推奨します。 JSDocアノテーションの@privateと@protectedを利用し、クラス、関数、プロパティの可視性を明示することを推奨します。 Compilerのフラグ--jscomp_warning=visibilityを有効にすると、可視性の違反について警告が出力されます。 Closure Compiler Warnings を参照してください。 グローバルな変数や関数に付けられた@privateは、同じファイル内のコードだけがそれらにアクセス可能であることを表します。 @privateが付けられたコンストラクタは、それをインスタンス化できるのが同じファイル内のコードとそれ自身の静的またはインスタンスメンバだけであることを表します。@privateコンストラクタは、同じファイルからであればパブリックで静的なプロパティとしてアクセスできます。またinstanceof演算子もそれらにアクセスできます。 グローバルな変数、関数、コンストラクタに対して@protectedアノテーションは絶対に付けられません。 // ファイル 1 // AA_PrivateClass_ と AA_init_ はグローバルでありかつ同一ファイル内に存在するため、 // 互いにアクセス可能です。 /** * @private * @constructor */ AA_PrivateClass_ = function() { }; /** @private */ function AA_init_() { return new AA_PrivateClass_(); } AA_init_(); @privateなプロパティにアクセス可能なのは、同じファイルに存在する全てのコードと、もしそのプロパティがクラスに属しているのであれば、そのプロパティを"所有"するクラスの全ての静的メソッドとインスタンスメソッドです。それらは別のファイルに存在するサブクラスからはアクセスできず、オーバーライドされることもありません。 @protectedなプロパティにアクセス可能なのは、同じファイルに存在する全てのコードと、そのプロパティを"所有"するクラスとそのサブクラスの全ての静的メソッドとインスタンスメソッドです。 これらのセマンティクスはC++やJavaのそれとは違いがある点に注意してください。例えばアクセス権限は、同じクラスやクラス階層に属するものだけでなく、同じファイル内に存在する全てのコードに与えられています。またC++とは異なり、プライベートなプロパティはサブクラスからオーバーライドできません。 // ファイル 1 /** @constructor */ AA_PublicClass = function() { /** @private */ this.privateProp_ = 2; /** @protected */ this.protectedProp = 4; }; /** @private */ AA_PublicClass.staticPrivateProp_ = 1; /** @protected */ AA_PublicClass.staticProtectedProp = 31; /** @private */ AA_PublicClass.prototype.privateMethod_ = function() {}; /** @protected */ AA_PublicClass.prototype.protectedMethod = function() {}; // ファイル 2 /** * @return {number} 1列に並べたカモの数。 */ AA_PublicClass.prototype.method = function() { // これら2つのプロパティへのアクセスは正当です。 return this.privateProp_ + AA_PublicClass.staticPrivateProp_; }; // ファイル 3 /** * @constructor * @extends {AA_PublicClass} */ AA_SubClass = function() { // protectedな静的プロパティへの正当なアクセス。 AA_PublicClass.staticProtectedProp = this.method(); }; goog.inherits(AA_SubClass, AA_PublicClass); /** * @return {number} 1列に並べたカモの数。 */ AA_SubClass.prototype.method = function() { // protectedなインスタンスプロパティへの正当なアクセス。 return this.protectedProp; }; JavaScriptでは、ある型(AA_PrivateClass_のような)とその型のコンストラクタが区別されないことに注意してください。publicな型とprivateなコンストラクタを両立させる方法はありません。(可視性のチェックを破ってコンストラクタに別名をつけるのは簡単だからです) JavaScriptのデータ型 Compilerによる型の強制を推奨します。 詳細はこちらのページを参照してください。 コメント JSDocを使ってください。 詳細はこちらのページを参照してください。 goog.provideによる依存関係の規定 トップレベルのシンボルだけを規定します。 あるクラスに含まれるメンバ(列挙型や内部クラスなど)は全て、同じファイル内で定義しましょう。こうすると、1つのファイル内でgoog.provideが規定するのは最上位のクラスだけになるはずです。 こうします goog.provide( namespace.MyClass ); こうはしません goog.provide( namespace.MyClass ); goog.provide( namespace.MyClass.Enum ); goog.provide( namespace.MyClass.InnerClass ); goog.provide( namespace.MyClass.TypeDef ); goog.provide( namespace.MyClass.CONSTANT ); goog.provide( namespace.MyClass.staticMethod ); 名前空間のメンバは個々に規定します goog.provide( foo.bar ); goog.provide( foo.bar.method ); goog.provide( foo.bar.CONSTANT ); コンパイル 必須です。 クライアントに配信される全てのコードは、Closure CompilerのようなJSコンパイラによってコンパイルされていなければなりません。 ヒントとテクニック JavaScriptについてもう少しだけ。 論理値表現 以下の値は、論理値の表現としてはすべてfalseです null undefined (空文字) 数値の0 でも気をつけてください。以下の値は全てtrueです 文字列の 0 [](空の配列) {}(空のオブジェクト) 以上から、下のコードを書き換えてみましょう while (x != null) { これはもっと短くできます(ただしxが 0、空文字、falseを取らないことが条件です) while (x) { また、文字列がnullでも空文字でもないことをチェックしたいとします。こうも書けますが if (y != null y != ) { 下の方が短くてもっといいでしょう if (y) { 警告 論理値表現の結果は直感と異なることがよくあります。いくつか例を示します Boolean( 0 ) == true 0 != true 0 != null0 == []0 == false Boolean(null) == falsenull != truenull != false Boolean(undefined) == falseundefined != trueundefined != false Boolean([]) == true[] != true[] == false Boolean({}) == true{} != true{} != false 条件(三項)演算子 (? ) こう書く代わりに if (val) { return foo(); } else { return bar(); } こう書くことができます return val ? foo() bar(); 三項演算子はHTMLを作成するときにも便利です var html = input type="checkbox" + (isChecked ? checked ) + (isEnabled ? disabled ) + name="foo" ; と || これらの二項演算子は短絡演算子です。最後に評価された項目の結果を式全体の評価とします。 ||は「デフォルト」演算子とも呼ばれます。その理由は /** @param {*=} opt_win */ function foo(opt_win) { var win; if (opt_win) { win = opt_win; } else { win = window; } // ... } 上のコードを、こう書き換えられるからです /** @param {*=} opt_win */ function foo(opt_win) { var win = opt_win || window; // ... } もまた、コードを短くするのに役立ちます。例えば下のように書く代わりに if (node) { if (node.kids) { if (node.kids[index]) { foo(node.kids[index]); } } } こうできます if (node node.kids node.kids[index]) { foo(node.kids[index]); } あるいは var kid = node node.kids node.kids[index]; if (kid) { foo(kid); } とはいえ、これは少々やりすぎでしょう node node.kids node.kids[index] foo(node.kids[index]); ノードリストへの反復処理 多くの場合ノードリストはフィルタ付きのイテレータとして実装されています。これは、lengthのようなプロパティを参照するときのオーダーが O(n) であり、反復処理中にlengthを再計算し続けると、そのオーダーは O(n^2) となるということを意味しています。 var paragraphs = document.getElementsByTagName( p ); for (var i = 0; i paragraphs.length; i++) { doSomething(paragraphs[i]); } 上のコードはこう書き換えたほうが優れています var paragraphs = document.getElementsByTagName( p ); for (var i = 0, paragraph; paragraph = paragraphs[i]; i++) { doSomething(paragraph); } 要素が論理値のfalseとして評価される値を持たなければ、上のコードは全てのコレクションや配列で正常に動作します。 あるノードの子ノードに対して反復処理を行う際には、firstChildプロパティとnextSiblingプロパティを使うこともできます var parentNode = document.getElementById( foo ); for (var child = parentNode.firstChild; child; child = child.nextSibling) { doSomething(child); }
https://w.atwiki.jp/ce00582/pages/3235.html
import java.awt.*; import java.awt.event.*; class game0123 extends Frame implements Runnable{ int mode; int t; int px,py; int z[][]=new int[11][11]; int coin; Image img1,img2; public static void main(String [] args) { Frame f=new game0123(); f.setTitle("game0123"); f.setSize(700,700); f.setBackground(Color.white); f.setVisible(true); } game0123(){ img1 = Toolkit.getDefaultToolkit().getImage("mini.jpg"); img2 = Toolkit.getDefaultToolkit().getImage("tokyo.jpg"); setLayout(new FlowLayout()); Button bu1 = new Button("1"); bu1.addActionListener(new beck()); add(bu1); bu1.setActionCommand("c1"); Button bu2 = new Button("2"); bu2.addActionListener(new beck()); add(bu2); bu2.setActionCommand("c2"); Button bu3 = new Button("3"); bu3.addActionListener(new beck()); add(bu3); bu3.setActionCommand("c3"); Button bu4 = new Button("4"); bu4.addActionListener(new beck()); add(bu4); bu4.setActionCommand("c4"); Button bu5 = new Button("5"); bu5.addActionListener(new beck()); add(bu5); bu5.setActionCommand("c5"); setVisible( true ); Thread th=new Thread(this); th.start(); addWindowListener(new stopwin()); } class stopwin extends WindowAdapter{ public void windowClosing(WindowEvent we){System.exit(0);} } class beck implements ActionListener { public void actionPerformed(ActionEvent e) { if ("c1".equals(e.getActionCommand()))coin=1; if ("c2".equals(e.getActionCommand()))coin=2; if ("c3".equals(e.getActionCommand()))coin=3; if ("c4".equals(e.getActionCommand()))coin=4; if ("c5".equals(e.getActionCommand()))coin=5; } } public void run(){ int dx,dy; int h; mode=0; t=0; px=10; py=10; dx=0; dy=0; coin=0; while(mode 50){ if (coin==1)dx=0; if (coin==1)dy=0; if (coin==2)dx=1; if (coin==2)dy=0; if (coin==3)dx=-1; if (coin==3)dy=0; if (coin==4)dx=0; if (coin==4)dy=1; if (coin==5)dx=0; if (coin==5)dy=-1; px=px+dx; py=py+dy; repaint(); try{ Thread.sleep(300); }catch(InterruptedException e){} t=t+1; h=0; if(px 5)h=h+1; if(py 5)h=h+1; if(h==2)mode=100; } repaint(); } public void paint(Graphics g){ if(mode 50){ g.drawImage(img1,100+50*px,50+50*py,100,100,this); g.drawImage(img2,250,250,100,100,this); } if(mode 50){ g.drawImage(img1,100,50,500,500,this); } } }
https://w.atwiki.jp/javadsge/pages/6975.html
(1)表 2013年 (2)プログラム プログラム (3)グラフ (4)出所 内閣府 (5)メモ JAVA処理 コード (6)作業記録 12月15日 ページ追加 -
https://w.atwiki.jp/creation/pages/12.html
Java Communication API Javaからシリアル・パラレルポートを制御するためのAPI。ネイティブメソッドを使用している。 http //java.sun.com/products/javacomm/index.jsp Javadoc http //java.sun.com/products/javacomm/javadocs/javax/comm/package-summary.html ※なぜかNon-Frameバージョンしかない。 なお、3rd Partyではあるが、 RXTXはJava CommAPI互換の上にI2C、RS485にも対応した実装を行っている。また対応するOSもWin32、Linux、Macと主要なものを網羅している。 パッケージ名が違うので注意。 バージョン 最新版は3.0Update1(2006年3月現在)。 対応するポート 現在対応しているor使用できるポートは以下の通りです。 シリアルポート(RS-232C) パラレルポート また下記はWindowsXP+ USB-シリアル変換器での動作を確認しています。 シリアルポート(RS-422) シリアルポート(RS-485) RS-422,485においてもCommAPIの使用方法はRS-232Cとまったく同じです。 対応するOS Windows Sunがサポートしている。 ※2005年11月15日現在ダウンロードできなくなっている。バイナリの機能はJREに標準装備されたとの噂もあるが、真相は定かではない。現在下記の方法で使える可能性があるらしいが、現在検討中。 Java Comm APIのlinux版をSunのサイトからダウンロード jre/libにjavax.comm.propertiesをコピー jre/lib/extにcomm.jarをコピー 以上 追記(2005/11/15):やはり上記ではうまくいかないようだ。 jre/binにwin32com.dllがないから?? また裏技的に、下記のサイト http //www-06.ibm.com/jp/developerworks/ibm/020913/j_i-barcd.html の最下部にある「必要なcommポート・ファイルをダウンロードしてください。」というリンクをクリックすると以前のcomm.jar,javax.comm.properties,win32com.dllをダウンロードすることが出来る。 Sun公式サイト http //java.sun.com/products/javacomm/downloads/index.html 参考 http //www.okakogi.go.jp/People/miwa/program/how2com/how2com.html RXTXも使用可能。 http //www.rxtx.org/ Solaris Sunがサポートしている。 Sun Microsystems http //java.sun.com/products/javacomm/downloads/index.html Linux 数年前からサンが正式にサポートしている。 http //java.sun.com/products/javacomm/downloads/index.html RXTXも使用可能。 http //www.rxtx.org/ 参考 http //www.viste.com/Java/CommAPI/CommAPI.htm http //www.viste.com/Java/CommAPI/install-japanese.html http //www.tini.prug.or.jp/linuxinstall.html IBM版もある。 IBMJava2-JAVACOMM http //www.novell.com/products/linuxpackages/enterpriseserver/i386/ibmjava2-javacomm.html JCLという物もあったらしい。が、RXTXに吸収されているらしい。 JCL http //www.geeksville.com/~kevinh/linuxcomm.html Mac 下記を使えばいいらしいが詳細は不明。動くかどうかも不明。使った方はご一報を。 http //homepage.mac.com/pcbeard/javax.comm.MRJ/ RXTXは使用可能。 http //www.rxtx.org/ 自作 下記を使えばどんなOSにも対応可能。というか、C言語の雛形しかないので、その先は自作する必要がある。腕に自身のある人向け。 http //www.openje.org/kommapi/ 製品版 Serialio.com SerialPort 製品版のため有償だが、PCから組み込みまで幅広いプラットフォームをサポートしている。 https //serialio.com/products/serialport/serialport.htm CommPortIdentifier CommPortIdentifierを使うとパラレル・シリアル両ポートの高度な制御が可能となる。 具体的には 名前によるポートの取得(COM1,/dev/ttyS0など) 使用可能なポート名のリストの取得 オーナー名を付けたポートのオープン オーナー情報を利用したポートのコントロール などなど。Serial,Pararellにとらわれず、抽象的にコントロールできる。 なお、初期化はコンストラクタではなく CommPort port = CommPortIdentifier.getPortIdentifier("COM1"); のように行う。 使用可能なポートの取得 COM1や/dev/ttyS0などの機種やOSに依存する名前をソースコード中にハードコーディング{{fn ソース中に変更不可能な形で記述してしまうこと。特に文字列を決め打ちしてしまうことを指す場合が多い。}}するのはJavaの性質上好ましくない。 また、名前は合っていても、機種によってはそのポートは実際には存在しないことも多い。(特にノートパソコンなど) そこでポート名を動的に取得し、GUIやコマンドラインから対話的にポートを選択するようにプログラムするのが最もスマートな方法だと言える。 使用可能なポート名を取得するには次のような方法を使う。 CommPortIdentifier portId; ArrayList list = new ArrayList(); Enumeration en = CommPortIdentifier.getPortIdentifiers(); while (en.hasMoreElements()) { portId = (CommPortIdentifier) en.nextElement(); list.add(portId.getName()); } シリアルポートだけ取得する場合は CommPortIdentifier portId; ArrayList list = new ArrayList(); Enumeration en = CommPortIdentifier.getPortIdentifiers(); while (en.hasMoreElements()) { portId = (CommPortIdentifier) en.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { list.add(portId.getName()); } } という風に条件を付ける。 パラレルの場合はPORT_SERIALをPORT_PARALLELにする。 北陽電機(HOKUYO)製の測域センサURGの距離取得プログラム例 URG-X04LX(プロトコルはSCIP1.0)に対応(してるはず)。 下記の添付ファイルをダウンロードしてください。 ※各自の責任において使用してください。作者は一切の責任を負いかねます。 リンク FA のための Java プログラミング講座 http //www.javainthebox.net/JavaForFA/08-09CommAPI/No.08/commapi1.html http //www.javainthebox.net/JavaForFA/08-09CommAPI/No.09/commapi2.html
https://w.atwiki.jp/ce00582/pages/1265.html
import java.awt.*; import javax.swing.*; public class tax36 extends JFrame { public static void main(String args[]) { new tax36(); } public tax36() { setDefaultCloseOperation(EXIT_ON_CLOSE); getContentPane().add(new pp()); setSize(500,500); setTitle("dsge36"); setVisible(true); } } class pp extends JPanel { public pp(){setBackground(Color.white);} public void paintComponent(Graphics g) { double data[]= new double[201]; int n; int y1,y2,x1,x2; super.paintComponent(g); g.drawString("練習", 100,400); g.setColor(Color.red); data=tax(); for (n=1;n 100;n++){ x1=(int)(500*data[n]); x2=(int)(500*data[n+1]); y1=(int)(500-500*data[n+100]); y2=(int)(500-500*data[n+101]); g.drawLine(x1,y1,x2,y2); } } static double[] tax(){ double th[]= new double[101]; double c[]= new double[101]; double y[]= new double[101]; int opc[]= new int[101]; int opy[]= new int[101]; int opq[]= new int[101]; double u[][][]=new double[101][3][3]; double ww[][][]=new double[100][3][3]; double v[][][][]=new double[100][3][3][21]; int gotoc[][][][]=new int[100][3][3][21]; int gotoy[][][][]=new int[100][3][3][21]; int gotoq[][][][]=new int[100][3][3][21]; double endv[][]=new double[3][3]; int endc[][]=new int[3][3]; int endy[][]=new int[3][3]; int endq[][]=new int[3][3]; int s; double ls; double w; double cs; double ys; double b1; double b2; double wel; double maxwel; int t; int n; int n1; int n2; int pp; int q; int j; double c1; double l1; double h; double u1; int ns1; int ns2; int qx; int nx1; int nx2; double vs; double v1; double maxv; double dc; double dy; int e; double data1[]=new double[101]; double data2[]=new double[201]; double data3[]=new double[201]; double maxy; data1=ex1(); data2=ex2(); for (s=1;s 101;s++){ c[s]=data2[s]; y[s]=data2[s+100]; } for (s=1;s 101;s++){ th[s]=data1[s]; } h=0.001; t=0; while(t 1000){ for (s=1;s 101;s++){ for (n1=-1;n1 2;n1++){ for (n2=-1;n2 2;n2++){ c1=c[s]+n1*h; l1=(y[s]+n2*h)/th[s]; u1=ux(c1,l1); u[s][n1+1][n2+1]=u1; } } } for (s=1;s 100;s++){ for (n1=-1;n1 2;n1++){ for (n2=-1;n2 2;n2++){ c1=c[s]+n1*h; l1=(y[s]+n2*h)/th[s+1]; u1=ux(c1,l1); ww[s][n1+1][n2+1]=u1; } } } for (n1=-1;n1 2;n1++){ for (n2=-1;n2 2;n2++){ for (q=-10;q 11;q++){ v[1][n1+1][n2+1][q+10]=-999; } } } for (n1=-1;n1 2;n1++){ for (n2=-1;n2 2;n2++){ q=n2-n1; v[1][n1+1][n2+1][q+10]=u[1][n1+1][n2+1]; } } for (s=2;s 100;s++){ for (n1=-1;n1 2;n1++){ for (n2=-1;n2 2;n2++){ for (q=-10;q 11;q++){ u1=u[s][n1+1][n2+1]; qx=q-n1+n2; pp=0; if (qx 10)pp=100; if (qx -10)pp=100; if (pp 50)qx=0; vs=-999; ns1=0; ns2=0; for (nx1=-1;nx1 2;nx1++){ for (nx2=-1;nx2 2;nx2++){ v1=u1+v[s-1][nx1+1][nx2+1][qx+10]; if (ww[s-1][nx1+1][nx2+1] u1)v1=-999; if (v1 vs)ns1=nx1; if (v1 vs)ns2=nx2; if (v1 vs)vs=v1; } } if (pp 50)vs=-999; gotoc[s][n1+1][n2+1][q+10]=ns1; gotoy[s][n1+1][n2+1][q+10]=ns2; gotoq[s][n1+1][n2+1][q+10]=qx; v[s][n1+1][n2+1][q+10]=vs; } } } } for (n1=-1;n1 2;n1++){ for (n2=-1;n2 2;n2++){ u1=u[100][n1+1][n2+1]; qx=n2-n1; vs=-999; ns1=0; ns2=0; for (nx1=-1;nx1 2;nx1++){ for (nx2=-1;nx2 2;nx2++){ v1=u1+v[99][nx1+1][nx2+1][qx+10]; if (ww[99][nx1+1][nx2+1] u1){ v1=-999; } if (v1 vs){ ns1=nx1; } if (v1 vs){ ns2=nx2; } if (v1 vs){ vs=v1; } } } endc[n1+1][n2+1]=ns1; endy[n1+1][n2+1]=ns2; endq[n1+1][n2+1]=qx; endv[n1+1][n2+1]=vs; } } maxv=-999; ns1=0; ns2=0; for (n1=-1;n1 2;n1++){ for (n2=-1;n2 2;n2++){ if (endv[n1+1][n2+1] maxv){ ns1=n1; } if (endv[n1+1][n2+1] maxv){ ns2=n2; } if (endv[n1+1][n2+1] maxv){ maxv=endv[n1+1][n2+1]; } } } opc[100]=ns1; opy[100]=ns2; opc[99]=endc[opc[100]+1][opy[100]+1]; opy[99]=endy[opc[100]+1][opy[100]+1]; opq[99]=endq[opc[100]+1][opy[100]+1]; for (j=1;j 99;j++){ s=99-j; opc[s]=gotoc[s+1][opc[s+1]+1][opy[s+1]+1][opq[s+1]+10]; opy[s]=gotoy[s+1][opc[s+1]+1][opy[s+1]+1][opq[s+1]+10]; opq[s]=gotoq[s+1][opc[s+1]+1][opy[s+1]+1][opq[s+1]+10]; } e=0; for (s=1;s 101;s++){ e=e+opc[s]*opc[s]+opy[s]*opy[s]; } for (s=1;s 101;s++){ c[s]=c[s]+opc[s]*h; y[s]=y[s]+opy[s]*h; } System.out.println(e); if (e 2){ h=h/2; } if (h 0.00001){ t=10000; } t=t+1; } maxy=-999; for (s=1;s 101;s++){ if (y[s] maxy)maxy=y[s]; } for (s=1;s 99;s++){ dc=c[s+1]-c[s]; dy=y[s+1]-y[s]; data3[s]=0; if (dy 0)data3[s]=1-dc/dy; } for (s=1;s 100;s++){ data3[s+100]=y[s]/maxy; } return data3; } static double[] ex2(){ double th[]= new double[101]; int s; double tl; double tr; double ls; double w; double cs; double ys; double b1; double b2; double tr1; double tr2; double tr3; double wel; double maxwel; double maxtl; double maxtr; int t; int n; double h; double c[]= new double[101]; double y[]= new double[101]; double data1[]=new double[101]; double data[]=new double[201]; int n1; int n2; data1=ex1(); for (s=1;s 101;s++){ th[s]=data1[s]; } maxwel=-999; maxtr=0; maxtl=0; for (n=20;n 45;n++){ tl=0.01*n; tr1=0.01; tr2=0.02; tr=tr1; b1=bud(tl,tr1,th); t=0; while (t 100) { b2=bud(tl,tr2,th); tr3=tr2-b2*(tr2-tr1)/(b2-b1); tr1=tr2; tr2=tr3; b1=b2; if (b2*b2 0.00001)t=1000; t=t+1; } tr=tr2; wel=seekwel(tl,tr,th); if (wel maxwel)maxtl=tl; if (wel maxwel)maxtr=tr; if (wel maxwel)maxwel=wel; } tl=maxtl; tr=maxtr; for (s=1;s 101;s++){ w=(1-tl)*th[s]; ls=(w-tr)/(2*w); if (ls 0)ls=0; c[s]=w*ls+tr; y[s]=th[s]*ls; } for (s=1;s 101;s++){ data[s]=c[s]; data[s+100]=y[s]; } return data; } static double ux(double c1,double l1){ double u1; double c3; double l3; int pp; pp=0; c3=c1; l3=l1; if (c3 0)pp=100; if (l3 0)pp=100; if (l3 1)pp=100; if (pp 50)c3=0.5; if (pp 50)l3=0.5; u1=Math.log(c3)+Math.log(1-l3); if (pp 50)u1=-999; return u1; } static double bud(double tl,double tr,double th[]){ double bx; int s; double w; double y1; double c1; double l1; bx=0; for (s=1;s 101;s++){ w=(1-tl)*th[s]; l1=(w-tr)/(2*w); if (l1 0)l1=0; y1=th[s]*l1; c1=w*l1+tr; bx=bx+y1-c1; } return bx; } static double seekwel(double tl,double tr,double th[]){ double sw; int s; double w; double l1; double c1; sw=0; for (s=1;s 101;s++){ w=(1-tl)*th[s]; l1=(w-tr)/(2*w); if (l1 0)l1=0; c1=w*l1+tr; sw=sw+ux(c1,l1); } return sw; } static double[] ex1(){ double p; double mu; double sig; double yy; double th[]= new double[101]; int s; mu=0; sig=0.39; for (s=1;s 101;s++){ p=0.01*s-0.005; yy=seeky(p,mu,sig); th[s]=Math.exp(yy); } return th; } static double f(double x,double mu,double sig){ double pi,x1,x2,x3,fx; pi = 3.1415; x1=-Math.pow(x - mu,2) / (2*Math.pow(sig,2)); x2=Math.exp(x1); x3=sig*Math.pow(2*pi,0.5); fx=x2/x3; return fx; } static double g(double y,double mu, double sig){ double gx,h,x; int n,t; gx=0; h=0.001; t=(int)(y/h); for (n=-2000;n t;n++){ x=n*h; gx=gx+f(x,mu,sig)*h; } return gx; } static double seeky(double p,double mu,double sig){ double g1,g2,y1,y2,y3; int t; y1=0.4; y2=-0.2; g1=g(y1,mu,sig); t=0; while(t 100){ g2=g(y2,mu,sig); y3=y2+(p-g2)*(y2-y1)/(g2-g1); y1=y2; y2=y3; g1=g2; if (Math.pow(p-g2,2) 0.0001)t=1000; t=t+1; } return y2; } }
https://w.atwiki.jp/javamock/pages/43.html
テキストエディタソースver1.2 テキストエディタソースver1.2Main.java TextEditor.java TextEditorModel.java Constants.java TextAreaProperties.java Logic.java LogicImpl.java ActionLogic.java ActionLogicImpl.java Main.java /** * * メインクラスです。 * @author mock * @version 1.2 * */ public class Main { /** * メインメソッドです * @param args */ public static void main([[String]][] args) { new TextEditor(); } } TextEditor.java import java.awt.HeadlessException; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JTextArea; /** * テキストエディタクラスです * * @author mock */ public class TextEditor extends JFrame implements ActionListener { /** serialVersionUID */ private static final [[long]] serialVersionUID = 1L; /** テキストエリア */ public JTextArea textArea; /** ファイル選択 */ public JFileChooser fileChooser = new JFileChooser(); /** logic */ public Logic logic = new LogicImpl(); /** actionLogic */ public ActionLogic actionLogic = new ActionLogicImpl(); /** * コンストラクタ * * @throws HeadlessException */ public TextEditor() throws HeadlessException { TextAreaProperties textAreaProperties = logic.getInitProperties(); setTitle(Constants.UNDIFINED_TITLE); logic.createMenuBar(getRootPane(), this); textArea = logic.createTextArea(textAreaProperties, this); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); pack(); } /* * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ @Override public void actionPerformed(ActionEvent actionEvent) { String actionCommand = actionEvent.getActionCommand(); TextEditorModel model = new TextEditorModel(); model.setFrame(this); model.setTextArea(textArea); model.setFileChooser(fileChooser); if (actionCommand.equals(Constants.MenuItem.NEW.toString())) { fileChooser = actionLogic.newFile(model); } else if (actionCommand.equals(Constants.MenuItem.OPEN.toString())) { actionLogic.openFile(model); } else if (actionCommand.equals(Constants.MenuItem.SAVE.toString())) { actionLogic.save(model); } else if (actionCommand.equals(Constants.MenuItem.SAVE_AS.toString())) { actionLogic.saveAs(model); } else if (actionCommand.equals(Constants.MenuItem.VERSION.toString())) { actionLogic.showVersionInfo(model); } } } TextEditorModel.java import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JTextArea; /** * テキストエディタに関するモデルです * @author mock * */ public class TextEditorModel { /** フレーム */ private JFrame frame; /** ファイルチューザ */ private JFileChooser fileChooser; /** テキストエリア */ private JTextArea textArea; /** * @return the frame */ public JFrame getFrame() { [[return]] frame; } /** * @param frame the frame to set */ public void setFrame(JFrame frame) { this.frame = frame; } /** * @return the fileChooser */ public JFileChooser getFileChooser() { return fileChooser; } /** * @param fileChooser the fileChooser to set */ public void setFileChooser(JFileChooser fileChooser) { this.fileChooser = fileChooser; } /** * @return the textArea */ public JTextArea getTextArea() { return textArea; } /** * @param textArea the textArea to set */ public void setTextArea(JTextArea textArea) { this.textArea = textArea; } } Constants.java import java.awt.event.KeyEvent; /** * 定数を集めたクラスです。 * * @author mock * */ public class Constants { /** 新規のタイトル名 */ public static final String UNDIFINED_TITLE = "UNDIFINED_TITLE"; /** バージョン */ public static final String VERSION = "ver1.2"; /** バージョン情報タイトル */ public static final String VERSION_TITLE = "VERSION"; /** ファイル(F)メニューラベル */ public static final String MENU_FILE_LABEL = "ファイル(F)"; /** ヘルプ(H)メニューラベル */ public static final String MENU_HELP_LABEL = "ヘルプ(H)"; public static final String INI_FILE_NAME = "texteditor.ini"; /** * メニュー項目に関する定数 * * @author mock * */ public enum MenuItem { NEW("新規(N)", KeyEvent.VK_N), OPEN("開く(O)", KeyEvent.VK_O), SAVE("上書き保存(S)", KeyEvent.VK_S), SAVE_AS("名前を付けて保存(A)", KeyEvent.VK_A), VERSION("バージョン情報(A)", KeyEvent.VK_A), ; /** メニュー項目ラベル */ private String label; /** メニュー項目ニーモニック */ private [[int]] mnemonic; /** * @param label * メニュー項目ラベル * @param mnemonic * メニュー項目ニーモニック */ MenuItem(String label, int mnemonic) { this.label = label; this.mnemonic = mnemonic; } /** * @return メニュー項目ラベル */ public final String getLabel() { return this.label; } /** * @return メニュー項目ニーモニック */ public final int getMnemonic() { return this.mnemonic; } } } TextAreaProperties.java /** * テキストエリアに関するプロパティクラスです * @author mock */ public class TextAreaProperties { /** 幅 */ private int width; /** 高さ */ private int height; /** タブサイズ */ private int tabSize; /** フォントサイズ */ private int fontSize; /** * @return the width */ public int getWidth() { return width; } /** * @param width the width to set */ public void setWidth(int width) { this.width = width; } /** * @return the height */ public int getHeight() { return height; } /** * @param height the height to set */ public void setHeight(int height) { this.height = height; } /** * @return the tabSize */ public int getTabSize() { return tabSize; } /** * @param tabSize the tabSize to set */ public void setTabSize(int tabSize) { this.tabSize = tabSize; } /** * @return the fontSize */ public int getFontSize() { return fontSize; } /** * @param fontSize the fontSize to set */ public void setFontSize(int fontSize) { this.fontSize = fontSize; } } Logic.java import java.awt.event.ActionListener; import java.io.File; import javax.swing.JFrame; import javax.swing.JMenuItem; import javax.swing.JRootPane; import javax.swing.JTextArea; /** * テキストエディタに関するロジックのインターフェースです * * @author mock */ public interface Logic { /** * 初期設定プロパティを取得します * * @return テキストエリアに関するプロパティ */ public TextAreaProperties getInitProperties(); /** * メニューバーを作成します * * @param rootPane * コンテナ * @param actionListener * アクションリスナー */ public void createMenuBar(JRootPane rootPane, ActionListener actionListener); /** * メニュー項目を設定します * * @param item * メニュー項目 * @param actionListener * アクションリスナー * @return メニュー項目 */ public JMenuItem setMenuItem(Constants.MenuItem item, ActionListener actionListener); /** * テキストエリアを作成します * * @param properties * テキストエリアに関するプロパティ * @param frame * フレーム * @return テキストエリア */ public JTextArea createTextArea(TextAreaProperties properties, JFrame frame); /** * ファイルにテキスト内容を書き込みます * * @param file * ファイル * @param text * テキスト内容 * @return 処理結果 */ public [[boolean]] writeFile(File file, String text); } LogicImpl.java import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.util.Properties; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JTextArea; /** * テキストエディタに関するロジックの実装クラスです * * @author mock */ public class LogicImpl implements Logic { /* * @see Logic#getInitProperties() */ @Override public TextAreaProperties getInitProperties() { TextAreaProperties textAreaProperties = new TextAreaProperties(); try { Properties properties = new Properties(); properties.load(new FileInputStream(Constants.INI_FILE_NAME)); // 幅の設定 String width = properties.getProperty("textAreaWidth"); textAreaProperties.setWidth(Integer.parseInt(width)); // 高さの設定 String height = properties.getProperty("textAreaHeight"); textAreaProperties.setHeight(Integer.parseInt(height)); // タブサイズの設定 String tabSize = properties.getProperty("tabSize"); textAreaProperties.setTabSize(Integer.parseInt(tabSize)); // フォントサイズの設定 String fontSize = properties.getProperty("fontSize"); textAreaProperties.setFontSize(Integer.parseInt(fontSize)); } catch (IOException e) { e.printStackTrace(); } return textAreaProperties; } /* * @see Logic#createMenuBar(javax.swing.JRootPane, * java.awt.event.ActionListener) */ @Override public void createMenuBar(JRootPane rootPane, ActionListener actionListener) { JMenuBar menuBar = new JMenuBar(); rootPane.setJMenuBar(menuBar); // ファイル(F) JMenu menuFile = new JMenu(Constants.MENU_FILE_LABEL); menuFile.setMnemonic(KeyEvent.VK_F); menuBar.add(menuFile); // ファイル(F)>新規(N) JMenuItem menuItemNew = setMenuItem(Constants.MenuItem.NEW, actionListener); menuFile.add(menuItemNew); // ファイル(F)>開く(O) JMenuItem menuItemOpen = setMenuItem(Constants.MenuItem.OPEN, actionListener); menuFile.add(menuItemOpen); // ファイル(F)>上書き保存(S) JMenuItem menuItemSave = setMenuItem(Constants.MenuItem.SAVE, actionListener); menuFile.add(menuItemSave); // ファイル(F)>名前を付けて保存(A) JMenuItem menuItemSaveAs = setMenuItem(Constants.MenuItem.SAVE_AS, actionListener); menuFile.add(menuItemSaveAs); // ヘルプ(H) JMenu menuHelp = new JMenu(Constants.MENU_HELP_LABEL); menuHelp.setMnemonic(KeyEvent.VK_H); menuBar.add(menuHelp); // ヘルプ(H)>バージョン情報(A) JMenuItem menuItemVersion = setMenuItem(Constants.MenuItem.VERSION, actionListener); menuHelp.add(menuItemVersion); } /* * @see Logic#setMenuItem(Constants.MenuItem, java.awt.event.ActionListener) */ @Override public JMenuItem setMenuItem(Constants.MenuItem item, ActionListener actionListener) { JMenuItem menuItem = new JMenuItem(item.getLabel()); menuItem.setMnemonic(item.getMnemonic()); menuItem.setActionCommand(item.toString()); menuItem.addActionListener(actionListener); return menuItem; } /* * @see Logic#createTextArea(TextAreaProperties, javax.swing.JFrame) */ @Override public JTextArea createTextArea(TextAreaProperties properties, JFrame frame) { JTextArea textArea = new JTextArea(); JScrollPane scrollPane = new JScrollPane(textArea); scrollPane.setPreferredSize(new Dimension(properties.getWidth(), properties.getHeight())); frame.getContentPane().add(scrollPane); textArea.setBackground(Color.BLACK); textArea.setForeground(Color.WHITE); textArea.setSelectionColor(Color.BLUE); textArea.setSelectedTextColor(Color.PINK); textArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, properties .getFontSize())); textArea.setTabSize(properties.getTabSize()); textArea.setCaretColor(Color.WHITE); textArea.setLineWrap(true); textArea.grabFocus(); return textArea; } /* * @see Logic#writeFile(java.io.File, java.lang.String) */ @Override public boolean writeFile(File file, String text) { try { FileWriter fileWriter = new FileWriter(file); fileWriter.write(text); fileWriter.close(); } catch (IOException e) { e.printStackTrace(); } return true; } } ActionLogic.java import javax.swing.JFileChooser; /** * アクションに関するロジックのインターフェースです * @author mock * */ public interface ActionLogic { /** * 新規ファイルを開きます * @param model テキストエディタに関するモデル * @return JFileChooser */ public JFileChooser newFile(TextEditorModel model); /** * ファイルを開きます * @param model テキストエディタに関するモデル */ public void openFile(TextEditorModel model); /** * ファイルに上書き保存します * @param model テキストエディタに関するモデル */ public void save(TextEditorModel model); /** * ファイルに名前を付けて保存します * @param model テキストエディタに関するモデル */ public void saveAs(TextEditorModel model); /** * バージョン情報ダイアログを表示します * @param model テキストエディタに関するモデル */ public void showVersionInfo(TextEditorModel model); } ActionLogicImpl.java import java.io.File; import java.io.FileReader; import java.io.IOException; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JTextArea; /** * アクションに関するロジックの実装クラスです * @author mock * */ public class ActionLogicImpl implements ActionLogic { /** logic */ public Logic logic = new LogicImpl(); /* * @see ActionLogic#newFile(TextEditorModel) */ @Override public JFileChooser newFile(TextEditorModel model) { JFrame frame = model.getFrame(); JTextArea textArea = model.getTextArea(); frame.setTitle(Constants.UNDIFINED_TITLE); textArea.setText(""); return new JFileChooser(); } /* * @see ActionLogic#openFile(TextEditorModel) */ @Override public void openFile(TextEditorModel model) { try { JFrame frame = model.getFrame(); JTextArea textArea = model.getTextArea(); JFileChooser fileChooser = model.getFileChooser(); if (fileChooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) { File selectedFile = fileChooser.getSelectedFile(); FileReader fileReader = new FileReader(selectedFile); textArea.read(fileReader, null); fileReader.close(); frame.setTitle(fileChooser.getName(selectedFile)); } } catch (IOException e) { e.printStackTrace(); } } /* * @see ActionLogic#save(TextEditorModel) */ @Override public void save(TextEditorModel model) { JTextArea textArea = model.getTextArea(); JFileChooser fileChooser = model.getFileChooser(); // ファイルが既に開かれている場合 if (fileChooser.getSelectedFile() != null) { logic.writeFile(fileChooser.getSelectedFile(), textArea.getText()); return; } saveAs(model); } /* * @see ActionLogic#saveAs(TextEditorModel) */ @Override public void saveAs(TextEditorModel model) { JFrame frame = model.getFrame(); JTextArea textArea = model.getTextArea(); JFileChooser fileChooser = model.getFileChooser(); // ファイルダイアログ「保存」が選択された場合 if (fileChooser.showSaveDialog(frame) == JFileChooser.APPROVE_OPTION) { logic.writeFile(fileChooser.getSelectedFile(), textArea.getText()); File selectedFile = fileChooser.getSelectedFile(); frame.setTitle(fileChooser.getName(selectedFile)); } } /* * @see ActionLogic#showVersionInfo(TextEditorModel) */ @Override public void showVersionInfo(TextEditorModel model) { JFrame frame = model.getFrame(); JOptionPane.showMessageDialog(frame, Constants.VERSION, Constants.VERSION_TITLE, JOptionPane.INFORMATION_MESSAGE); } }