Jython - Краткое руководство

Jython - это JVM-реализация языка программирования Python. Он разработан для работы на платформе Java. Программа Jython может импортировать и использовать любой класс Java. Как и Java, программа Jython компилируется вbytecode. Одним из основных преимуществ является то, что пользовательский интерфейс, разработанный на Python, может использовать элементы GUIAWT, Swing или же SWT Package.

Jython, который начинался как JPython и позже был переименован, во многом следует стандартной реализации Python под названием CPython как создано Guido Van Rossum. Jython был создан в 1997 годуJim Hugunin. Jython 2.0 был выпущен в 1999 году. С тех пор выпуски Jython 2.x соответствуют эквивалентным выпускам CPython. Jython 2.7.0, выпущенный в мае 2015 года, соответствует 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.

  • Эталонная реализация Python, называемая CPython, написана на языке C. С другой стороны, Jython полностью написан на Java и является реализацией JVM.

  • Стандартный Python доступен на нескольких платформах. Jython доступен для любой платформы с установленной JVM.

  • Стандартный код Python компилируется в .pyc файл, а программа Jython компилируется в .class файл.

  • Расширения Python могут быть написаны на языке C. Расширения для Jython написаны на Java.

  • Jython по своей природе действительно многопоточный. Однако Python используетGlobal Interpreter Lock (GIL) для этой цели.

  • Обе реализации имеют разные механизмы сборки мусора.

В следующей главе мы узнаем, как импортировать библиотеки Java в Jython.

Перед установкой Jython 2.7 убедитесь, что в системе JDK 7или более установленных. Jython доступен в виде исполняемого файла jar. Скачать его из -http://www.jython.org/downloads.html и либо дважды щелкните его значок, либо выполните следующую команду -

java -jar jython_installer-2.7.0.jar

Мастер установки начнет с того, какие варианты установки необходимо указать. Вот систематическая процедура установки.

На первом этапе мастера вас попросят выбрать язык.

На втором шаге вам будет предложено принять лицензионное соглашение.

На следующем шаге выберите тип установки. Рекомендуется выбрать Стандартную установку.

На следующем экране вас попросят подтвердить варианты и продолжить установку.

Процедура установки может занять некоторое время.

После завершения установки вызовите jython.exeиз каталога bin внутри целевого каталога. Предполагая, что Jython установлен вC:\jython27выполните следующее из командной строки.

C:\jython27\bin\jython

Появится приглашение Python (>>>), перед которым может быть выполнен любой оператор Python или скрипт Python.

Одной из наиболее важных функций Jython является возможность импорта классов Java в программу Python. Мы можем импортировать любой пакет или класс java в Jython, как мы это делаем в программе Java. В следующем примере показано, какjava.util пакеты импортируются в скрипт Python (Jython) для объявления объекта класса Date.

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 чаще импортируются в программу Jython, главным образом потому, что стандартная библиотека Python либо не имеет их эквивалентов, либо не так хороша.

  • Servlets
  • JMS
  • J2EE
  • Javadoc
  • Swing считается лучше других наборов инструментов графического интерфейса.

Любой пакет 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("TutorialsPoint")

Сохраните и выполните приведенный выше сценарий из командной строки, чтобы получить следующий результат.

C:\jython27\bin>jython importex.py
Hello World!
Hello TutorialsPoint!

Переменные - это именованные места в памяти компьютера. Каждая переменная может содержать один фрагмент данных. В отличие от Java, Python - это язык с динамической типизацией. Следовательно, при использовании Jython также; предварительное объявление типа данных переменной не выполняется. Вместо того, чтобы определять, какие данные можно в ней хранить, тип переменной определяет тип переменной.

В следующем примере переменной присваивается целочисленное значение. Используя встроенную функцию type (), мы можем проверить, что тип переменной является целым числом. Но если той же переменной присвоена строка, функция type () будет строковой как тип той же переменной.

> x = 10
>>> type(x)
<class 'int'>

>>> x = "hello"
>>> type(x)
<class 'str'>

Это объясняет, почему Python называется языком с динамической типизацией.

Следующие встроенные типы данных Python также могут использоваться в Jython:

  • Number
  • String
  • List
  • Tuple
  • Dictionary

Python распознает числовые данные как число, которое может быть целым числом, действительным числом с плавающей запятой или комплексным числом. Типы данных String, List и Tuple называются последовательностями.

Номера Jython

В Python любое целое число со знаком называется типом int. Чтобы выразить длинное целое число, к нему добавляется буква «L». Число с десятичной запятой, отделяющее целую часть от дробной части, называется «float». Дробная часть может содержать показатель степени, выраженный в экспоненциальной нотации с помощью 'E' или 'e'.

Комплексное число также определяется как числовой тип данных в Python. Комплексное число состоит из действительной части (числа с плавающей запятой) и мнимой части, к которой прикреплена буква j.

Чтобы выразить число в восьмеричном или шестнадцатеричном представлении, 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

Строка - это любая последовательность символов, заключенная в одинарные (например, «привет»), двойные (например, «привет») или тройные (например, «привет» или «« привет »») кавычки. Тройные кавычки особенно полезны, если содержимое строки занимает несколько строк.

Символы escape-последовательности можно дословно включать в строку с тройными кавычками. В следующих примерах показаны различные способы объявления строки в 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.
"""

Третья строка при печати даст следующий результат.

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 Описание
len (Список) Длина
Список [2] = 10 Обновление
Список дел [1] Удаление
List.append (20) Добавить
List.insert (1,15) Вставка
List.sort () Сортировка

Кортежи Jython

Кортеж - это неизменяемая коллекция разделенных запятыми элементов данных, хранящихся в круглых скобках. Невозможно удалить или изменить элемент в кортеже, а также невозможно добавить элемент в коллекцию кортежей. В следующем блоке кода показаны операции с кортежами.

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 похож на класс Map в платформе Java Collection. Это набор пар ключ-значение. Пары, разделенные запятыми, заключаются в фигурные скобки. Объект Dictionary не следует за индексом с нулевым отсчетом для извлечения элемента внутри него, поскольку они хранятся с помощью техники хеширования.

Один и тот же ключ не может встречаться в объекте словаря более одного раза. Однако несколько ключей могут иметь одинаковые связанные значения. Различные функции, доступные с объектом Dictionary, объясняются ниже -

dict = {'011':'New Delhi','022':'Mumbai','033':'Kolkata'}
print "dict[‘011’]: ",dict['011']
print "dict['Age']: ", dict['Age']

В следующей таблице описаны некоторые из наиболее распространенных выражений Jython, связанных со словарем.

Выражение Jython Описание
dict.get ('011') Поиск
len (дикт) Длина
dict ['044'] = 'Ченнаи' Добавить
дель dict ['022'] удалять
dict.keys () список ключей
dict.values ​​() Список значений
dict.clear () Удаляет все элементы

В дополнение к встроенным типам данных Python, Jython имеет преимущество использования классов коллекции Java путем импорта java.util package. Следующий код описывает классы, приведенные ниже -

  • Объект Java ArrayList с add ()
  • remove()
  • get () и set () класса ArrayList.
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, который позволяет создавать массив Java в Python. Чтобы работать с jarray, просто определите тип последовательности в Jython и передайте его объекту jarray вместе с типом объекта, содержащегося в последовательности. Все значения в банке должны быть одного типа.

В следующей таблице показаны коды типов символов, используемые с jarray.

Код Типа Персонажа Соответствующий тип Java
Z Булево
C char
B байт
ЧАС короткая
я int
L долго
F плавать
D двойной

В следующем примере показано построение 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. Второй пример показывает, что Jarray arr2 построен изmySttr stringпоследовательность. Вывод вышеуказанного скриптаjarray.py выглядит следующим образом -

array('i', [1, 2, 3, 4, 5])
array('c', 'Hello Jython')

Структуры принятия решений имеют одно или несколько условий, которые должны быть оценены или протестированы программой, а также оператор или операторы, которые должны быть выполнены, если условие определено как истинное, и, необязательно, другие операторы, которые должны быть выполнены, если условие определяется как ложь.

На следующем рисунке показана общая форма типичной структуры принятия решений, встречающейся в большинстве языков программирования.

Jython не использует фигурные скобки для обозначения блоков операторов, которые должны выполняться, когда условие истинно или ложно (как в случае с Java). Вместо этого для формирования блока операторов используется равномерный отступ (пробел от левого поля). Такой блок с равномерным отступом заставляет условный код выполняться, когда условие, заданное в операторе if, истинно.

Аналогичный блок может присутствовать после необязательного оператора else. Jython также предоставляетelif statementс помощью которых можно проверить последовательные условия. Здесьelse clauseпоявится последним и будет выполняться только при невыполнении всех предыдущих условий. Общий синтаксис использования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

Как правило, операторы в программе выполняются последовательно: сначала выполняется первый оператор в функции, затем второй и т. Д. Может возникнуть ситуация, когда вам нужно выполнить блок кода несколько раз. Заявления, которые обеспечивают такую ​​возможность повторения, называютсяlooping statements.

В Jython цикл может быть сформирован двумя операторами, которые:

  • В while заявление и

  • В for заявление

Цикл WHILE

Оператор цикла while в Jython аналогичен оператору в Java. Он повторно выполняет блок операторов, пока выполняется заданное условие. Следующая блок-схема описывает поведениеwhile петля.

Общий синтаксис оператора while приведен ниже.

while expression:
   statement(s)

Следующий код Jython использует цикл while для многократного увеличения и печати значения переменной, пока оно не станет меньше нуля.

count = 0
while count<10:
   count = count+1
   print "count = ",count
print "Good Bye!"

Output - Результат будет следующим.

count =  1
count =  2
count =  3
count =  4
count =  5
count =  6
count =  7
count =  8
count =  9
count =  10
Good Bye!

Цикл FOR

Цикл FOR в Jython не является счетным циклом, как в Java. Вместо этого он имеет возможность перемещаться по элементам в последовательном типе данных, таком как строка, список или кортеж. Общий синтаксис оператора FOR в Jython показан ниже:

for iterating_var in sequence:
   statements(s)

Мы можем отобразить каждый символ в строке, а также каждый элемент в списке или кортеже, используя оператор FOR, как показано ниже -

#each letter in string
for letter in 'Python':
   print 'Current Letter :', letter

Output - Результат будет следующим.

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

Output - Результат будет следующим.

Current library : PyQt
Current library : WxPython
Current library : Tkinter

Вот еще один пример, который стоит рассмотреть.

#each item in tuple
libs = (‘PyQt’, 'WxPython',  'Tkinter')
for lib in libs:        # Second Example
   print 'Current library :', lib

Output - Результат выполнения вышеуказанной программы следующий.

Current library : PyQt
Current library : WxPython
Current library : Tkinter

В Jython forОператор также используется для перебора списка чисел, созданного функцией range (). Функция range () принимает следующую форму -

range[([start],stop,[step])

Параметры start и step по умолчанию равны 0 и 1. Последний сгенерированный номер - это стоп-шаг. Оператор FOR просматривает список, сформированныйrange() function. Например -

for num in range(5):
   print num

Он производит следующий вывод -

0
1
2
3
4

Сложная логика программирования разбивается на один или несколько независимых и многократно используемых блоков операторов, называемых функциями. Стандартная библиотека Python содержит большое количество встроенных функций. Можно также определить свою собственную функцию, используяdefключевое слово. За заданным пользователем именем функции следует блок операторов, образующий ее тело, которое заканчивается оператором return.

После определения его можно вызывать из любой среды любое количество раз. Давайте рассмотрим следующий код, чтобы прояснить эту мысль.

#definition of function
defSayHello():
   "optional documentation string"
   print "Hello World"
   return

#calling the function
SayHello()

Функция может быть разработана для получения одного или нескольких параметров / аргументов от вызывающей среды. При вызове такой параметризованной функции вам необходимо предоставить такое же количество параметров с аналогичными типами данных, которые используются в определении функции, иначе интерпретатор 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)

В output будет следующим -

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, в котором определены одна или несколько связанных функций, классов или переменных. Это позволяет логически организовать код Jython. Элементы программы, определенные в модуле, можно использовать в другом сценарии Jython, импортировав из него модуль или конкретный элемент (функцию / класс).

В следующем коде (hello.py) функция SayHello() определено.

#definition of function
defSayHello(str):
   print "Hello ", str
   return

Чтобы использовать функцию SayHello () из другого скрипта, импортируйте hello.py module в этом.

import hello
hello.SayHello("TutorialsPoint")

Однако при этом будут импортированы все функции, определенные в модуле. Чтобы импортировать определенную функцию из модуля, используйте следующий синтаксис.

from modname import name1[, name2[,... nameN]

Например, чтобы импортировать только функцию SayHello (), измените приведенный выше сценарий следующим образом.

from hello import SayHello
SayHello("TutorialsPoint")

При вызове функции нет необходимости добавлять префикс к имени модуля.

Любая папка, содержащая один или несколько модулей Jython, распознается как пакет. Однако в нем должен быть специальный файл с именем__init__.py, который предоставляет указатель используемых функций.

Давайте теперь разберемся, как создать и импортировать пакет.

Step 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

Step 2 - В папке package1 создайте и сохраните __init__.py файл со следующим содержанием.

#__init__.py
from fact import factorial
from sum import add
from mult import multiply

Step 3 - Создайте следующий сценарий Jython вне папки package1 как 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

Step 4- Запустите test.py из командной строки Jython. Будет получен следующий результат.

factorial = 120
addition = 30
multiplication = 200

Скачать jython-standalone-2.7.0.jar - Для встраивания Jython в приложения Java со страницы их официальной загрузки: http://www.jython.org/downloads.html и включите этот файл jar в переменную среды Java CLASSPATH.

Эта библиотека содержит PythonInterpreterкласс. Используя объект этого класса, любой скрипт Python может быть выполнен с использованиемexecfile()метод. PythonInterpreter позволяет вам использоватьPyObjectsпрямо. Все объекты, известные системе выполнения Jython, представлены экземпляром класса PyObject или одним из его подклассов.

Класс PythonInterpreter имеет несколько регулярно используемых методов, которые описаны в таблице, приведенной ниже.

Sr.No. Метод и описание
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)

Установите переменную типа Object в локальном пространстве имен

19

set(String name, PyObject value)

Установите переменную типа PyObject в локальном пространстве имен

20

get(String)

Получить значение переменной в локальном пространстве имен

21 год

get(String name, Class javaclass

Получить значение переменной в локальном пространстве имен. Значение будет возвращено как экземпляр данного класса Java.

Следующий блок кода представляет собой программу Java со встроенным скриптом Jython. “hello.py”.usingexecfile()метод объекта PythonInterpreter. Он также показывает, как переменную Python можно установить или прочитать с помощью методов set () и get ().

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

PyDev - это плагин с открытым исходным кодом для Eclipse IDE, позволяющий разрабатывать проекты на Python, Jython, а также на IronPython. Он размещен вhttps://pydev.org. Пошаговая процедура установки подключаемого модуля PyDev в Eclipse IDE приведена ниже.

Step 1 - Откройте Eclipse IDE и выберите Install New Software в меню «Справка».

Step 2 - Войти http://pydev.org/updatesв текстовом поле напротив работы с меткой и нажмите добавить. Выберите все доступные записи в списке и нажмите Далее. Мастеру потребуется несколько минут для завершения установки, и он предложит перезапустить среду IDE.

Step 3- Теперь выберите параметр предпочтений в меню «Окно». Откроется диалоговое окно настроек, как показано ниже.

Step 4- Разверните узел Interpreters и выберите Jython Interpreter на левой панели. На правой панели нажмите «Создать», чтобы указать путь кjython.jar file.

Теперь мы готовы запустить проект Jython с использованием Eclipse.

Чтобы создать проект в eclipse, мы должны выполнить шаги, указанные ниже.

Step 1- Выбрать файл? Новый? Проект. выберитеPyDevиз диалогового окна фильтра. Укажите название проекта, тип проекта и нажмите Готово.

Step 2- Проект Hello теперь появится в проводнике проектов слева. Щелкните правой кнопкой мыши, чтобы добавить в него hello.py.

Step 3- В редакторе появится пустой файл hello.py. Напишите код Jython и сохраните.

Step 4- Нажмите кнопку «Выполнить» в строке меню. Результат появится в окне консоли, как показано ниже.

Поддержка Python и Jython для NetBeans доступна через nbPython plugin. Загрузите плагин по следующему URL-адресу -http://plugins.netbeans.org/plugin/56795. Разархивируйте скачанный архив в какую-нибудь папку. Например -d:\nbplugin. Чтобы установить подключаемый модуль NetBeans, выполните следующие действия.

Step 1 - Запустите Netbeans IDEа затем перейдите в Инструменты / Плагин, чтобы открыть Диспетчер плагинов. Выберите вкладку «Загружено» и перейдите к папке, в которой был распакован загруженный файл. Появится окно NetBeans, как показано ниже.

Step 2 - Следующий шаг - выбрать все .nbm файлы и нажмите "Открыть".

Step 3 - Нажмите на кнопку «Установить».

Step 4 - Чтобы продолжить, примите следующее лицензионное соглашение.

Не обращайте внимания на предупреждение о ненадежном источнике подключаемых модулей и перезапустите среду IDE, чтобы продолжить.

Проект Jython в NetBeans

После перезапуска начните новый проект, выбрав File / New. Категория Python теперь будет доступна в списке категорий. Выберите его, чтобы продолжить.

Если в системе установлен Python, его версия / версии будут автоматически определены и показаны в раскрывающемся списке платформы Python. Однако Jython не будет отображаться. Нажмите кнопку «Управление», чтобы добавить его.

Нажмите кнопку «Создать», чтобы добавить имя платформы и путь к исполняемому файлу Jython.

Jython теперь будет доступен в списке платформ. Выберите из раскрывающегося списка, как показано на следующем снимке экрана.

Теперь мы можем ввести имя проекта, местоположение и основной файл в следующем окне.

Структура проекта появится в окне проектов в среде IDE NetBeans, а код шаблона Python - в окне редактора.

Постройте и выполните проект Jython, чтобы получить следующий результат в окне вывода среды IDE NetBeans.

Сервлет Java - это наиболее широко используемый метод веб-разработки. Мы можем использовать Jython для написания сервлетов, и это добавляет гораздо больше преимуществ помимо того, что может предложить Java, потому что теперь мы также можем использовать функции языка Python.

Мы будем использовать IDE NetBeans для разработки веб-приложения Java с сервлетом Jython. Убедитесь, чтоnbPython pluginустановлен в установке NetBeans. Запустите новый проект для создания веб-приложения, выбрав следующий путь -File → New Project → Java web → New Web Application.

Укажите название и местоположение проекта. IDE создаст структуру папок проекта. Добавьте файл сервлета Java (ServletTest.java) в узел исходных пакетов в окне "Проекты". Это добавитservlet-api.jarв папке lib проекта. Кроме того, позвольте IDE создать файл web.xmldescriptor file. Добавьте следующий код в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>"
      );
   }
}

Файл web.xml, созданный NetBeans, будет таким, как показано ниже -

<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>

Скомпилируйте и запустите проект, чтобы получить текст Servlet Testпоявляется в теге <h1> в окне браузера. Таким образом, мы добавили в приложение обычный сервлет Java.

Теперь мы добавим сервлет Jython. Сервлеты Jython работают с помощью промежуточного сервлета Java, также известного как PyServlet. PyServlet.class присутствует вjython standalone.jar. Добавьте это вWEB-INF/lib папка.

Следующим шагом является настройка web.xml для вызова PyServlet при каждом запросе любого *.py fileПоднялся. Это нужно сделать, добавив в него следующий 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

Браузер покажет Servlet Test в теге <h1>, как в случае вывода Java Servlet.

Jython использует zxJDBC packageкоторый предоставляет простую в использовании оболочку Python для JDBC. zxJDBC объединяет два стандарта:JDBC стандартная платформа для доступа к базе данных в Java, и DBI - стандартный API базы данных для приложений Python.

ZxJDBC предоставляет интерфейс JDBC, совместимый со стандартом DBI 2.0. Для JDBC доступно более 200 драйверов, и все они работают с zxJDBC. Высокопроизводительные драйверы доступны для всех основных реляционных баз данных, в том числе -

  • DB2
  • Derby
  • MySQL
  • Oracle
  • PostgreSQL
  • SQLite
  • SQL Server и
  • Sybase.

Пакет ZxJDBC можно загрузить с https://sourceforge.net/projects/zxjdbc/ или же http://www.ziclix.com/zxjdbc/. Скачанный архив содержит ZxJDBC.jar, который нужно добавить в переменную окружения CLASSPATH.

Мы намерены установить соединение базы данных с базой данных MySQL. Для этого требуется драйвер JDBC для MySQL. ЗагрузитеMySQL J connector по следующей ссылке - https://dev.mysql.com/downloads/connector/j/ и включите соединитель mysql java-5.1.42-bin.jar в CLASSPATH.

Войдите на сервер MySQL и создайте таблицу студентов в тестовой базе данных со следующей структурой:

Поле Тип Ширина
имя Варчар 10
Возраст Int 3
Метки Int 3

Добавьте в него несколько записей.

имя Возраст Метки
Рави 21 год 78
Ашок 20 65
Анил 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)

Это объясняет процедуру установки JDBC в Jython.

Одна из основных особенностей Jython - это возможность использовать библиотеку графического интерфейса Swing в JDK. Стандартный дистрибутив Python (часто называемый CPython) имеетTkinter GUI libraryпоставляется с ним. Другие библиотеки графического интерфейса, такие какPyQt и WxPython также доступны для использования с ним, но библиотека Swing предлагает независимый от платформы инструментарий GUI.

Использовать библиотеку Swing в Jython намного проще, чем в Java. В Java анонимные классы должны использоваться для создания привязки событий. В Jython мы можем просто передать функцию для той же цели.

Базовое окно верхнего уровня создается путем объявления объекта JFrame classи установите для его свойства 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 предоставляется в виде javax.swingпакет на Java. Его основные классы-контейнеры,JFrame и JDialogсоответственно являются производными от классов Frame и Dialog, которые находятся в библиотеке AWT. Другие элементы управления графическим интерфейсом, напримерJLabel, JButton, JTextField, и т.д., являются производными от класса JComponent.

На следующем рисунке показана иерархия классов пакета Swing.

В следующей таблице приведены различные классы управления графическим интерфейсом пользователя в библиотеке Swing.

Sr.No. Класс и описание
1

JLabel

Объект JLabel - это компонент для размещения текста в контейнере.

2

JButton

Этот класс создает кнопку с меткой.

3

JColorChooser

JColorChooser предоставляет панель элементов управления, позволяющую пользователю управлять цветом и выбирать его.

4

JCheckBox

JCheckBox - это графический компонент, который может быть on (правда) или off (ложное) состояние.

5

JRadioButton

Класс JRadioButton - это графический компонент, который может находиться во включенном (истина) или выключенном (ложном) состоянии. в группе.

6

JList

Компонент JList представляет пользователю прокручиваемый список текстовых элементов.

7

JComboBox

Компонент JComboBox представляет пользователю раскрывающийся список элементов.

8

JTextField

Объект JTextField - это текстовый компонент, который позволяет редактировать одну строку текста.

9

JPasswordField

Объект JPasswordField - это текстовый компонент, предназначенный для ввода пароля.

10

JTextArea

Объект JTextArea - это текстовый компонент, который позволяет редактировать несколько строк текста.

11

ImageIcon

Элемент управления ImageIcon - это реализация интерфейса Icon, который рисует значки из изображений.

12

JScrollbar

Элемент управления «Полоса прокрутки» представляет собой компонент полосы прокрутки, позволяющий пользователю выбирать из диапазона значений.

13

JOptionPane

JOptionPane предоставляет набор стандартных диалоговых окон, которые запрашивают у пользователей значение или информируют их о чем-то.

14

JFileChooser

Элемент управления JFileChooser представляет собой диалоговое окно, в котором пользователь может выбрать файл.

15

JProgressBar

По мере того, как задача приближается к завершению, индикатор выполнения отображает процент выполнения задачи.

16

JSlider

JSlider позволяет пользователю графически выбирать значение, перемещая ручку в пределах ограниченного интервала.

17

JSpinner

JSpinner - это однострочное поле ввода, которое позволяет пользователю выбрать число или значение объекта из упорядоченной последовательности.

Мы будем использовать некоторые из этих элементов управления в следующих примерах.

Менеджеры компоновки в Java - это классы, которые управляют размещением элементов управления в объектах контейнера, таких как Frame, Dialog или же Panel. Менеджеры компоновки сохраняют относительное расположение элементов управления в кадре, даже если изменяется разрешение или размер самого кадра.

Эти классы реализуют Layout interface. Следующие менеджеры компоновки определены вAWT library -

  • BorderLayout
  • FlowLayout
  • GridLayout
  • CardLayout
  • GridBagLayout

Следующие менеджеры компоновки определены в Swing library -

  • BoxLayout
  • GroupLayout
  • ScrollPaneLayout
  • SpringLayout

В следующих примерах мы будем использовать менеджеры компоновки AWT, а также менеджеры компоновки Swing.

  • Абсолютный макет
  • Схема потока
  • Макет сетки
  • Макет границы
  • Макет коробки
  • Макет группы

Давайте теперь обсудим каждый из них подробно.

Абсолютный макет

Прежде чем мы исследуем все вышеупомянутые менеджеры компоновки, мы должны взглянуть на абсолютное расположение элементов управления в контейнере. Мы должны установить метод компоновки объекта фрейма на «Нет».

frame.setLayout(None)

Затем разместите элемент управления, вызвав setBounds()метод. Он принимает четыре аргумента - положение x, положение y, ширину и высоту.

Например - чтобы разместить объект кнопки в абсолютном положении и с абсолютным размером.

btn = JButton("Add")
btn.setBounds(60,80,60,20)

Точно так же можно разместить все элементы управления, правильно назначив положение и размер. Этот макет относительно прост в использовании, но не может сохранить свой внешний вид при изменении размера окна или при запуске программы при изменении разрешения экрана.

В следующем сценарии Jython три объекта Jlabel используются для отображения текста «phy», «maths» и «Total» соответственно. Перед этими тремя - размещаются объекты JTextField. Объект Button помещается над меткой «Total».

Прежде всего создается окно 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 - это менеджер компоновки по умолчанию для контейнерных классов. Он упорядочивает управление слева направо, а затем сверху вниз.

В следующем примере объект Jlabel, объект JTextField и объект JButton должны отображаться в JFrame с помощью диспетчера FlowLayout. Для начала импортируем необходимые классы из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")

Наконец, добавьте эти элементы управления во фрейм, вызвав add() метод класса JFrame.

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 позволяет размещать элементы управления в прямоугольной сетке. По одному элементу управления размещается в каждой ячейке сетки.

В следующем примере 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)

Теперь примените GridLayout, указав его размеры как 4 на 4.

frame.setLayout(GridLayout(4,4))

Теперь мы должны использовать два цикла FOR, каждый от 1 до 4, поэтому шестнадцать объектов 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 делит контейнер на пять географических регионов и мест с одним компонентом в каждом регионе. Эти области представлены определенными константами следующим образом:

  • BorderLayout.NORTH
  • BorderLayout.SOUTH
  • BorderLayout.EAST
  • BorderLayout.WEST
  • BorderLayout.CENTER

Давайте рассмотрим следующий пример -

Jython BoxLayout

Класс BoxLayout определен в javax.swing package. Он используется для размещения компонентов в контейнере вертикально или горизонтально. Направление определяется следующими константами -

  • X_AXIS
  • Y_AXIS
  • LINE_AXIS
  • PAGE_AXIS

Целочисленная константа определяет ось, по которой должны быть расположены компоненты контейнера. Когда контейнер имеет ориентацию компонентов по умолчанию, LINE_AXIS указывает, что компоненты располагаются слева направо, а PAGE_AXIS указывает, что компоненты должны быть расположены сверху вниз.

В следующем примере панель (класса JPanel) добавляется в объект JFrame. К нему применяется вертикальный BoxLayout и к нему добавляются еще две панели, верхняя и нижняя. Эти две внутренние панели имеют по две кнопки, каждая из которых добавлена ​​в горизонтальный макет окна.

Давайте сначала создадим окно 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)

В этой панели к ней добавлены еще две панели - верхняя и нижняя. Каждый из них имеет два объекта 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()Функция используется для создания промежутка в 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, оба реализуют групповой интерфейс на Java.

Процедура макета разделена на два этапа. В один этап компоненты размещаются по горизонтальной оси, а во втором - по вертикальной оси. Каждый компонент должен быть определен в макете дважды.

Есть два типа расположения: последовательное и параллельное. В обоих случаях мы можем расположить компоненты последовательно или параллельно. При горизонтальном расположении строка называется последовательной группой, а столбец - параллельной группой. С другой стороны, при параллельном расположении строка элемента представляет собой параллельную группу и столбец, который называется последовательным.

В следующем примере пять кнопок расположены таким образом, что каждая из них отображается в строке и столбце. Для начала добавьте объект Jpanel в окно JFrame и установите его макет как 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")

Далее мы создаем SequentialGroup названный LeftToRightк которому добавляются buttonD и buttonY. Между ними размещается ParallelGroup ColumnMiddle (с другими тремя добавленными вертикально кнопками).

leftToRight = layout.createSequentialGroup()
leftToRight.addComponent(buttonD)
columnMiddle = layout.createParallelGroup()
columnMiddle.addComponent(buttonR)
columnMiddle.addComponent(buttonO)
columnMiddle.addComponent(buttonT)
leftToRight.addGroup(columnMiddle)
leftToRight.addComponent(buttonY)

Теперь идет определение вертикальной SequentialGroup под названием TopToBottom. Добавьте строку из трех кнопок ParallelGroup, а затем поместите две кнопки вертикально.

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)

Вывод приведенного выше кода выглядит следующим образом:

Обработка событий в Java swing требует, чтобы элемент управления (например, JButton или JList и т. Д.) Был зарегистрирован в соответствующем прослушивателе событий. Интерфейс прослушивателя событий или соответствующий класс адаптера необходимо либо реализовать, либо создать подкласс с переопределенным методом обработки событий. В Jython обработка событий очень проста. Мы можем передать любую функцию как свойство функции обработки событий, соответствующей элементу управления.

Давайте сначала посмотрим, как событие щелчка обрабатывается в Java.

Для начала нам нужно импортировать java.awt.event package. Затем класс, расширяющий JFrame, должен реализовать интерфейс ActionListener.

public class btnclick extends JFrame implements ActionListener

Затем мы должны объявить объект JButton, добавить его в ContentPane фрейма и затем зарегистрировать его в ActionListener с помощью метода addActionListener ().

JButton b1 = new JButton("Click here");
   getContentPane().add(b1);
   b1.addActionListener(this);

Теперь метод actionPerformed () интерфейса ActionListener должен быть переопределен для обработки ActionEvent.

Ниже приведен весь код 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 или создавать подклассы. Вместо этого любая пользовательская функция сразу же предоставляется конструктору JButton как значениеactionPerformed bean свойство.

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 в окне JFrame предоставлены два объекта JTextField для ввода оценок в "phy" и "maths". При нажатии на объект JButton выполняется функция add ().

btn = JButton("Add", actionPerformed = add)

Функция add () считывает содержимое двух текстовых полей методом getText () и преобразует их в целые числа, чтобы можно было выполнить сложение. Затем результат помещается в третье текстовое поле методом setText ().

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)

Когда приведенный выше код выполняется из командной строки, появляется следующее окно. Введите оценки за «Физика», «Математика» и нажмите кнопку «Добавить». Результат будет отображаться соответственно.

Событие Jython JRadioButton

Класс JRadioButton определен в javax.swing package. Он создает выбираемую кнопку-переключатель с включенным или выключенным состояниями. Если в ButtonGroup добавлено несколько переключателей, их выбор является взаимоисключающим.

В следующем примере два объекта класса JRadioButton и два объекта JLabel добавляются в контейнер Jpanel в вертикальном BoxLayout. В конструкторе объектов JRadioButtonOnCheck()функция устанавливается как значение свойства actionPerformed. Эта функция выполняется, когда щелкают по переключателю, чтобы изменить его состояние.

rb1 = JRadioButton("Male", True,actionPerformed = OnCheck)
rb2 = JRadioButton("Female", actionPerformed = OnCheck)

Обратите внимание, что состояние Radio Button по умолчанию - false (не выбрано). Кнопка rb1 создается с начальным состоянием True (выбрано).

Два переключателя добавляются в радио ButtonGroup, чтобы сделать их взаимоисключающими, так что, если один выбран, другой автоматически отменяется.

grp = ButtonGroup()
grp.add(rb1)
grp.add(rb2)

Эти две радиокнопки вместе с двумя метками добавляются к объекту панели в вертикальном расположении с разделительной областью 25 пикселей по высоте между rb2 и lbl2.

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 верхнего уровня, для свойства visible которого в конце установлено значение «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 добавляются к JPanel в вертикальном BoxLayout. Метка внизу отображает состояние мгновенного выбора двух флажков.

Оба флажка объявляются с конструктором, у которого для свойства actionPerformed установлено значение OnCheck() функция.

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 добавляются в панель JPanel с добавлением между ними пробела высотой 50 пикселей.

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 верхнего уровня, свойство visible которого в конце устанавливается в значение 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

Элемент управления JList в пакете swing предоставляет пользователю прокручиваемый список элементов для выбора. JComboBox предоставляет раскрывающийся список элементов. В Java событие выбора обрабатывается путем реализации метода valueChanged () в ListSelectionListener. В Jython обработчик событий назначается свойству valueChanged объекта JList.

В следующем примере объект JList и метка добавляются к JFrame в BorderLayout. 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 добавляются в JFrame с помощью BorderLayout.

Полный код приведен ниже -

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)

Вывод следующего кода выглядит следующим образом.

Большинство приложений на основе графического интерфейса пользователя имеют панель меню вверху. Он находится чуть ниже строки заголовка окна верхнего уровня. В пакете javax.swing есть продуманные средства для создания эффективной системы меню. Он построен с помощьюJMenuBar, JMenu и JMenuItem классы.

В следующем примере строка меню предоставляется в окне верхнего уровня. К строке меню добавляется меню «Файл», состоящее из трех кнопок пунктов меню. Давайте теперь подготовим объект JFrame с макетом, установленным на BorderLayout.

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 с заголовком «Файл». В меню «Файл» добавлены три кнопки JMenuItem. При нажатии любого из пунктов меню выполняется функция OnClick () обработчика ActionEvent. Он определяется свойством 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 () получает имя кнопки JMenuItem с помощью функции gwtActionCommand () и отображает его в текстовом поле внизу окна.

def OnClick(event):
   txt.text = event.getActionCommand()

Объект меню Файл добавлен в строку меню. Наконец, в нижней части объекта JFrame добавляется элемент управления JTextField.

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, появляется окно с меню «Файл». Щелкните по нему, и его три пункта меню выпадут. Если нажать любую кнопку, ее имя будет отображаться в текстовом поле.

Объект Dialog - это окно, которое появляется поверх основного окна, с которым взаимодействует пользователь. В этой главе мы увидим предварительно сконфигурированные диалоги, определенные в библиотеке Swing. Они естьMessageDialog, ConfirmDialog и InputDialog. Они доступны благодаря статическому методу класса JOptionPane.

В следующем примере меню «Файл» содержит три пункта 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. Если выбрана опция «Подтвердить», появится диалоговое окно с тремя кнопками: ДА, НЕТ и ОТМЕНА. Выбор пользователя записывается в текстовом поле.

Полный код приведен ниже -

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)

Когда приведенный выше скрипт выполняется, отображается следующее окно с тремя опциями в меню:

Окно сообщения

Поле ввода

Подтвердить диалог