Gerald Bauer
JUG Austria Talk, October 2001
100 % Java, Open Source
Closed-Source Payware
Industry Strength Über-Browser
100 % Java, Open Source
100 % Java, Open Source
100 % Java, Open Source
100 % Java, Open Source
Industry-Strength Über XUL Engine
100 % Java, Open Source
Component | Provider |
---|---|
HTML Browser | JEditorPane |
HTTP Server | Homegrown (similar to Rachel's Open-Source, Ultra-Light Weight, Multi-Threaded HTTP Server) |
Template Engine | Apache Velocity |
Portal Engine | Homegrown |
XUL Engine | Homegrown - Open-Source Luxor |
Download/Upload Manager | Homegrown |
Themes, Skins, Look & Feels | CSS, Skin L&F, Oyoaha L&F, Kunststoff L&F |
Zero-Admin | Web Start |
make cross-platform user interfaces as easy to built as web pages
-> no hard-coded, platform-specific user interfaces (e.g. MFC, WinForms, Swing, Qt, etc.)
-> the answer is not yet another GUI API/toolkit/framework
<xul> <toolbar id="MAIN_TOOLBAR"> <button action="new" caption="New" icon="NEW_ICON" tooltip="Create new package" mnemonic="N" /> <button action="open" caption="Open" icon="OPEN_ICON" tooltip="Open existing Jnlp file" mnemonic="O" /> <button action="save" caption="Save" icon="SAVE_ICON" tooltip="Save Jnlp file" mnemonic="S" /> <button action="test" caption="Test" icon="TEST_ICON" tooltip="Test Jnlp Package" mnemonic="T" /> <separator/> <button action="addInformation" caption="Info" icon="ADD_INFORMATION_ICON" tooltip="Add Information Section" mnemonic="I" /> <button action="addIcon" caption="Icon" icon="ADD_ICON_ICON" tooltip="Add Icon" mnemonic="C" /> <button action="addResources" caption="Resources" icon="ADD_RESOURCES_ICON" tooltip="Add Resources Section" mnemonic="R" /> <button action="addJar" caption="Jar" icon="ADD_JAR_ICON" tooltip="Add Java Archive" mnemonic="J" /> <button action="addNativeLib" caption="Native Lib" icon="ADD_NATIVE_LIB_ICON" tooltip="Add Native Library" mnemonic="L" /> <button action="addExtension" caption="Extension" icon="ADD_EXTENSION_ICON" tooltip="Add Extension" mnemonic="E" /> </toolbar> </xul> |
The Good
The Ugly
And many more
Example:
<XwingML> <JFrame name="MainFrame" title="Bluestone XMLEdit" image="icon.gif" x="10%" y="10%" width="80%" height="80%"> <JMenuBar> <JMenu text="File" mnemonic="F"> <JMenuItem icon="open.gif" text="Open..." mnemonic="O" accelerator="VK_O,CTRL_MASK" actionListener="OpenFile"/> <JMenuItem icon="save.gif" text="Save" mnemonic="S" accelerator="VK_S,CTRL_MASK" actionCommand="save" actionListener="SaveFile"/> ... <JTabbedPane> <Tab title="XML"> <JScrollPane> <JTextArea name="EditorArea" tabSize="3" fontName="Monospaced" fontSize="14"/> </JScrollPane> </Tab> <Tab title="DOM"> <JScrollPane> <JTree name="DocumentTree" className="DOMTree"> </JTree> </JScrollPane> </Tab> </JTabbedPane> </JSplitPane> </JFrame> </XwingML> |
Break UI into Four Parts
Main Pieces of Luxor
<action>
|
<key>
|
<panel>
|
|
<icon id="NEW_ICON" ref="images/20x20/newsheet.gif" /> <icon id="OPEN_ICON" ref="images/20x20/openproject.gif" /> <icon id="SAVE_ICON" ref="images/20x20/saveproject.gif" /> <icon id="EXIT_ICON" ref="images/20x20/exit.gif" /> <keyset> <key id="new" modifiers="control" key="N" /> <key id="open" modifiers="control" key="O" /> <key id="open-url" modifiers="control" key="U" /> <key id="save" modifiers="control" key="S" /> </keyset> |
Register Action Items with XulManager
public class CmdExit extends XulAction { GUI _gui; public CmdExit( GUI gui ) { super( ActionKeys.EXIT ); _gui = gui; } public void execute() { _gui.exit(); } } |
Create MenuBar
JMenuBar menuBar = xul.createMenuBar( MenuBarKeys.MAIN_MENUBAR ); |
XML Version
<menuitem action="new" label="New..." accesskey="N" key="new" icon="NEW_ICON" /> |
Java Version
JMenuItem mi = new JMenuItem( "New..." ); mi.addActionListener( cmdNew ); mi.setMnemonic( 'N' ); mi.setAccelerator( KeyStroke.getKeyStroke( "control N" ) ); mi.setIcon( new ImageIcon( "images/newApplication.gif" ) ); |
|
Target Attribute - Display in Internal or External Browser
|
XulManager xul = XulManager.getXulManager(); // step 1: create map XulMap archMap = xul.createMap( "ARCH" ); // step 2: populate combobox using values JComboBox arch = new JComboBox( archMap.getValues() ); // example on how to get key from value String key = archMap.lookupByValue( (String) arch.getSelectedItem() ); |
|
<border title="Information"/> <choice id="LOCALE_INPUT" map="LOCALE" prepend="true" /> <text id="TITLE_INPUT" history="info.title" /> <text id="VENDOR_INPUT" history="info.vendor" /> <text id="HOMEPAGE_INPUT" history="info.homepage" /> <checkbox id="OFFLINE_ALLOWED_INPUT" caption="Offline allowed" /> <label id="LOCALE_LABEL" caption="Locale:" /> <label id="TITLE_LABEL" caption="Title:" /> <label id="VENDOR_LABEL" caption="Vendor:" /> <label id="HOMEPAGE_LABEL" caption="Homepage:" /> </panel> |
public class JnlpInformationPanel extends AbstractDetailPanel { XInput _title; XInput _vendor; XInput _homepage; XInput _offlineAllowed; XInput _locale; public JnlpInformationPanel( GUI gui, JnlpEditorPanel control ) { super( gui, control, PanelKeys.INFORMATION ); } public void init() { _locale = new XInput( this, "LOCALE_INPUT" ); _title = new XInput( this, "TITLE_INPUT" ); _vendor = new XInput( this, "VENDOR_INPUT" ); _homepage = new XInput( this, "HOMEPAGE_INPUT" ); _offlineAllowed = new XInput( this, "OFFLINE_ALLOWED_INPUT" ); } } |
public void populate( JnlpUiTreeNode node ) { JnlpInformation data = (JnlpInformation) node.getNodeData(); _locale.setText( data.getLocale() ); _title.setText( data.getTitle() ); _vendor.setText( data.getVendor() ); _homepage.setText( data.getHomepage() ); _offlineAllowed.setChecked( data.getOfflineAllowed() ); _descriptionPanel.populate( node ); } public void saveChanges( JnlpUiTreeNode node ) { JnlpInformation data = (JnlpInformation) node.getNodeData(); data.setLocale( _locale.getText() ); data.setTitle( _title.getText() ); data.setVendor( _vendor.getText() ); data.setHomepage( _homepage.getText() ); data.setOfflineAllowed ( _offlineAllowed.isChecked() ); _descriptionPanel.saveChanges( node ); } |
user.name
, os.name
)profile.vendor
, today
) Create Breadcrumbs
<table><tr><td> Look in: #foreach( $entry in $entries ) <a href="http://localhost:5050/venus?action=$action&dir=$entry.getAbsolutePath()"> $entry.getName() </a> #end <b>$current.getName()</b> </tr></td></table> |
Create Icon Listing; Layout Table in Columns
#set ($columns = 3) <table> #foreach( $rows in $files.getTableRows( $columns ) ) <tr> #foreach( $file in $rows ) <td> #if( $file.getLengthInt() < 3000 ) <img src="$file.url"> #else (no preview) #end <font size=+1> <a href="http://localhost:5050/venus?action=$action&file=$file.getAbsolutePath()"> $file.getName() </a> </font> </td> #end </tr> #end </table> |
HashMap args = new HashMap(); args.put( "files", new ColumnList( icons ) ); args.put( "action", action ); XulManager xul = XulManager.getXulManager(); String html = xul.getHTML( args, "portlet/iconFileList.html" ); |
Conclusion: Applets Are Pretty Much Dead, Applets = No Future
<jnlp href="rachel.jnlp" codebase="http://www.jenomics.de/vamp"> <information> <title>Rachel Example Application</title> <vendor>Gerald Bauer</vendor> <homepage href="http://www.vamphq.com/resources.html"/> <description>An open-source resource loading toolkit for Java Web Start that makes resource loading easy again.</description> <icon href="rachel.gif"/> <offline-allowed /> </information> <resources> <j2se version="1.3" /> <jar href="lib/hello.jar" /> <jar href="lib/crossref.jar" /> <jar href="lib/javadoc.jar" /> <jar href="lib/themes.jar" /> <jar href="lib/rachel.jar" /> <jar href="lib/log4j.jar" /> <jar href="lib/skinlf-0.31.jar" /> </resources> <security> <all-permissions /> </security> <application-desc main-class="HelloRachel" /> </jnlp> |
Tag | Description |
---|---|
Root Tags | |
jnlp
|
The jnlp file's one and only root . |
Top Level Structural Tags | |
applet-desc
[ param ]
|
Describes how to startup a Java applet. Contains information about main class, parameters, size and more. |
application-desc
[ argument ]
|
Describes how to startup a Java application. Contains information about the main class and arguments. |
component-desc
|
Specifies a component extension. |
information
|
Contains various descriptive information about the application such as title, vendor and homepage. |
installer-desc
|
Specifies an installer extension. |
resources
|
Contains an ordered set of resources that make up an application. |
security
|
Describes the application's security requirements. |
Information Tags | |
description
|
Describes the application in a single line, in a paragraph or in a couple of words for a tooltip. |
homepage
|
Contains a web address to the application's homepage. |
icon
|
Describes an icon/image for the application. |
offline-allowed
|
Indicates if the application can be started offline (that is, without a connection to the originating server). |
vendor
|
Contains the vendor's name. |
title
|
Contains the application's name. |
Resources Tags | |
extension
[ ext-download ]
|
Describes a component or installer extension that is required to run the app. |
j2se
|
Describes a supported JRE version that the application can run on. |
jar
|
Describes a jar file. |
nativelib
|
Describes a jar containing native libraries (e.g. .dll , .so ).
|
package
|
Defines a relationship between a Java package or class name and a part. |
property
|
Describes a name/value pair that is available to the application as a system property. |
Security Tags | |
all-permissions |
Indicates that the application needs full access to the local system and network. |
j2ee-application-client-permissions |
Indicates that the application needs the set of permissions defined for J2EE client apps. |
URL + Version = Unique ID
|
Alive and kicking
Dead or neglected
FAQs - Answers, Answers, Answers