Jython-quick-guide
Jython-概要
Jythonは、Pythonプログラミング言語のJVM実装です。 Javaプラットフォームで実行するように設計されています。 Jythonプログラムは、任意のJavaクラスをインポートして使用できます。 Javaと同様に、Jythonプログラムは bytecode にコンパイルされます。 主な利点の1つは、Pythonで設計されたユーザーインターフェイスが AWT 、 Swing 、または* SWTパッケージ*のGUI要素を使用できることです。
JPythonとして開始され、後に名前が変更されたJythonは、 Guido Van Rossum によって作成された CPython と呼ばれる標準Python実装に厳密に従います。 Jythonは、 Jim Hugunin によって1997年に作成されました。 Jython 2.0は1999年にリリースされました。 それ以来、Jython 2.xリリースは同等のCPythonリリースに対応しています。 2015年5月にリリースされたJython 2.7.0は、CPython 2.7に対応しています。 Jython 3.xの開発は進行中です。
PythonとJavaの違い
PythonとJavaの違いは次のとおりです-
- Pythonは動的に型付けされた言語です。 したがって、変数の型宣言は必要ありません。 一方、Javaは静的に型付けされた言語です。つまり、変数の型宣言は必須であり、変更できません。
- Pythonには未チェックの例外しかありませんが、Javaにはチェック済みと未チェックの両方の例外があります。
- Pythonはスコープにインデントを使用しますが、Javaは一致する中括弧を使用します。
- Pythonはインタープリターベースの言語であるため、個別のコンパイル手順はありません。 ただし、Javaプログラムはバイトコードにコンパイルする必要があり、JVMによって実行されます。
- Pythonは多重継承をサポートしていますが、Javaでは多重継承はできません。 ただし、インターフェイスが実装されています。
- Javaと比較して、Pythonには豊富な組み込みデータ構造(リスト、辞書、タプル、すべてがオブジェクト)があります。
PythonとJythonの違い
PythonとJythonの違いは次のとおりです-
- CPythonと呼ばれるPythonのリファレンス実装は、C言語で書かれています。 一方、Jythonは完全にJavaで記述されており、JVM実装です。
- 標準のPythonは複数のプラットフォームで利用できます。 Jythonは、JVMがインストールされているすべてのプラットフォームで使用できます。
- 標準のPythonコードは .pyc ファイルにコンパイルされ、Jythonプログラムは .class ファイルにコンパイルされます。
- Python拡張機能はC言語で作成できます。 Jythonの拡張機能はJavaで記述されています。
- Jythonは本質的に本当にマルチスレッドです。 ただし、Pythonはこの目的のために Global Interpreter Lock (GIL)メカニズムを使用します。
- 両方の実装には、異なるガベージコレクションメカニズムがあります。
次の章では、JythonでJavaライブラリをインポートする方法を学びます。
Jython-インストール
Jython 2.7をインストールする前に、システムに JDK 7 以上がインストールされていることを確認してください。 Jythonは、実行可能jarファイルの形式で入手できます。 それを-http://www.jython.org/downloadslからダウンロードし、そのアイコンをダブルクリックするか、次のコマンドを実行します-
java -jar jython_installer-2.7.0.jar
インストールオプションを指定する必要があるインストールウィザードが開始されます。 体系的なインストール手順を次に示します。
ウィザードの最初のステップでは、言語を選択するように求められます。
2番目の手順では、ライセンス契約に同意するように求められます。
次のステップで、インストールタイプを選択します。 標準インストールを選択することをお勧めします。
次の画面でオプションの確認を求められ、インストールが完了します。
インストール手順の完了には時間がかかる場合があります。
インストールが完了したら、インストール先ディレクトリ内のbinディレクトリから jython.exe を呼び出します。 Jythonが C:\ jython27 にインストールされていると仮定して、コマンドラインから次を実行します。
C:\jython27\bin\jython
Pythonプロンプト(>>>)が表示され、その前でPythonステートメントまたはPythonスクリプトを実行できます。
Jython-Javaライブラリのインポート
Jythonの最も重要な機能の1つは、PythonプログラムでJavaクラスをインポートできることです。 Javaプログラムで行うのと同じように、Jythonで任意のJavaパッケージまたはクラスをインポートできます。 次の例は、Dateクラスのオブジェクトを宣言するためにPython(Jython)スクリプトで java.util パッケージをインポートする方法を示しています。
from java.util import Date
d = Date()
print d
上記のコードを保存して、コマンドラインから UtilDate.py として実行します。 現在の日時のインスタンスが表示されます。
C:\jython27\bin>jython UtilDate.py
Sun Jul 09 00:05:43 IST 2017
Javaライブラリの次のパッケージは、主に標準のPythonライブラリに同等のライブラリがないか、あまり良くないため、Jythonプログラムに頻繁にインポートされます。
- サーブレット
- JMS
- J2EE
- Javadoc
- Swingは他のGUIツールキットよりも優れていると考えられています
そのためのJavaパッケージはすべて、Jythonスクリプトにインポートできます。 ここでは、次のJavaプログラムが foo というパッケージに保存およびコンパイルされます。
package foo;
public class HelloWorld {
public void hello() {
System.out.println("Hello World!");
}
public void hello(String name) {
System.out.printf("Hello %s!", name);
}
}
この HelloWorld.class は、次のJythonスクリプトにインポートされます。 このクラスのメソッドは、Jythonスクリプト importex.py から呼び出すことができます。
from foo import HelloWorld
h = HelloWorld()
h.hello()
h.hello("finddevguides")
コマンドラインから上記のスクリプトを保存して実行し、次の出力を取得します。
C:\jython27\bin>jython importex.py
Hello World!
Hello finddevguides!
Jython-変数とデータ型
変数は、コンピューターのメモリ内の名前付きの場所です。 各変数は、その中に1つのデータを保持できます。 Javaとは異なり、Pythonは動的に型指定された言語です。 したがって、Jythonを使用している間も;変数のデータ型の事前宣言は行われません。 どのデータを格納できるかを決定する変数のタイプではなく、データが変数のタイプを決定します。
次の例では、変数に整数値が割り当てられます。 type()組み込み関数を使用して、変数の型が整数であることを確認できます。 ただし、同じ変数に文字列が割り当てられている場合、type()関数は同じ変数の型として文字列になります。
> x = 10
>>> type(x)
<class 'int'>
>>> x = "hello"
>>> type(x)
<class 'str'>
これが、Pythonが動的型付け言語と呼ばれる理由を説明しています。
次のPython組み込みデータ型もJythonで使用できます-
- 数
- ひも
- List
- タプル
- 辞書
Pythonは、数値データを、整数、浮動小数点を含む実数、または複素数である数値として認識します。 文字列、リスト、およびタプルのデータ型は、シーケンスと呼ばれます。
ジェイソン番号
Pythonでは、符号付き整数は「int」型と呼ばれます。 長整数を表すには、文字「L」が添付されます。 整数部と小数部を分離する小数点付きの数値は、「浮動」と呼ばれます。 小数部には、「E」または「e」を使用して科学表記法で表現される指数を含めることができます。
複素数は、Pythonで数値データ型としても定義されます。 複素数には、実数部(浮動小数点数)と「j」が付加された虚数部が含まれます。
8進数または16進数表現で数値を表現するために、 0O または 0X が接頭辞として付けられます。 次のコードブロックは、Pythonでの数値のさまざまな表現の例を示しています。
int -> 10, 100, -786, 80
long -> 51924361L, -0112L, 47329487234L
float -> 15.2, -21.9, 32.3+e18, -3.25E+101
complex -> 3.14j, 45.j, 3e+26J, 9.322e-36j
Jython Strings
文字列は、単一の文字で囲まれた任意の文字シーケンスです(例: 「hello」)、ダブル(例: 「hello」)またはトリプル(例: 「「hello」」o「「「hello」」」)引用符。 トリプルクォートは、文字列の内容が複数行にわたる場合に特に役立ちます。
エスケープシーケンス文字は、三重引用符で囲まれた文字列にそのまま含めることができます。 次の例は、Pythonで文字列を宣言するさまざまな方法を示しています。
str = ’hello how are you?’
str = ”Hello how are you?”
str = """this is a long string that is made up of several lines and non-printable
characters such as TAB ( \t ) and they will show up that way when displayed. NEWLINEs
within the string, whether explicitly given like this within the brackets [ \n ], or just
a NEWLINE within the variable assignment will also show up.
"""
3番目の文字列を印刷すると、次の出力が得られます。
this is a long string that is made up of
several lines and non-printable characters such as
TAB ( ) and they will show up that way when displayed.
NEWLINEs within the string, whether explicitly given like
this within the brackets [
], or just a NEWLINE within
the variable assignment will also show up.
Jythonリスト
リストはシーケンスデータ型です。 これは、角括弧に格納された、必ずしも同じタイプであるとは限らないコンマ区切りのアイテムのコレクションです。 リストの個々のアイテムには、ゼロベースのインデックスを使用してアクセスできます。
次のコードブロックは、Pythonでのリストの使用法をまとめたものです。
list1 = ['physics', 'chemistry', 1997, 2000];
list2 = [1, 2, 3, 4, 5, 6, 7 ];
print "list1[0]: ", list1[0]
print "list2[1:5]: ", list2[1:5]
次の表に、Jythonリストに関連する最も一般的なJython式の一部を示します。
Jython Expression | Description |
---|---|
len(List) | Length |
List[2]=10 | Updation |
Del List[1] | Deletion |
List.append(20) | Append |
List.insert(1,15) | Insertion |
List.sort() | Sorting |
ジェイソン・タプル
タプルは、括弧内に格納されたコンマ区切りのデータ項目の不変のコレクションです。 タプルの要素を削除または変更することも、タプルコレクションに要素を追加することもできません。 次のコードブロックは、タプル操作を示しています。
tup1 = ('physics','chemistry‘,1997,2000);
tup2 = (1, 2, 3, 4, 5, 6, 7 );
print "tup1[0]: ", tup1[0]
print "tup2[1:5]: ", tup2[1:5]
Jython辞書
Jython辞書は、Java CollectionフレームワークのMapクラスに似ています。 これは、キーと値のペアのコレクションです。 コンマで区切られたペアは、中括弧で囲まれます。 ディクショナリオブジェクトは、ハッシュ手法によって格納されるため、その中の要素を取得するためにゼロベースのインデックスに従いません。
辞書オブジェクトに同じキーを複数回使用することはできません。 ただし、複数のキーに同じ値を関連付けることができます。 辞書オブジェクトで利用可能なさまざまな機能を以下に説明します-
dict = {'011':'New Delhi','022':'Mumbai','033':'Kolkata'}
print "dict[‘011’]: ",dict['011']
print "dict['Age']: ", dict['Age']
次の表に、ディクショナリに関連する最も一般的なJython式の一部を示します。
Jython Expression | Description |
---|---|
dict.get(‘011’) | Search |
len(dict) | Length |
dict[‘044’] = ‘Chennai’ | Append |
del dict[‘022’] | Delete |
dict.keys() | list of keys |
dict.values() | List of values |
dict.clear() | Removes all elements |
Jython-Javaコレクションタイプの使用
Pythonの組み込みデータ型に加えて、Jythonは* java.utilパッケージ*をインポートすることでJavaコレクションクラスを使用する利点があります。 次のコードは、以下に示すクラスを説明しています-
- add()を使用したJava ArrayListオブジェクト
- remove()
- ArrayListクラスのget()およびset()メソッド。
import java.util.ArrayList as ArrayList
arr = ArrayList()
arr.add(10)
arr.add(20)
print "ArrayList:",arr
arr.remove(10) #remove 10 from arraylist
arr.add(0,5) #add 5 at 0th index
print "ArrayList:",arr
print "element at index 1:",arr.get(1) #retrieve item at index 1
arr.set(0,100) #set item at 0th index to 100
print "ArrayList:",arr
上記のJythonスクリプトは、次の出力を生成します-
C:\jython27\bin>jython arrlist.py
ArrayList: [10, 20]
ArrayList: [5, 20]
element at index 1: 20
ArrayList: [100, 20]
Jarrayクラス
Jythonは Jarray Object も実装します。これにより、PythonでJava配列を構築できます。 jarrayを使用するには、Jythonでシーケンスタイプを定義し、シーケンス内に含まれるオブジェクトのタイプとともにjarrayobjectに渡すだけです。 jarray内のすべての値は同じ型でなければなりません。
次の表は、jarrayで使用される文字タイプコードを示しています。
Character Typecode | Corresponding Java Type |
---|---|
Z | Boolean |
C | char |
B | byte |
H | short |
I | int |
L | long |
F | float |
D | double |
次の例は、jarrayの構築を示しています。
my_seq = (1,2,3,4,5)
from jarray import array
arr1 = array(my_seq,'i')
print arr1
myStr = "Hello Jython"
arr2 = array(myStr,'c')
print arr2
ここで、 my_seq は整数のタプルとして定義されています。 Jarray arr1に変換されます。 2番目の例は、Jarray arr2が mySttr string シーケンスから構築されることを示しています。 上記のスクリプト jarray.py の出力は次のとおりです-
array('i', [1, 2, 3, 4, 5])
array('c', 'Hello Jython')
Jython-意思決定コントロール
意思決定構造には、プログラムによって評価またはテストされる1つ以上の条件、条件が真であると判断された場合に実行されるステートメント、およびオプションで条件が実行された場合に実行される他のステートメントが含まれます。偽と判断されます。
次の図は、ほとんどのプログラミング言語で見られる典型的な意思決定構造の一般的な形式を示しています-
Jythonは、条件がtrueまたはfalse(Javaの場合)のときに実行されるステートメントのブロックを示すために中括弧を使用しません。 代わりに、均一インデント(左マージンからの空白)がステートメントのブロックを形成するために使用されます。 このように均一にインデントされたブロックにより、「if」ステートメントで指定された条件が真のときに条件コードが実行されます。
オプションの「else」ステートメントの後に、同様のブロックが存在する場合があります。 Jythonは、連続条件をテストできる* elifステートメント*も提供します。 ここでは、* else節*が最後に表示され、前の条件がすべて失敗した場合にのみ実行されます。 if..elif..else を使用する一般的な構文は次のとおりです。
if expression1:
statement(s)
elif expression2:
statement(s)
elif expression3:
statement(s)
else:
statement(s)
次の例では、 .. elif ..else 構造を使用して、ユーザーが入力した金額のさまざまな値の割引を計算します。
discount = 0
amount = input("enter Amount")
if amount>1000:
discount = amount*0.10
elif amount>500:
discount = amount*0.05
else:
discount = 0
print 'Discount = ',discount
print 'Net amount = ',amount-discount
上記のコードの出力は次のようになります。
enter Amount1500
Discount = 150.0
Net amount = 1350.0
enter Amount600
Discount = 30.0
Net amount = 570.0
enter Amount200
Discount = 0
Net amount = 200
Jython-ループ
一般に、プログラム内のステートメントは順番に実行されます。関数の最初のステートメントが最初に実行され、次に2番目のステートメントが実行されます。 コードのブロックを数回実行する必要がある場合があります。 このような繰り返し機能を提供するステートメントは、*ループステートメント*と呼ばれます。
Jythonでは、ループは次の2つのステートメントで形成できます-
- while ステートメントと
- for ステートメント
WHILEループ
Jythonのwhileループステートメントは、Javaのステートメントと似ています。 特定の条件が真である限り、ステートメントのブロックを繰り返し実行します。 次のフローチャートは、 while ループの動作を説明しています。
whileステートメントの一般的な構文を以下に示します。
while expression:
statement(s)
次のJythonコードは、whileループを使用して、変数の値がゼロより小さくなるまで繰り返し増分し、出力します。
count = 0
while count<10:
count = count+1
print "count = ",count
print "Good Bye!"
出力-出力は次のようになります。
count = 1
count = 2
count = 3
count = 4
count = 5
count = 6
count = 7
count = 8
count = 9
count = 10
Good Bye!
FORループ
JythonのFORループは、Javaのようなカウントループではありません。 代わりに、文字列、リスト、タプルなどのシーケンスデータ型の要素を走査する機能があります。 JythonのFORステートメントの一般的な構文は次のとおりです-
for iterating_var in sequence:
statements(s)
以下に示すように、FOR文を使用して、文字列の各文字、およびリストまたはタプルの各項目を表示できます-
#each letter in string
for letter in 'Python':
print 'Current Letter :', letter
出力-出力は次のようになります。
Current Letter : P
Current Letter : y
Current Letter : t
Current Letter : h
Current Letter : o
Current Letter : n
次の別のインスタンスを考えてみましょう。
#each item in list
libs = [‘PyQt’, 'WxPython', 'Tkinter']
for lib in libs: # Second Example
print 'Current library :', lib
出力-出力は次のようになります。
Current library : PyQt
Current library : WxPython
Current library : Tkinter
考慮すべきもう1つのインスタンスを次に示します。
#each item in tuple
libs = (‘PyQt’, 'WxPython', 'Tkinter')
for lib in libs: # Second Example
print 'Current library :', lib
出力-上記のプログラムの出力は次のとおりです。
Current library : PyQt
Current library : WxPython
Current library : Tkinter
Jythonでは、 for ステートメントは、range()関数によって生成された数値のリストを反復処理するためにも使用されます。 range()関数は次の形式を取ります-
range[([start],stop,[step])
開始およびステップパラメータは、デフォルトで0および1です。 最後に生成された番号は停止ステップです。 FORステートメントは、* range()関数*によって形成されたリストを走査します。 たとえば-
for num in range(5):
print num
それは次の出力を生成します-
0
1
2
3
4
Jython-関数
複雑なプログラミングロジックは、関数と呼ばれる独立した再利用可能なステートメントブロックに分割されます。 Pythonの標準ライブラリには、多数の組み込み関数が含まれています。 def キーワードを使用して独自の関数を定義することもできます。 関数のユーザー定義名の後には、本体を形成するステートメントのブロックが続き、returnステートメントで終了します。
定義されると、任意の環境から何度でも呼び出すことができます。 ポイントを明確にするために、次のコードを考えてみましょう。
#definition of function
defSayHello():
"optional documentation string"
print "Hello World"
return
#calling the function
SayHello()
関数は、呼び出し環境から1つ以上のパラメーター/引数を受け取るように設計できます。 このようなパラメーター化された関数を呼び出す間、関数定義で使用される同様のデータ型で同じ数のパラメーターを提供する必要があります。そうでない場合、Jythonインタープリターは TypeError 例外をスローします。
例
#defining function with two arguments
def area(l,b):
area = l*b
print "area = ",area
return
#calling function
length = 10
breadth = 20
#with two arguments. This is OK
area(length, breadth)
#only one argument provided. This will throw TypeError
area(length)
- 出力*は次のようになります-
area = 200
Traceback (most recent call last):
File "area.py", line 11, in <module>
area(length)
TypeError: area() takes exactly 2 arguments (1 given)
定義されたステップを実行した後、呼び出された関数は呼び出し環境に戻ります。 関数の定義内でreturnキーワードの前に式が記述されている場合、データを返すことができます。
#defining function
def area(l,b):
area = l*b
print "area = ",area
return area
#calling function
length = 10
breadth = 20
#calling function and obtaining its reurned value
result = area(length, breadth)
print "value returned by function : ", result
上記のスクリプトをJythonプロンプトから実行すると、次の出力が取得されます。
area = 200
value returned by function : 200
Jython-モジュール
モジュールは、1つ以上の関連する関数、クラス、または変数が定義されているJythonスクリプトです。 これにより、Jythonコードを論理的に編成できます。 モジュールまたはモジュールから特定の要素(関数/クラス)をインポートすることにより、モジュールで定義されたプログラム要素を別のJythonスクリプトで使用できます。
次のコード(hello.py)では、関数* SayHello()*が定義されています。
#definition of function
defSayHello(str):
print "Hello ", str
return
別のスクリプトからSayHello()関数を使用するには、その中に* hello.pyモジュール*をインポートします。
import hello
hello.SayHello("finddevguides")
ただし、これにより、モジュールで定義されているすべての関数がインポートされます。 モジュールから特定の関数をインポートするには、次の構文を使用します。
from modname import name1[, name2[,... nameN]
たとえば、SayHello()関数のみをインポートするには、上記のスクリプトを次のように変更します。
from hello import SayHello
SayHello("finddevguides")
関数の呼び出し中にモジュールの名前をプレフィックスする必要はありません。
Jython-パッケージ
1つ以上のJythonモジュールを含むフォルダーは、パッケージとして認識されます。 ただし、使用する関数のインデックスを提供する init。py という特別なファイルが必要です。
パッケージの作成とインポートの方法を理解しましょう。
ステップ1 *- *package1 というフォルダーを作成し、次の g モジュールを作成して保存します。
#fact.py
def factorial(n):
f = 1
for x in range(1,n+1):
f = f*x
return f
#sum.py
def add(x,y):
s = x+y
return s
#mult.py
def multiply(x,y):
s = x*y
return s
ステップ2 *-package1フォルダーで、次の内容の *init。py ファイルを作成して保存します。
#__init__.py
from fact import factorial
from sum import add
from mult import multiply
ステップ3 *-package1フォルダーの外部に次のJythonスクリプトを *test.py として作成します。
# Import your Package.
import package1
f = package1.factorial(5)
print "factorial = ",f
s = package1.add(10,20)
print "addition = ",s
m = package1.multiply(10,20)
print "multiplication = ",m
- ステップ4 *-Jythonプロンプトからtest.pyを実行します。 次の出力が取得されます。
factorial = 120
addition = 30
multiplication = 200
Jython-Javaアプリケーション
ダウンロード jython-standalone-2.7.0.jar -JythonをJavaアプリケーションに埋め込むには、公式ダウンロードページ(http://www.jython.org/downloadsl)からJava CLASSPATH環境変数にこのjarファイルを含めます。
このライブラリには PythonInterpreter クラスが含まれています。 このクラスのオブジェクトを使用すると、* execfile()メソッドを使用してPythonスクリプトを実行できます。 PythonInterpreterを使用すると、 *PyObjects を直接使用できます。 Jythonランタイムシステムに認識されているすべてのオブジェクトは、クラスPyObjectのインスタンスまたはそのサブクラスの1つによって表されます。
PythonInterpreterクラスには定期的に使用されるメソッドがいくつかあります。これらのメソッドについては、以下の表で説明します。
Sr.No. | Method & Description |
---|---|
1 |
setIn(PyObject) 標準入力ストリームに使用するPythonオブジェクトを設定します |
2 |
setIn(java.io.Reader) 標準入力ストリームに使用するjava.io.Readerを設定します |
3 |
setIn(java.io.InputStream) 標準入力ストリームに使用するjava.io.InputStreamを設定します |
4 |
setOut(PyObject) 標準出力ストリームに使用するPythonオブジェクトを設定します |
5 |
setOut(java.io.Writer) 標準出力ストリームに使用するjava.io.Writerを設定します |
6 |
setOut(java,io.OutputStream) 標準出力ストリームに使用するjava.io.OutputStreamを設定します |
7 |
setErr(PyObject) 標準エラーストリームに使用するPythonエラーオブジェクトを設定する |
8 |
setErr(java.io.Writer 標準エラーストリームに使用するjava.io.Writerを設定します |
9 |
setErr(java.io.OutputStream) 標準エラーストリームに使用するjava.io.OutputStreamを設定します |
10 |
eval(String) 文字列をPythonソースとして評価し、結果を返します |
11 |
eval(PyObject) Pythonコードオブジェクトを評価し、結果を返す |
12 |
exec(String) ローカル名前空間でPythonソース文字列を実行します |
13 |
exec(PyObject) ローカル名前空間でPythonコードオブジェクトを実行する |
14 |
execfile(String filename) ローカル名前空間でPythonソースのファイルを実行します |
15 |
execfile(java.io.InputStream) ローカル名前空間でPythonソースの入力ストリームを実行します |
16 |
compile(String) Pythonソース文字列を式またはモジュールとしてコンパイルします |
17 |
compile(script, filename) Pythonソースのスクリプトを式またはモジュールとしてコンパイルします |
18 |
set(String name, Object value) ローカル名前空間にオブジェクト型の変数を設定します |
19 |
set(String name, PyObject value) ローカル名前空間でPyObject型の変数を設定します |
20 |
get(String) ローカル名前空間の変数の値を取得します |
21 |
get(String name, Classjavaclass ローカル名前空間の変数の値を取得します。 値は、指定されたJavaクラスのインスタンスとして返されます。 |
次のコードブロックは、PythonInterpreterオブジェクトのJythonスクリプト*“ hello.py” .usingexecfile()*メソッドが埋め込まれたJavaプログラムです。 また、set()およびget()メソッドを使用してPython変数を設定または読み取る方法も示します。
import org.python.util.PythonInterpreter;
import org.python.core.*;
public class SimpleEmbedded {
public static void main(String []args) throws PyException {
PythonInterpreter interp = new PythonInterpreter();
System.out.println("Hello, world from Java");
interp.execfile("hello.py");
interp.set("a", new PyInteger(42));
interp.exec("print a");
interp.exec("x = 2+2");
PyObject x = interp.get("x");
System.out.println("x: "+x);
System.out.println("Goodbye ");
}
}
上記のJavaプログラムをコンパイルして実行し、次の出力を取得します。
Hello, world from Java
hello world from Python
42
x: 4
Goodbye
Jython-Eclipseプラグイン
PyDevはEclipse IDEのオープンソースプラグインであり、Python、Jython、IronPythonでのプロジェクト開発を可能にします。 https://pydev.orgでホストされています。 Eclipse IDEにPyDevプラグインをインストールするための段階的な手順を以下に示します。
- ステップ1 *-Eclipse IDEを開き、[ヘルプ]メニューから[新しいソフトウェアのインストール]オプションを選択します。
ステップ2 *-ラベル付き作業の前にあるテキストボックスに http://pydev.org/updates*と入力し、追加をクリックします。 リスト内の利用可能なすべてのエントリを選択し、[次へ]をクリックします。 ウィザードはインストールを完了するのに数分かかり、IDEの再起動を促します。
- ステップ3 *-[ウィンドウ]メニューから設定オプションを選択します。 下に示すように、[設定]ダイアログが開きます。
ステップ4 *-[インタープリター]ノードを展開し、左側のペインで[Jythonインタープリター]を選択します。 右側のペインで、「新規」をクリックして、 jython.jarファイル*へのパスを指定します。
これで、Eclipseを使用してJythonプロジェクトを開始する準備が整いました。
Jython-Eclipseのプロジェクト
Eclipseでプロジェクトを作成するには、以下の手順に従う必要があります。
ステップ1 *-ファイルを選択しますか? 新しい? プロジェクト。 フィルターダイアログから *PyDev を選択します。 プロジェクト名、プロジェクトタイプを入力し、[完了]をクリックします。
- ステップ2 *-Helloプロジェクトが左側のプロジェクトエクスプローラーに表示されます。 右クリックしてhello.pyを追加します。
- ステップ3 *-空のhello.pyがエディターに表示されます。 Jythonコードを記述して保存します。
- ステップ4 *-メニューバーの[実行]ボタンをクリックします。 以下に示すように、コンソールウィンドウに出力が表示されます。
Jython-NetBeansプラグインおよびプロジェクト
NetBeansのPythonおよびJythonサポートは、* nbPythonプラグイン*を介して利用できます。 次のURLからプラグインをダウンロードします-http://plugins.netbeans.org/plugin/56795。 ダウンロードしたアーカイブをいくつかのフォルダーに解凍します。 たとえば- d:\ nbplugin 。 NetBeansプラグインをインストールするには、以下の手順に従ってください。
ステップ1 *- *Netbeans IDE を起動し、ツール/プラグインに移動してプラグインマネージャーを開きます。 [ダウンロード済み]タブを選択し、ダウンロードしたファイルが解凍されたフォルダーを参照します。 NetBeansウィンドウが次のように表示されます。
ステップ2 *-次のステップは、すべての *.nbm ファイルを選択し、開くをクリックします。
- ステップ3 *-[インストール]ボタンをクリックします。
- ステップ4 *-次のライセンス契約に同意して続行します。
プラグインの信頼できないソースに関する警告を無視し、IDEを再起動して続行します。
NetBeansのJythonプロジェクト
再起動したら、ファイル/新規を選択して新しいプロジェクトを開始します。 Pythonカテゴリがカテゴリリストで利用可能になります。 続行するには選択してください。
システムにPythonがインストールされている場合、そのバージョンが自動的に検出され、Pythonプラットフォームのドロップダウンリストに表示されます。 ただし、Jythonはリストされません。 [管理]ボタンをクリックして追加します。
[新規]ボタンをクリックして、プラットフォーム名とJython実行可能ファイルへのパスを追加します。
Jythonがプラットフォームリストで利用可能になります。 次のスクリーンショットに示すように、ドロップダウンリストから選択します。
次のウィンドウでプロジェクト名、場所、メインファイルを入力できます。
プロジェクト構造がNetBeans IDEのプロジェクトウィンドウに表示され、テンプレートPythonコードがエディターウィンドウに表示されます。
Jythonプロジェクトをビルドおよび実行して、NetBeans IDEの出力ウィンドウで次の結果を取得します。
Jython-サーブレット
Javaサーブレットは、最も広く使用されているWeb開発手法です。 Jythonを使用してサーブレットを作成できます。これにより、Python言語機能も利用できるようになったため、Javaが提供する以上の多くの利点が追加されます。
NetBeans IDEを使用して、Jythonサーブレットを使用してJava Webアプリケーションを開発します。 NetBeansインストールに* nbPythonプラグイン*がインストールされていることを確認してください。 次のパスを選択して、新しいプロジェクトを開始し、Webアプリケーションを構築します-ファイル→新しいプロジェクト→Java Web→新しいWebアプリケーション。
プロジェクトの名前と場所を指定します。 IDEはプロジェクトフォルダー構造を作成します。 「プロジェクト」ウィンドウのソースパッケージノードの下にJavaサーブレットファイル(ServletTest.java)を追加します。 これにより、プロジェクトのlibフォルダーに servlet-api.jar が追加されます。 また、IDEにweb.xml * descriptorファイル*を作成させます。 ServletTest.java に次のコードを追加します。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ServletTest extends HttpServlet {
public void doGet (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType ("text/html");
PrintWriter toClient = response.getWriter();
toClient.println (
"<html>
<head>
<title>Servlet Test</title>" + "
</head>
<body>
<h1>Servlet Test</h1>
</body>
</html>"
);
}
}
NetBeansによって作成されたweb.xmlファイルは次のようになります-
<web-app>
<servlet>
<servlet-name>ServletTest</servlet-name>
<servlet-class>ServletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletTest</servlet-name>
<url-pattern>/ServletTest</url-pattern>
</servlet-mapping>
</web-app>
プロジェクトをビルドして実行し、ブラウザーウィンドウの<h1>タグに表示されるテキスト Servlet Test を取得します。 したがって、アプリケーションに通常のJavaサーブレットを追加しました。
ここで、Jythonサーブレットを追加します。 Jythonサーブレットは、PyServletとも呼ばれる中間Javaサーブレットを使用して機能します。 PyServlet.classは jython standalone.jar に存在します。 WEB-INF/lib フォルダーに追加します。
次のステップは、**。pyファイル*に対するリクエストが発生したときにPyServletを呼び出すようにweb.xmlを設定することです。 これは、次のxmlコードを追加することで実行する必要があります。
<servlet>
<servlet-name>PyServlet</servlet-name>
<servlet-class>org.python.util.PyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>PyServlet</servlet-name>
<url-pattern>*.py</url-pattern>
</servlet-mapping>
完全なweb.xmlコードは次のようになります。
<web-app>
<servlet>
<servlet-name>ServletTest</servlet-name>
<servlet-class>ServletTest</servlet-class>
</servlet>
<servlet>
<servlet-name>PyServlet</servlet-name>
<servlet-class>org.python.util.PyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletTest</servlet-name>
<url-pattern>/ServletTest</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>PyServlet</servlet-name>
<url-pattern>*.py</url-pattern>
</servlet-mapping>
</web-app>
次のJythonコードをプロジェクトフォルダー内のWEB-INFフォルダーにJythonServlet.pyとして配置します。これは以前のServletTest.javaと同等です。
from javax.servlet.http import HttpServlet
class JythonServlet1 (HttpServlet):
def doGet(self,request,response):
self.doPost (request,response)
def doPost(self,request,response):
toClient = response.getWriter()
response.setContentType ("text/html")
toClient.println (
"<html>
<head>
<title>Servlet Test</title>" + "
</head>
<body>
<h1>Servlet Test</h1>
</body>
</html>"
)
プロジェクトをビルドし、ブラウザで次のURLを開きます-
*http://localhost:8080/jythonwebapp/jythonservlet.py*
ブラウザは、Java Servlet出力の場合のように、<h1>タグに Servlet Test を表示します。
Jython-JDBC
Jythonは、JDBCの使いやすいPythonラッパーを提供する* zxJDBCパッケージ*を使用します。 zxJDBCは2つの標準の橋渡しをします。 JDBC はJavaでのデータベースアクセスの標準プラットフォームであり、 DBI はPythonアプリの標準データベースAPIです。
ZxJDBCは、JDBCへのDBI 2.0標準準拠のインターフェイスを提供します。 JDBCには200を超えるドライバーがあり、それらはすべてzxJDBCで動作します。 高性能ドライバーは、以下を含むすべての主要なリレーショナルデータベースで利用可能です-
- DB2
- ダービー
- MySQL
- オラクル
- PostgreSQL
- SQLite
- SQL Serverおよび
- Sybase。
ZxJDBCパッケージは、https://sourceforge.net/projects/zxjdbc/またはhttp://www.ziclix.com/zxjdbc/からダウンロードできます。 ダウンロードしたアーカイブには、CLASSPATH環境変数に追加する必要があるZxJDBC.jarが含まれています。
MySQLデータベースとのデータベース接続を確立する予定です。 このためには、MySQL用のJDBCドライバーが必要です。 次のリンク(https://dev.mysql.com/downloads/connector/j/)から* MySQL Jコネクター*をダウンロードし、CLASSPATHにmysqlコネクターjava-5.1.42-bin.jarを含めます。
MySQLサーバーにログインし、次の構造を持つテストデータベースに学生のテーブルを作成します-
Field | Type | Width |
---|---|---|
Name | Varchar | 10 |
Age | Int | 3 |
Marks | Int | 3 |
いくつかのレコードを追加します。
Name | Age | Marks |
---|---|---|
Ravi | 21 | 78 |
Ashok | 20 | 65 |
Anil | 22 | 71 |
次のJythonスクリプトを dbconnect.py として作成します。
url = "jdbc:mysql://localhost/test"
user = "root"
password = "password"
driver = "com.mysql.jdbc.Driver"
mysqlConn = zxJDBC.connect(url, user, password, driver)
mysqlConn = con.cursor()
mysqlConn.execute(“select * from student)
for a in mysql.fetchall():
print a
Jythonプロンプトから上記のスクリプトを実行します。 学生テーブルのレコードは、次のようにリストされます-
(“Ravi”, 21, 78)
(“Ashok”, 20, 65)
(“Anil”,22,71)
これは、JythonでJDBCを確立する手順を説明しています。
Jython-Swing GUIライブラリーの使用
Jythonの主要な機能の1つは、JDKでSwing GUIライブラリを使用できることです。 標準Pythonディストリビューション(多くの場合CPythonと呼ばれます)には* Tkinter GUIライブラリ*が付属しています。 PyQt や WxPython などの他のGUIライブラリも使用できますが、swingライブラリはプラットフォームに依存しないGUIツールキットを提供します。
Jythonでswingライブラリを使用することは、Javaでswingライブラリを使用するよりもはるかに簡単です。 Javaでは、イベントバインディングを作成するために匿名クラスを使用する必要があります。 Jythonでは、同じ目的で関数を渡すだけです。
基本的なトップレベルウィンドウは、* JFrameクラス*のオブジェクトを宣言し、そのvisibleプロパティをtrueに設定することにより作成されます。 そのためには、Jframeクラスをswingパッケージからインポートする必要があります。
from javax.swing import JFrame
JFrameクラスには、さまざまな数の引数を持つ複数のコンストラクターがあります。 引数として文字列を取り、それをタイトルとして設定するものを使用します。
frame = JFrame(“Hello”)
visibleプロパティをtrueに設定する前に、フレームのサイズと位置のプロパティを設定します。 次のコードを frame.py として保存します。
from javax.swing import JFrame
frame = JFrame("Hello")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(300,200)
frame.setVisible(True)
コマンドプロンプトから上記のスクリプトを実行します。 ウィンドウを示す次の出力が表示されます。
swing GUIライブラリーは、Javaの javax.swing パッケージの形式で提供されます。 その主要なコンテナクラスである JFrame および JDialog は、それぞれAWTライブラリにあるFrameおよびDialogクラスから派生しています。 *JLabel、JButton、JTextFieldなどのその他のGUIコントロールは、JComponentクラスから派生しています。
次の図は、Swingパッケージクラスの階層を示しています。
次の表は、スイングライブラリのさまざまなGUIコントロールクラスをまとめたものです-
Sr.No. | Class & Description |
---|---|
1 |
JLabelオブジェクトは、テキストをコンテナに配置するためのコンポーネントです。 |
2 |
JButton このクラスはラベル付きボタンを作成します。 |
3 |
JColorChooser JColorChooserは、ユーザーが色を操作および選択できるように設計されたコントロールのペインを提供します。 |
4 |
JCheckBox JCheckBoxは、 on (true)または off (false)状態のいずれかになるグラフィカルコンポーネントです。 |
5 |
JRadioButton JRadioButtonクラスは、オン(true)またはオフ(false)状態にできるグラフィカルコンポーネントです。 グループで。 |
6 |
JList JListコンポーネントは、テキストアイテムのスクロールリストをユーザーに提示します。 |
7 |
JComboBox JComboBoxコンポーネントは、アイテムのドロップダウンリストをユーザーに提示します |
8 |
JTextField JTextFieldオブジェクトは、1行のテキストの編集を可能にするテキストコンポーネントです。 |
9 |
JPasswordField JPasswordFieldオブジェクトは、パスワード入力に特化したテキストコンポーネントです。 |
10 |
JTextArea JTextAreaオブジェクトは、複数行のテキストの編集を可能にするテキストコンポーネントです。 |
11 |
ImageIcon ImageIconコントロールは、画像からアイコンを描画するIconインターフェースの実装です |
12 |
JScrollbar Scrollbarコントロールは、ユーザーが値の範囲から選択できるようにするためのスクロールバーコンポーネントを表します。 |
13 |
JOptionPane JOptionPaneは、ユーザーに値の入力を求めるか、何かを知らせる標準のダイアログボックスのセットを提供します。 |
14 |
JFileChooser JFileChooserコントロールは、ユーザーがファイルを選択できるダイアログウィンドウを表します。 |
15 |
JProgressBar タスクが完了に向かって進行すると、進行状況バーにタスクの完了率が表示されます。 |
16 |
JSlider JSliderを使用すると、ユーザーは制限された間隔内でノブをスライドさせることにより、グラフィカルに値を選択できます。 |
17 |
JSpinner JSpinnerは、ユーザーが順序付けられたシーケンスから数値またはオブジェクト値を選択できる単一行の入力フィールドです。 |
以降の例では、これらのコントロールの一部を使用します。
Jython-レイアウト管理
Javaのレイアウトマネージャーは、 Frame、Dialog 、 Panel などのコンテナーオブジェクト内のコントロールの配置を管理するクラスです。 レイアウトマネージャーは、解像度が変更されたり、フレーム自体のサイズが変更されたりしても、フレーム内のコントロールの相対的な配置を維持します。
これらのクラスは* Layoutインターフェース*を実装しています。 次のレイアウトマネージャーは* AWTライブラリ*で定義されています-
- BorderLayout
- FlowLayout
- グリッドレイアウト
- CardLayout
- GridBagLayout
次のレイアウトマネージャーは* Swingライブラリ*で定義されています-
- BoxLayout
- GroupLayout
- ScrollPaneLayout
- SpringLayout
次の例では、AWTレイアウトマネージャーとSwingレイアウトマネージャーを使用します。
- 絶対レイアウト
- フローレイアウト
- グリッドレイアウト
- ボーダーレイアウト
- ボックスレイアウト
- グループレイアウト
次に、これらのそれぞれについて詳しく説明します。
絶対レイアウト
上記のすべてのレイアウトマネージャーを検討する前に、コンテナー内のコントロールの絶対配置を確認する必要があります。 フレームオブジェクトのレイアウト方法を「なし」に設定する必要があります。
frame.setLayout(None)
次に、* setBounds()*メソッドを呼び出してコントロールを配置します。 x位置、y位置、幅、高さの4つの引数を取ります。
たとえば、ボタンオブジェクトを絶対位置に絶対サイズで配置する場合。
btn = JButton("Add")
btn.setBounds(60,80,60,20)
同様に、位置とサイズを適切に割り当てることにより、すべてのコントロールを配置できます。 このレイアウトは比較的簡単に使用できますが、ウィンドウのサイズが変更されたり、画面の解像度が変更されたときにプログラムが実行されたりすると、外観を維持できません。
次のJythonスクリプトでは、3つのJlabelオブジェクトを使用して、それぞれテキスト「phy」、「maths」、および「Total」を表示します。 これら3つの前に-JTextFieldオブジェクトが配置されます。 Buttonオブジェクトは、「Total」ラベルの上に配置されます。
まず、レイアウトをnoneに設定してJFrameウィンドウを作成します。
frame = JFrame("Hello")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(300,200)
frame.setLayout(None)
次に、絶対位置とサイズに応じて異なるコントロールが追加されます。 完全なコードは以下のとおりです-
from javax.swing import JFrame, JLabel, JButton, JTextField
frame = JFrame("Hello")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(300,200)
frame.setLayout(None)
lbl1 = JLabel("Phy")
lbl1.setBounds(60,20,40,20)
txt1 = JTextField(10)
txt1.setBounds(120,20,60,20)
lbl2 = JLabel("Maths")
lbl2.setBounds(60,50,40,20)
txt2 = JTextField(10)
txt2.setBounds(120, 50, 60,20)
btn = JButton("Add")
btn.setBounds(60,80,60,20)
lbl3 = JLabel("Total")
lbl3.setBounds(60,110,40,20)
txt3 = JTextField(10)
txt3.setBounds(120, 110, 60,20)
frame.add(lbl1)
frame.add(txt1)
frame.add(lbl2)
frame.add(txt2)
frame.add(btn)
frame.add(lbl3)
frame.add(txt3)
frame.setVisible(True)
上記のコードの出力は次のとおりです。
Jython FlowLayout
FlowLayoutは、コンテナクラスのデフォルトのレイアウトマネージャーです。 コントロールを左から右へ、そして上から下へと配置します。
次の例では、FlowLayoutマネージャーを使用して、Jlabelオブジェクト、JTextFieldオブジェクト、およびJButtonオブジェクトをJFrameに表示します。 まず、必要なクラスを javax.swing パッケージと java.awt パッケージからインポートしましょう。
from javax.swing import JFrame, JLabel, JButton, JTextField
from java.awt import FlowLayout
次に、JFrameオブジェクトを作成し、その場所とサイズのプロパティを設定します。
frame = JFrame("Hello")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(200,200)
Set the layout manager for the frame as FlowLayout.
frame.setLayout(FlowLayout())
JLabel、JTextfield、およびJButtonクラスのオブジェクトを宣言します。
label = JLabel("Welcome to Jython Swing")
txt = JTextField(30)
btn = JButton("ok")
最後に、JFrameクラスの* add()*メソッドを呼び出して、これらのコントロールをフレームに追加します。
frame.add(label)
frame.add(txt)
frame.add(btn)
フレームを表示するには、そのvisibleプロパティをtrueに設定します。 完全なJythonスクリプトとその出力は以下のとおりです-
from javax.swing import JFrame, JLabel, JButton, JTextField
from java.awt import FlowLayout
frame = JFrame("Hello")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(200,200)
frame.setLayout(FlowLayout())
label = JLabel("Welcome to Jython Swing")
txt = JTextField(30)
btn = JButton("ok")
frame.add(label)
frame.add(txt)
frame.add(btn)
frame.setVisible(True)
Jython GridLayout
Gridlayoutマネージャーでは、長方形のグリッドにコントロールを配置できます。 グリッドの各セルに1つのコントロールが配置されます。
次の例では、GridLayoutがJFrameオブジェクトに適用され、4行4列に分割されます。 JButtonオブジェクトは、グリッドの各セルに配置されます。
最初に必要なライブラリをインポートしましょう-
from javax.swing import JFrame, JButton
from java.awt import GridLayout
次に、JFrameコンテナを作成します-
frame = JFrame("Hello")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(400,400)
次に、4 x 4の寸法を指定してGridLayoutを適用します。
frame.setLayout(GridLayout(4,4))
ここで、それぞれ1から4までの2つのFORループを使用する必要があります。そのため、16個のJButtonオブジェクトが後続のセルに配置されます。
k = 0
frame.setLayout(GridLayout(4,4))
for i in range(1,5):
for j in range(1,5):
k = k+1
frame.add(JButton(str(k)))
最後に、フレームの可視性をtrueに設定します。 完全なJythonコードを以下に示します。
from javax.swing import JFrame, JButton
from java.awt import GridLayout
frame = JFrame("Hello")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(400,400)
frame.setLayout(GridLayout(4,4))
k = 0
for i in range(1,5):
for j in range(1,5):
k = k+1
frame.add(JButton(str(k)))
frame.setVisible(True)
上記のコードの出力は次のとおりです-
Jython BorderLayout
BorderLayoutマネージャーは、コンテナーを5つの地理的地域と場所に分割し、各地域に1つのコンポーネントを配置します。 これらの領域は、次のように定義された定数で表されます-
- BorderLayout.NORTH
- BorderLayout.SOUTH
- BorderLayout.EAST
- BorderLayout.WEST
- BorderLayout.CENTER
私たちは次の例を考えてみましょう-
Jython BoxLayout
BoxLayoutクラスは* javax.swingパッケージ*で定義されています。 コンテナ内のコンポーネントを垂直または水平に配置するために使用されます。 方向は、次の定数によって決定されます-
- X_AXIS
- Y_AXIS
- LINE_AXIS
- PAGE_AXIS
整数定数は、コンテナのコンポーネントが配置される軸を指定します。 コンテナのコンポーネントの向きがデフォルトの場合、LINE_AXISはコンポーネントを左から右に配置することを指定し、PAGE_AXISはコンポーネントを上から下に配置することを指定します。
次の例では、(JPanelクラスの)パネルがJFrameオブジェクトに追加されます。 垂直BoxLayoutが適用され、さらに2つのパネル(上部と下部)が追加されます。 これらの2つの内部パネルには、水平のBoxlayoutにそれぞれ追加された2つのボタンがあります。
最初にトップレベルのJFrameウィンドウを作成しましょう。
frame = JFrame()
frame.setTitle("Buttons")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setSize(300, 150)
JPanelオブジェクトは、垂直BoxLayoutを持つと宣言されます。 トップレベルのフレームに追加します。
panel = JPanel()
panel.setLayout(BoxLayout(panel, BoxLayout.Y_AXIS))
frame.add(panel)
このパネルでは、上下に2つのパネルが追加されます。 それぞれに2つのJButtonオブジェクトが水平方向に追加され、25ピクセルのスペースホルダーがそれらを分離します。
###top panel
top = JPanel()
top.setLayout(BoxLayout(top, BoxLayout.X_AXIS))
b1 = JButton("OK")
b2 = JButton("Close")
top.add(Box.createVerticalGlue())
top.add(b1)
top.add(Box.createRigidArea(Dimension(25, 0)))
top.add(b2)
同様に、下部パネルが構築されます。
###bottom panel
bottom = JPanel()
bottom.setLayout(BoxLayout(bottom, BoxLayout.X_AXIS))
b3 = JButton("Open")
b4 = JButton("Save")
bottom.add(b3)
bottom.add(Box.createRigidArea(Dimension(25, 0)))
bottom.add(b4)
bottom.add(Box.createVerticalGlue())
- createRigidArea()関数は、2つのボタンの間に25ピクセルのスペースを作成するために使用されることに注意してください。 また、 createVerticalGlue()*関数は、レイアウトの先頭または末尾のスペースを占有します。
まず、上部パネルと下部パネルを追加し、フレームの可視性プロパティをtrueに設定します。 完全なコードは次のとおりです-
from java.awt import Dimension
from javax.swing import JButton, JFrame,JPanel,BoxLayout,Box
frame = JFrame()
frame.setTitle("Buttons")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setSize(300, 150)
panel = JPanel()
panel.setLayout(BoxLayout(panel, BoxLayout.Y_AXIS))
frame.add(panel)
###top panel
top = JPanel()
top.setLayout(BoxLayout(top, BoxLayout.X_AXIS))
b1 = JButton("OK")
b2 = JButton("Close")
top.add(Box.createVerticalGlue())
top.add(b1)
top.add(Box.createRigidArea(Dimension(25, 0)))
top.add(b2)
###bottom panel
bottom = JPanel()
bottom.setLayout(BoxLayout(bottom, BoxLayout.X_AXIS))
b3 = JButton("Open")
b4 = JButton("Save")
bottom.add(b3)
bottom.add(Box.createRigidArea(Dimension(25, 0)))
bottom.add(b4)
bottom.add(Box.createVerticalGlue())
panel.add(bottom)
panel.add(top)
frame.setVisible(True)
上記のコードは以下の出力を生成します。
Jython GroupLayout
GroupLayoutマネージャーは、コンポーネントを階層的にグループ化します。 グループ化は、 SequentialGroup および ParallelGroup の2つのクラスによって行われ、どちらもJavaでGroupインターフェースを実装します。
レイアウト手順は2つのステップに分かれています。 ワンステップでは、コンポーネントは水平軸に沿って配置され、2番目は垂直軸に沿って配置されます。 各コンポーネントは、レイアウトで2回定義する必要があります。
配列には、順次配列と並列配列の2種類があります。 どちらの場合も、コンポーネントを順次または並列に配置できます。 水平配置では、行は順次グループと呼ばれ、列は並列グループと呼ばれます。 一方、並列配置では、要素の行は並列グループと列であり、これは順次と呼ばれます。
次の例では、5つのボタンが、それぞれが行と列に表示されるように配置されています。 まず、JFrameウィンドウにJpanelオブジェクトを追加し、そのレイアウトをGrouplayoutとして設定します。
frame = JFrame()
panel = JPanel()
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
layout = GroupLayout(panel)
panel.setLayout(layout)
次に、JButtonオブジェクトを構築します-
buttonD = JButton("D")
buttonR = JButton("R")
buttonY = JButton("Y")
buttonO = JButton("O")
buttonT = JButton("T")
次に、buttonDとbuttonYが追加される LeftToRight という名前の SequentialGroup を作成します。 それらの間に、ParallelGroup ColumnMiddle(他の3つのボタンが垂直に追加されます)が配置されます。
leftToRight = layout.createSequentialGroup()
leftToRight.addComponent(buttonD)
columnMiddle = layout.createParallelGroup()
columnMiddle.addComponent(buttonR)
columnMiddle.addComponent(buttonO)
columnMiddle.addComponent(buttonT)
leftToRight.addGroup(columnMiddle)
leftToRight.addComponent(buttonY)
次に、TopToBottomと呼ばれる垂直SequentialGroupの定義があります。 3つのボタンのParallelGroup行を追加し、2つのボタンを垂直に置きます。
topToBottom = layout.createSequentialGroup()
rowTop = layout.createParallelGroup()
rowTop.addComponent(buttonD)
rowTop.addComponent(buttonR)
rowTop.addComponent(buttonY)
topToBottom.addGroup(rowTop)
topToBottom.addComponent(buttonO)
topToBottom.addComponent(buttonT)
最後に、LeftToRightグループを水平に、TopToBottomグループをレイアウトオブジェクトに垂直に設定します。 完全なコードは以下のとおりです-
from javax.swing import JButton, JFrame,JPanel,GroupLayout
frame = JFrame()
panel = JPanel()
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
layout = GroupLayout(panel)
panel.setLayout(layout)
buttonD = JButton("D")
buttonR = JButton("R")
buttonY = JButton("Y")
buttonO = JButton("O")
buttonT = JButton("T")
leftToRight = layout.createSequentialGroup()
leftToRight.addComponent(buttonD)
columnMiddle = layout.createParallelGroup()
columnMiddle.addComponent(buttonR)
columnMiddle.addComponent(buttonO)
columnMiddle.addComponent(buttonT)
leftToRight.addGroup(columnMiddle)
leftToRight.addComponent(buttonY)
topToBottom = layout.createSequentialGroup()
rowTop = layout.createParallelGroup()
rowTop.addComponent(buttonD)
rowTop.addComponent(buttonR)
rowTop.addComponent(buttonY)
topToBottom.addGroup(rowTop)
topToBottom.addComponent(buttonO)
topToBottom.addComponent(buttonT)
layout.setHorizontalGroup(leftToRight)
layout.setVerticalGroup(topToBottom)
frame.add(panel)
frame.pack()
frame.setVisible(True)
上記のコードの出力は次のとおりです-
Jython-イベント処理
Java swingでのイベント処理では、コントロール(JButtonやJListなど)をそれぞれのイベントリスナーに登録する必要があります。 イベントリスナインターフェイスまたは対応するアダプタクラスは、そのイベント処理メソッドをオーバーライドして実装またはサブクラス化する必要があります。 Jythonでは、イベント処理は非常に簡単です。 コントロールに対応するイベント処理関数のプロパティとして任意の関数を渡すことができます。
まず、Javaでクリックイベントがどのように処理されるかを見てみましょう。
まず、* java.awt.eventパッケージ*をインポートする必要があります。 次に、JFrameを拡張するクラスは、ActionListenerインターフェイスを実装する必要があります。
public class btnclick extends JFrame implements ActionListener
次に、JButtonオブジェクトを宣言し、フレームのContentPaneに追加し、addActionListener()メソッドによってActionListenerに登録する必要があります。
JButton b1 = new JButton("Click here");
getContentPane().add(b1);
b1.addActionListener(this);
ここで、ActionEventを処理するには、ActionListenerインターフェイスのactionPerformed()メソッドをオーバーライドする必要があります。
以下はJavaコード全体です-
import java.awt.event.*;
import javax.swing.*;
public class btnclick extends JFrame implements ActionListener {
btnclick() {
JButton b1 = new JButton("Click here");
getContentPane().add(b1);
b1.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
System.out.println("Clicked");
}
public static void main(String args[]) {
btnclick b = new btnclick();
b.setSize(300,200);
b.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
b.setVisible(true);
}
}
次に、同じコードに相当するJythonコードを記述します。
まず、ActionEventまたはActionListenerをインポートする必要はありません。Jythonの動的な型付けにより、これらのクラスをコードで言及することを回避できるためです。
第二に、ActionListenerを実装またはサブクラス化する必要はありません。 代わりに、ユーザー定義関数は、 actionPerformed Beanプロパティの値としてJButtonコンストラクターにすぐに提供されます。
button = JButton('Click here!', actionPerformed = clickhere)
- clickhere()*関数は、ボタンのクリックイベントを処理する通常のJython関数として定義されています。
def change_text(event):
print clicked!'
Jythonの同等のコードを次に示します。
from javax.swing import JFrame, JButton
frame = JFrame("Hello")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(300,200)
def clickhere(event):
print "clicked"
btn = JButton("Add", actionPerformed = clickhere)
frame.add(btn)
frame.setVisible(True)
JavaとJythonのコードの出力は同じです。 ボタンがクリックされると、コンソールに「クリックされました」というメッセージが印刷されます。
次のJythonコードでは、2つのJTextFieldオブジェクトがJFrameウィンドウに提供され、「phy」と「maths」にマークを入力します。 JButtonオブジェクトは、クリックされるとadd()関数を実行します。
btn = JButton("Add", actionPerformed = add)
add()関数は、getText()メソッドによって2つのテキストフィールドの内容を読み取り、それらを整数に解析して、加算を実行できるようにします。 結果は、setText()メソッドによって3番目のテキストフィールドに配置されます。
def add(event):
print "add"
ttl = int(txt1.getText())+int(txt2.getText())
txt3.setText(str(ttl))
完全なコードは以下のとおりです-
from javax.swing import JFrame, JLabel, JButton, JTextField
from java.awt import Dimension
frame = JFrame("Hello")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(300,200)
frame.setLayout(None)
def add(event):
print "add"
ttl = int(txt1.getText())+int(txt2.getText())
txt3.setText(str(ttl))
lbl1 = JLabel("Phy")
lbl1.setBounds(60,20,40,20)
txt1 = JTextField(10)
txt1.setBounds(120,20,60,20)
lbl2 = JLabel("Maths")
lbl2.setBounds(60,50,40,20)
txt2 = JTextField(10)
txt2.setBounds(120, 50, 60,20)
btn = JButton("Add", actionPerformed = add)
btn.setBounds(60,80,60,20)
lbl3 = JLabel("Total")
lbl3.setBounds(60,110,40,20)
txt3 = JTextField(10)
txt3.setBounds(120, 110, 60,20)
frame.add(lbl1)
frame.add(txt1)
frame.add(lbl2)
frame.add(txt2)
frame.add(btn)
frame.add(lbl3)
frame.add(txt3)
frame.setVisible(True)
上記のコードがコマンドプロンプトから実行されると、次のウィンドウが表示されます。 「Phy」、「数学」のマークを入力し、「追加」ボタンをクリックします。 結果はそれに応じて表示されます。
Jython JRadioButtonイベント
JRadioButtonクラスは* javax.swingパッケージ*で定義されています。 オンまたはオフ状態の選択可能なトグルボタンを作成します。 ButtonGroupに複数のラジオボタンが追加される場合、それらの選択は相互に排他的です。
次の例では、JRadioButtonクラスの2つのオブジェクトと2つのJLabelが、垂直BoxLayoutのJpanelコンテナーに追加されます。 JRadioButtonオブジェクトのコンストラクターでは、* OnCheck()*関数がactionPerformedプロパティの値として設定されます。 この関数は、ラジオボタンをクリックして状態を変更すると実行されます。
rb1 = JRadioButton("Male", True,actionPerformed = OnCheck)
rb2 = JRadioButton("Female", actionPerformed = OnCheck)
ラジオボタンのデフォルトの状態はfalse(選択されていない)であることに注意してください。 ボタンrb1は、開始状態がTrue(選択済み)で作成されます。
2つのラジオボタンは、相互に排他的にするためにラジオButtonGroupに追加されるため、一方を選択すると、他方は自動的に選択解除されます。
grp = ButtonGroup()
grp.add(rb1)
grp.add(rb2)
これらの2つのラジオボタンと2つのラベルは、rb2とlbl2の間の高さが25ピクセルの区切り領域を持つ垂直レイアウトのパネルオブジェクトに追加されます。
panel = JPanel()
panel.setLayout(BoxLayout(panel, BoxLayout.Y_AXIS))
panel.add(Box.createVerticalGlue())
panel.add(lbl)
panel.add(rb1)
panel.add(rb2)
panel.add(Box.createRigidArea(Dimension(0,25)))
panel.add(lbl1)
このパネルは最上位のJFrameオブジェクトに追加され、その可視プロパティは最後に「True」に設定されます。
frame = JFrame("JRadioButton Example")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(250,200)
frame.setVisible(True)
The complete code of radio.py is given below:
from javax.swing import JFrame, JPanel, JLabel, BoxLayout, Box
from java.awt import Dimension
from javax.swing import JRadioButton,ButtonGroup
frame = JFrame("JRadioButton Example")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(250,200)
panel = JPanel()
panel.setLayout(BoxLayout(panel, BoxLayout.Y_AXIS))
frame.add(panel)
def OnCheck(event):
lbl1.text = ""
if rb1.isSelected():
lbl1.text = lbl1.text+"Gender selection : Male"
else:
lbl1.text = lbl1.text+"Gender selection : Female "
lbl = JLabel("Select Gender")
rb1 = JRadioButton("Male", True,actionPerformed = OnCheck)
rb2 = JRadioButton("Female", actionPerformed = OnCheck)
grp = ButtonGroup()
grp.add(rb1)
grp.add(rb2)
lbl1 = JLabel("Gender Selection :")
panel.add(Box.createVerticalGlue())
panel.add(lbl)
panel.add(rb1)
panel.add(rb2)
panel.add(Box.createRigidArea(Dimension(0,25)))
panel.add(lbl1)
frame.setVisible(True)
上記のJythonスクリプトを実行し、ラジオボタンの選択を変更します。 選択内容は、下部のラベルに表示されます。
Jython JCheckBoxイベント
*JRadioButton* と同様に、JCheckBoxオブジェクトも、キャプションに加えて長方形のチェック可能なボックスを持つ選択可能なボタンです。 これは通常、ユーザーがアイテムのリストから複数のオプションを選択する機会を提供するために使用されます。
次の例では、swingパッケージの2つのチェックボックスとラベルが、垂直BoxLayoutのJPanelに追加されます。 下部のラベルには、2つのチェックボックスの瞬間的な選択状態が表示されます。
両方のチェックボックスは、* OnCheck()*関数に設定されたactionPerformedプロパティを持つコンストラクターで宣言されます。
box1 = JCheckBox("Check1", actionPerformed = OnCheck)
box2 = JCheckBox("Check2", actionPerformed = OnCheck)
OnCheck()関数は、各チェックボックスの選択状態を確認し、対応するメッセージを下部のラベルに表示します。
def OnCheck(event):
lbl1.text = ""
if box1.isSelected():
lbl1.text = lbl1.text + "box1 selected "
else:
lbl1.text = lbl1.text + "box1 not selected "
if box2.isSelected():
lbl1.text = lbl1.text + "box2 selected"
else:
lbl1.text = lbl1.text + "box2 not selected"
これらのボックスとJLabelオブジェクトは、高さ50ピクセルのスペースホルダーを追加してJPanelに追加されます。
panel = JPanel()
panel.setLayout(BoxLayout(panel, BoxLayout.Y_AXIS))
panel.add(Box.createVerticalGlue())
panel.add(box1)
panel.add(box2)
panel.add(Box.createRigidArea(Dimension(0,50)))
panel.add(lbl1)
パネル自体は最上位のJFrameウィンドウに追加され、その可視プロパティは最終的にtrueに設定されます。
frame = JFrame("JCheckBox Example")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(250,150)
frame.add(panel)
frame.setVisible(True)
上記のコードを実行し、チェックボックスの選択を試してください。 両方のチェックボックスの瞬間的な状態が下部に表示されます。
Jython JListイベント
swingパッケージのJListコントロールは、選択可能な項目のスクロール可能なリストをユーザーに提供します。 JComboBoxは、アイテムのドロップダウンリストを提供します。 Javaでは、ListSelectionListenerにvalueChanged()メソッドを実装することにより、選択イベントが処理されます。 Jythonでは、イベントハンドラーはJListオブジェクトのvalueChangedプロパティに割り当てられます。
次の例では、JListオブジェクトとラベルがBorderLayoutのJFrameに追加されます。 JListには、タプル内のアイテムのコレクションが入力されます。 そのvalueChangedプロパティはlistSelect()関数に設定されます。
lang = ("C", "C++", "Java", "Python", "Perl", "C#", "VB", "PHP", "Javascript", "Ruby")
lst = JList(lang, valueChanged = listSelect)
イベントハンドラー関数は、選択されたアイテムのインデックスを取得し、JListオブジェクトから対応するアイテムをフェッチして、下部のラベルに表示します。
def listSelect(event):
index = lst.selectedIndex
lbl1.text = "Hello" + lang[index]
JListおよびJLabelオブジェクトは、BorderLayoutを使用してJFrameに追加されます。
コード全体を以下に示します-
from javax.swing import JFrame, JPanel, JLabel, JList
from java.awt import BorderLayout
frame = JFrame("JList Example")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(300,250)
frame.setLayout(BorderLayout())
def listSelect(event):
index = lst.selectedIndex
lbl1.text = "Hello" + lang[index]
lang = ("C", "C++", "Java", "Python", "Perl", "C#", "VB", "PHP", "Javascript", "Ruby")
lst = JList(lang, valueChanged = listSelect)
lbl1 = JLabel("box1 not selected box2 not selected")
frame.add(lst, BorderLayout.NORTH)
frame.add(lbl1, BorderLayout.SOUTH)
frame.setVisible(True)
次のコードの出力は次のとおりです。
Jython-メニュー
GUIベースのアプリケーションのほとんどには、上部にメニューバーがあります。 最上位ウィンドウのタイトルバーのすぐ下にあります。 javax.swingパッケージには、効率的なメニューシステムを構築するための精巧な機能があります。 JMenuBar、JMenu 、および JMenuItem クラスの助けを借りて構築されます。
次の例では、トップレベルウィンドウにメニューバーが提供されています。 3つのメニュー項目ボタンで構成されるファイルメニューがメニューバーに追加されます。 次に、BorderLayoutに設定されたレイアウトでJFrameオブジェクトを準備しましょう。
frame = JFrame("JMenuBar example")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(400,300)
frame.setLayout(BorderLayout())
JMenuBarオブジェクトは、SetJMenuBar()メソッドによってアクティブになりました。
bar = JMenuBar()
frame.setJMenuBar(bar)
次に、「ファイル」キャプションを持つJMenuオブジェクトが宣言されます。 3つのJMenuItemボタンが[ファイル]メニューに追加されます。 メニュー項目のいずれかがクリックされると、ActionEventハンドラーOnClick()関数が実行されます。 actionPerformedプロパティで定義されます。
file = JMenu("File")
newfile = JMenuItem("New",actionPerformed = OnClick)
openfile = JMenuItem("Open",actionPerformed = OnClick)
savefile = JMenuItem("Save",actionPerformed = OnClick)
file.add(newfile)
file.add(openfile)
file.add(savefile)
bar.add(file)
OnClick()イベントハンドラは、gwtActionCommand()関数によってJMenuItemボタンの名前を取得し、ウィンドウの下部のテキストボックスに表示します。
def OnClick(event):
txt.text = event.getActionCommand()
[ファイル]メニューオブジェクトがメニューバーに追加されます。 最後に、JTextFieldコントロールがJFrameオブジェクトの下部に追加されます。
txt = JTextField(10)
frame.add(txt, BorderLayout.SOUTH)
menu.pyのコード全体を以下に示します-
from javax.swing import JFrame, JMenuBar, JMenu, JMenuItem, JTextField
from java.awt import BorderLayout
frame = JFrame("JMenuBar example")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(400,300)
frame.setLayout(BorderLayout())
def OnClick(event):
txt.text = event.getActionCommand()
bar = JMenuBar()
frame.setJMenuBar(bar)
file = JMenu("File")
newfile = JMenuItem("New",actionPerformed = OnClick)
openfile = JMenuItem("Open",actionPerformed = OnClick)
savefile = JMenuItem("Save",actionPerformed = OnClick)
file.add(newfile)
file.add(openfile)
file.add(savefile)
bar.add(file)
txt = JTextField(10)
frame.add(txt, BorderLayout.SOUTH)
frame.setVisible(True)
Jythonインタープリターを使用して上記のスクリプトを実行すると、[ファイル]メニューのウィンドウが表示されます。 それをクリックすると、3つのメニュー項目がドロップダウンします。 ボタンをクリックすると、その名前がテキストボックスコントロールに表示されます。
Jython-ダイアログ
Dialogオブジェクトは、ユーザーが操作するベースウィンドウの上に表示されるウィンドウです。 この章では、swingライブラリで定義された事前設定ダイアログを確認します。 それらは MessageDialog、ConfirmDialog および InputDialog です。 これらは、JOptionPaneクラスの静的メソッドのために利用可能です。
次の例では、[ファイル]メニューに、上記の3つのダイアログに対応する3つのJMenuアイテムがあります。それぞれが OnClick イベントハンドラーを実行します。
file = JMenu("File")
msgbtn = JMenuItem("Message",actionPerformed = OnClick)
conbtn = JMenuItem("Confirm",actionPerformed = OnClick)
inputbtn = JMenuItem("Input",actionPerformed = OnClick)
file.add(msgbtn)
file.add(conbtn)
file.add(inputbtn)
OnClick()ハンドラー関数は、メニュー項目ボタンのキャプションを取得し、それぞれのshowXXXDialog()メソッドを呼び出します。
def OnClick(event):
str = event.getActionCommand()
if str == 'Message':
JOptionPane.showMessageDialog(frame,"this is a sample message dialog")
if str == "Input":
x = JOptionPane.showInputDialog(frame,"Enter your name")
txt.setText(x)
if str == "Confirm":
s = JOptionPane.showConfirmDialog (frame, "Do you want to continue?")
if s == JOptionPane.YES_OPTION:
txt.setText("YES")
if s == JOptionPane.NO_OPTION:
txt.setText("NO")
if s == JOptionPane.CANCEL_OPTION:
txt.setText("CANCEL")
メニューからメッセージオプションを選択すると、メッセージがポップアップ表示されます。 入力オプションをクリックすると、入力を求めるダイアログが表示されます。 入力テキストは、JFrameウィンドウのテキストボックスに表示されます。 [確認]オプションを選択すると、[はい]、[いいえ]、[キャンセル]の3つのボタンを含むダイアログが表示されます。 ユーザーの選択はテキストボックスに記録されます。
コード全体を以下に示します-
from javax.swing import JFrame, JMenuBar, JMenu, JMenuItem, JTextField
from java.awt import BorderLayout
from javax.swing import JOptionPane
frame = JFrame("Dialog example")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(400,300)
frame.setLayout(BorderLayout())
def OnClick(event):
str = event.getActionCommand()
if str == 'Message':
JOptionPane.showMessageDialog(frame,"this is a sample message dialog")
if str == "Input":
x = JOptionPane.showInputDialog(frame,"Enter your name")
txt.setText(x)
if str == "Confirm":
s = JOptionPane.showConfirmDialog (frame, "Do you want to continue?")
if s == JOptionPane.YES_OPTION:
txt.setText("YES")
if s == JOptionPane.NO_OPTION:
txt.setText("NO")
if s == JOptionPane.CANCEL_OPTION:
txt.setText("CANCEL")
bar = JMenuBar()
frame.setJMenuBar(bar)
file = JMenu("File")
msgbtn = JMenuItem("Message",actionPerformed = OnClick)
conbtn = JMenuItem("Confirm",actionPerformed = OnClick)
inputbtn = JMenuItem("Input",actionPerformed = OnClick)
file.add(msgbtn)
file.add(conbtn)
file.add(inputbtn)
bar.add(file)
txt = JTextField(10)
frame.add(txt, BorderLayout.SOUTH)
frame.setVisible(True)
上記のスクリプトが実行されると、次のウィンドウがメニューの3つのオプションとともに表示されます-