-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathjavafxjython.py
More file actions
129 lines (114 loc) · 4.32 KB
/
Copy pathjavafxjython.py
File metadata and controls
129 lines (114 loc) · 4.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#
# Fork of jythonfx (made by Jeremi Biernacki) in one file
# Made by Fernando Lima
#
# =========================
# CHANGES
# =========================
#
# - requirement changed: now require JAVA 8
# - removed fix.py file and its code (unnecessary for the new requirement)
# - some lines removed: mainly print commands
# - imported classes renamed to be prefixed by JFX to make the code more readable:
# new name of imported classes is JFX{className}
# - all classes are now together in just one file
# - all components at FXML are now correctly imported
#
# =========================
# REQUIREMENTS
# =========================
#
# - JAVA 8 OR NEWER
# - JYTHON 2.7 OR NEWER
#
# ========================
# HOW TO USE
# =========================
#
# Copy this file to your project folder and import it for your code, using:
#
# import javafxjython
#
#
# import java packages
from java.io import File
from javafx.application import Application as JFXApplication
from javafx.fxml import FXMLLoader as JFXFXMLLoader
from javafx.event import EventHandler as JFXEventHandler
from javafx.scene.image import (Image as JFXImage, ImageView as JFXImageView)
# import python packages
from collections import Iterable
class Application(JFXApplication):
def __init__(self):
# this override method self.launch using self.__launch__
setattr(self, "launch", self.__launch__)
def __launch__(self, app):
JFXApplication.launch(app().getClass(), [])
class Image(JFXImageView):
def __init__(self, path_to_img):
f = File(path_to_img).toURI().toString()
img = JFXImage(f)
super(Image, self).__init__(img)
class EventHandler(JFXEventHandler):
def __init__(self, method=None):
super(EventHandler, self).__init__()
if method != None:
setattr(self, "handle", method)
# start: fully rewritten by Fernando Lima
class FXMLLoader(object):
def __init__(self, fxmlfile): # changed by Fernando Lima
fxml = JFXFXMLLoader(File(fxmlfile).toURL())
fxml.setController(self)
self.body = fxml.load()
self.getChildren().add(self.body)
self.components = []
self.components.append(self.body)
self.getInnerComponents(self.body)
self.setIds(self.components)
# start: made by Fernando Lima
def getInnerComponents(self, component):
# print("component: " + str(component))
if (hasattr(component, "children")): # component is a JavaFX Pane
innerComponents = getattr(component, "children", [])
if isinstance(innerComponents, Iterable):
for innerComponent in innerComponents:
self.components.append(innerComponent)
self.getInnerComponents(innerComponent)
else:
self.components.append(innerComponents)
self.getInnerComponents(innerComponents)
elif (hasattr(component, "content")): # component is a JavaFX Control
innerComponents = getattr(component, "content", [])
if isinstance(innerComponents, Iterable):
for innerComponent in innerComponents:
self.components.append(innerComponent)
self.getInnerComponents(innerComponent)
else:
self.components.append(innerComponents)
self.getInnerComponents(innerComponents)
elif (hasattr(component, "tabs")): # component is a JavaFX TabPane
tabs = getattr(component, "tabs", [])
if isinstance(tabs, Iterable):
for tab in tabs:
self.components.append(tab)
self.getInnerComponents(tab)
else:
self.components.append(tabs)
self.getInnerComponents(tabs)
elif (hasattr(component, "columns")): # component is a JavaFX TableView
cols = getattr(component, "columns", [])
if isinstance(cols, Iterable):
for col in cols:
self.components.append(col)
self.getInnerComponents(col)
else:
self.components.append(cols)
self.getInnerComponents(cols)
def setIds(self, components):
for component in components:
componentId = getattr(component, "id", "")
strId = str(componentId)
if (not(componentId is None)) and (strId != ""):
# print("JavaFX Id: " + strId)
setattr(self, strId, component)
# end: completely rewritten by Fernando Lima