#format wiki
#language en
#pragma section-numbers off

= Swing Sampler =

SwingExamples

<<TableOfContents>>

----

Stored here for posterity's sake it was found on http://hcc.cc.gatech.edu/documents/230_Edwards_swing-sampler.py
and the nature of the web being what it is who knows how long it would be there or if I could find it again.
This is exactly as I found it. I have verified that it works with Jython 2.2 with Java JVM 1.5 & 1.6 and based on the code I suspect it would work with a 1.4.2 JVM

{{{
# 
# This code shows a sampler of common Java Swing widget types.  This is
# by no means all of the available widgets.  For documentation and tutorials
# on the underlying Java classes, see http://java.sun.com/products/jfc/
#

#
# We'll be using swing a lot, so import it as "swing". Swing is built using
# an older Java GUI toolkit called awt, so we'll need it too.  One of the
# examples here also uses the Java networking package (you're unlikely to
# need that for the project...)
#
import javax.swing as swing
import java.awt as awt
import java.net as net
import sys

#
# I've organized the sampler code into a single class, called SwingSampler.
# The __init__ function (called the "constructor") does all of the setup.
# Note that __init__, like all other functions in a class (called "methods")
# takes "self" as its first argument.
#
class SwingSampler:
	def __init__(self):
		#########################################################
		#
		# set up the overall frame (the window itself)
		#
		self.window = swing.JFrame("Swing Sampler!")
		self.window.windowClosing = self.goodbye
		self.window.contentPane.layout = awt.BorderLayout()

		#########################################################
		#
		# under this will be a tabbed pane; each tab is named
		# and contains a panel with other stuff in it.
		#
		tabbedPane = swing.JTabbedPane()
		self.window.contentPane.add("Center", tabbedPane);

		#########################################################
		#
		# The first tabbed panel will be named "Some Basic
		# Widgets", and is referenced by variable 'firstTab'
		#
		firstTab = swing.JPanel()
		firstTab.layout = awt.BorderLayout()
		tabbedPane.addTab("Some Basic Widgets", firstTab)

		#
		# slap in some labels, a list, a text field, etc... Some
		# of these are contained in their own panels for
		# layout purposes.
		#
		tmpPanel = swing.JPanel()
		tmpPanel.layout = awt.GridLayout(3, 1)
		tmpPanel.border = swing.BorderFactory.createTitledBorder("Labels are simple")
		tmpPanel.add(swing.JLabel("I am a label. I am quite boring."))
		tmpPanel.add(swing.JLabel("<HTML><FONT COLOR='blue'>HTML <B>labels</B>
                                          </FONT> are <I>somewhat</I><U>less boring</U>.</HTML>"))
		tmpPanel.add(swing.JLabel("Labels can also be aligned", swing.JLabel.RIGHT))
		firstTab.add(tmpPanel, "North")

		#
		# Notice that the variable "tmpPanel" gets reused here.
		# This next line creates a new panel, but we reuse the
		# "tmpPanel" name to refer to it.  The panel that
		# tmpPanel used to refer to still exists, but we no
		# longer have a way to name it (but that's ok, since
		# we don't need to refer to it any more).
		#
		tmpPanel = swing.JPanel()
		tmpPanel.layout = awt.BorderLayout()
		tmpPanel.border = swing.BorderFactory.createTitledBorder("Tasty tasty lists")

		#
		# Note that here we stash a reference to the list in
		# "self.list".  This puts it in the scope of the object,
		# rather than this function.  This is because we'll be
		# referring to it later from outside this function, so
		# it needs to be "bumped up a level."
		# 
		self.listData = ( "January", "February", "March", "April", "May", "June", "July", 
                                  "August", "September", "October", "November", "December" )		
		self.list = swing.JList(self.listData)
		tmpPanel.add("Center", swing.JScrollPane(self.list))
		button = swing.JButton("What's Selected?")
		button.actionPerformed = self.whatsSelectedCallback;
		tmpPanel.add("East", button)
		firstTab.add("Center", tmpPanel)

		tmpPanel = swing.JPanel()
		tmpPanel.layout = awt.BorderLayout()

		#
		# The text field also goes in self, since the callback
		# that displays the contents will need to get at it.
		# 
		# Also note that because the callback is a function inside
		# the SwingSampler object, you refer to it through self.
		# (The callback could potentially be outside the object,
		# as a top-level function. In that case you wouldn't
		# use the 'self' selector; any variables that it uses
		# would have to be in the global scope.
		#
		self.field = swing.JTextField()
		tmpPanel.add(self.field)
		tmpPanel.add(swing.JButton("Click Me", actionPerformed=self.clickMeCallback), "East")
		firstTab.add(tmpPanel, "South")

		#########################################################
		#
		# The second tabbed panel is next...  This shows
		# how to build a basic web browser in about 20 lines.
		#
		secondTab = swing.JPanel()
		secondTab.layout = awt.BorderLayout()
		tabbedPane.addTab("HTML Fanciness", secondTab)

		tmpPanel = swing.JPanel()
		tmpPanel.add(swing.JLabel("Go to:"))
		self.urlField = swing.JTextField(40, actionPerformed=self.goToCallback)
		tmpPanel.add(self.urlField)
		tmpPanel.add(swing.JButton("Go!", actionPerformed=self.goToCallback))
		secondTab.add(tmpPanel, "North")

		#self.htmlPane = swing.JEditorPane("http://www.cc.gatech.edu", editable=0,
                                        hyperlinkUpdate=self.followHyperlink, preferredSize=(400, 400))
		self.htmlPane = swing.JEditorPane("http://www.jython.org", editable=0, 
                                        hyperlinkUpdate=self.followHyperlink, preferredSize=(400, 400))
		secondTab.add(swing.JScrollPane(self.htmlPane), "Center")

		self.statusLine = swing.JLabel("")

		#########################################################
		#
		# The third tabbed panel is next... 
		#
		thirdTab = swing.JPanel()
		tabbedPane.addTab("Other Widgets", thirdTab)

		imageLabel = swing.JLabel(swing.ImageIcon(net.URL("http://www.gatech.edu/images/logo-gatech.gif")))
		imageLabel.toolTipText = "Labels can have images! Every widget can have a tooltip!"
		thirdTab.add(imageLabel)

		tmpPanel = swing.JPanel()
		tmpPanel.layout = awt.GridLayout(3, 2)
		tmpPanel.border = swing.BorderFactory.createTitledBorder("Travel Checklist")
		tmpPanel.add(swing.JCheckBox("Umbrella", actionPerformed=self.checkCallback))
		tmpPanel.add(swing.JCheckBox("Rain coat", actionPerformed=self.checkCallback))
		tmpPanel.add(swing.JCheckBox("Passport", actionPerformed=self.checkCallback))
		tmpPanel.add(swing.JCheckBox("Airline tickets", actionPerformed=self.checkCallback))
		tmpPanel.add(swing.JCheckBox("iPod", actionPerformed=self.checkCallback))
		tmpPanel.add(swing.JCheckBox("Laptop", actionPerformed=self.checkCallback))
		thirdTab.add(tmpPanel)

		tmpPanel = swing.JPanel()
		tmpPanel.layout = awt.GridLayout(4, 1)
		tmpPanel.border = swing.BorderFactory.createTitledBorder("My Pets")
		#
		# A ButtonGroup is used to indicate which radio buttons
		# go together.
		#
		buttonGroup = swing.ButtonGroup()

		radioButton = swing.JRadioButton("Dog", actionPerformed=self.radioCallback)
		buttonGroup.add(radioButton)
		tmpPanel.add(radioButton)

		radioButton = swing.JRadioButton("Cat", actionPerformed=self.radioCallback)
		buttonGroup.add(radioButton)
		tmpPanel.add(radioButton)
		
		radioButton = swing.JRadioButton("Pig", actionPerformed=self.radioCallback)
		buttonGroup.add(radioButton)
		tmpPanel.add(radioButton)

		radioButton = swing.JRadioButton("Capybara", actionPerformed=self.radioCallback)
		buttonGroup.add(radioButton)
		tmpPanel.add(radioButton)

		thirdTab.add(tmpPanel)
	
		self.window.pack()
		self.window.show()

	#
	# This is the callback that's run when the window closes.  Here
	# we just exit.  Note that either functions inside class
	# declarations or global functions can be callbacks.  When they're
	# inside a class they talk 'self' as the first argument.  Just
	# about all Swing callbacks also take an event argument as well.
	#
	def goodbye(self, event):
		print "Goodbye!"
		sys.exit()

	#
	# Callback for the "Click Me!" button on the first tab.  This
	# creates a new window to display what was in the text field,
	# and then clears the text field.
	#
	def clickMeCallback(self, event):
		dialog = swing.JFrame("You clicked the button!")
		dialog.contentPane.layout = awt.BorderLayout()
		dialog.contentPane.add(swing.JLabel("Text was: " + self.field.text))
		dialog.size=(400, 200)
		dialog.show()
		print "Text is ", self.field.text
		self.field.text = ""

	#
	# Callback for the "What's Selected?" button. This pops up a
	# window that shows the contents and index of the selected item.
	#
	def whatsSelectedCallback(self, event):
		dialog = swing.JFrame("Here's what's selected")
		dialog.contentPane.layout = awt.GridLayout(2, 1)
		dialog.contentPane.add(swing.JLabel("Selected value = " + str(self.list.selectedValue),
                                       swing.JLabel.CENTER))
		dialog.contentPane.add(swing.JLabel("Selected index = " + str(self.list.selectedIndex), 
                                       swing.JLabel.CENTER))
		dialog.size=(400, 200)
		dialog.show()
		print "Selected value =", self.list.selectedValue, ", selected index =", self.list.selectedIndex;

	#
	# Callback for the "Go To" button; updates the contents of the
	# HTML pane.
	#
	def goToCallback(self, event):
		self.htmlPane.setPage(self.urlField.text)

	#
	# This callback is invoked whenever a link is clicked or moused
	# over.  The event is a HyperlinkEvent, which means that it
	# defines certain fields and operations, which we can use below.
	#	
	def followHyperlink(self, event):
		if event.eventType == swing.event.HyperlinkEvent.EventType.ACTIVATED:
			self.statusLine = event.URL.toString()
			self.htmlPane.setPage(event.URL)
		elif event.eventType == swing.event.HyperlinkEvent.EventType.ENTERED:
			self.statusLine = event.URL.toString()
		elif event.eventType == swing.event.HyperlinkEvent.EventType.EXITED:
			self.statusLine = ""

	#
	# This is a common technique when a bunch of widgets share a
	# single callback.  You can look at the "source" field on the
	# event argument to see which widget generated the event.
	#
	def checkCallback(self, event):
		if event.source.selected:
			print event.source.text + " was CHECKED"
		else:
			print event.source.text + " was UNCHECKED"

	# 
	# This is the callback for all the radio buttons.
	#
	def radioCallback(self, event):
		print event.source.text + " was clicked ON"


#
# This is how you make the main entry point for your program in Python.
# The system variable __name__ will be set to the string __main__ if
# this file is passed directly on the command line to Jython.  
#
# Here, we simply create a SwingSampler, and it does everything from
# there.
#
if __name__ == "__main__":
	sampler = SwingSampler()
 
}}}