Jython-イベント処理
Java Swingでのイベント処理では、コントロール(JButtonやJListなど)をそれぞれのイベントリスナーに登録する必要があります。イベントリスナーインターフェイスまたは対応するアダプタクラスは、実装するか、イベント処理メソッドをオーバーライドしてサブクラス化する必要があります。Jythonでは、イベント処理は非常に簡単です。コントロールに対応するイベント処理関数のプロパティとして、任意の関数を渡すことができます。
まず、Javaでクリックイベントがどのように処理されるかを見てみましょう。
まず、インポートする必要があります java.awt.event package。次に、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を実装またはサブクラス化する必要はありません。代わりに、ユーザー定義関数は、次の値として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コードでは、「phy」と「maths」にマークを入力するために、2つのJTextFieldオブジェクトがJFrameウィンドウに提供されています。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」、「Maths」のマークを入力し、「Add」ボタンをクリックします。結果はそれに応じて表示されます。
JythonJRadioButtonイベント
JRadioButtonクラスは、 javax.swing package。オンまたはオフの状態で選択可能なトグルボタンを作成します。ButtonGroupに複数のラジオボタンが追加されている場合、それらの選択は相互に排他的です。
次の例では、JRadioButtonクラスの2つのオブジェクトと2つのJLabelが、垂直BoxLayoutのJpanelコンテナに追加されています。JRadioButtonオブジェクトのコンストラクターでは、OnCheck()functionPerformedプロパティの値として関数が設定されます。この機能は、ラジオボタンをクリックして状態を変更したときに実行されます。
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スクリプトを実行し、ラジオボタンの選択を変更します。選択範囲は下部のラベルに表示されます。
JythonJCheckBoxイベント
以下のような JRadioButton、JCheckBoxオブジェクトは、キャプションのほかに長方形のチェック可能なボックスが付いた選択可能なボタンでもあります。これは通常、アイテムのリストから複数のオプションを選択する機会をユーザーに提供するために使用されます。
次の例では、2つのチェックボックスとswingパッケージのラベルが垂直BoxLayoutのJPanelに追加されています。下部のラベルには、2つのチェックボックスの瞬間的な選択状態が表示されます。
両方のチェックボックスは、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オブジェクトは、高さ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)
上記のコードを実行し、チェックボックスの選択を試してください。両方のチェックボックスの瞬間的な状態が下部に表示されます。
JythonJListイベント
スイングパッケージの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)
次のコードの出力は次のとおりです。