Event handling with Jython Swing

2024/10/15 9:20:54

I'm making a GUI by using Swing from Jython. Event handling seems to be particularly elegant from Jython, just set

JButton("Push me", actionPerformed = nameOfFunctionToCall)

However, trying same thing inside a class gets difficult. Naively trying

JButton("Push me", actionPerformed = nameOfMethodToCall)

or

JButton("Push me", actionPerformed = nameOfMethodToCall(self))

from a GUI-construction method of the class doesn't work, because the first argument of a method to be called should be self, in order to access the data members of the class, and on the other hand, it's not possible to pass any arguments to the event handler through AWT event queue. The only option seems to be using lambda (as advised at http://www.javalobby.org/articles/jython/) which results in something like this:

JButton("Push me", actionPerformed = lambda evt : ClassName.nameOfMethodToCall(self))

It works, but the elegance is gone. All this just because the method being called needs a self reference from somewhere. Is there any other way around this?

Answer
JButton("Push me", actionPerformed=self.nameOfMethodToCall)

Here's a modified example from the article you cited:

from javax.swing import JButton, JFrameclass MyFrame(JFrame):def __init__(self):JFrame.__init__(self, "Hello Jython")button = JButton("Hello", actionPerformed=self.hello)self.add(button)self.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)self.setSize(300, 300)self.show()def hello(self, event):print "Hello, world!"if __name__=="__main__":MyFrame()
https://en.xdnf.cn/q/69300.html

Related Q&A

How Does Deque Work in Python

I am having trouble understanding how the deque works in the snippet of code below, while trying to recreate a queue and a stack in Python.Stack Example - Understoodstack = ["a", "b"…

When to use generator functions and when to use loops in Python

I am coming from a Matlab background and I am finding it difficult to get around the concept of generators in Python. Can someone please answer me the following:The difference between a generator funct…

Airflow - Disable heartbeat logs

My logs are getting completely flooded with useless messages for every heartbeat. [2019-11-27 21:32:47,890] {{logging_mixin.py:112}} INFO - [2019-11-27 21:32:47,889] {local_task_job.py:124} WARNING - T…

different validation in drf serializer per request method

Lets say i have a model like so:class MyModel(models.Model):first_field = models.CharField()second_field = models.CharField()and an API view like so:class MyModelDetailAPI(GenericAPIView):serializer_cl…

How to import r-packages in Python

Im a bit troubled with a simple thing. I was trying to install a package called hunspell, but I discovered it is originally an R package. I installed this version: https://anaconda.org/conda-forge/r-hu…

XPath predicate with sub-paths with lxml?

Im trying to understand and XPath that was sent to me for use with ACORD XML forms (common format in insurance). The XPath they sent me is (truncated for brevity):./PersApplicationInfo/InsuredOrPrinci…

Best way to access and close a postgres database using python dataset

import dataset from sqlalchemy.pool import NullPooldb = dataset.connect(path_database, engine_kwargs={poolclass: NullPool})table_f1 = db[name_table] # Do operations on table_f1db.commit() db.execut…

Using different binds in the same class in Flask-SQLAlchemy

I currently have multiple databases with identical Tables and Columns (but different data inside). So clearly I need to use binds to access all of them, but its apparently not as simple as doing this:c…

Correctly parse date string with timezone information

Im receiving a formatted date string like this via the pivotal tracker API: "2012/06/05 17:42:29 CEST"I want to convert this string to a UTC datetime object, it looks like python-dateutil doe…

Can I add a sequence of markers on a Folium map?

Suppose I had a list, or pandas series, or latitude longitude pairs. With Folium, I can plot markers for a single pair of coordinates using coords = [46.8354, -121.7325] map_4 = folium.Map(location=[4…