Developing GNOME Applications with Java
Listing 4. ExampleSWT.java Fragment
public class ExampleSWT {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout(SWT.VERTICAL));
Composite msgbox = new Composite(shell,
SWT.NO_TRIM);
RowLayout msglayout = new RowLayout();
msglayout.justify = true;
msgbox.setLayout(msglayout);
Label label = new Label(msgbox, SWT.NO_TRIM);
label.setText("Quit?");
Composite buttonbox = new Composite(shell,
SWT.NO_TRIM);
RowLayout buttonlayout = new RowLayout();
buttonlayout.justify = true;
buttonlayout.pack = true;
buttonbox.setLayout(buttonlayout);
Button yesButton = new Button(buttonbox,
SWT.PUSH);
yesButton.setText("Yes");
Button noButton = new Button(buttonbox,
SWT.PUSH);
noButton.setText("No");
yesButton.addSelectionListener(
new SelectionAdapter() {
public void widgetSelected(
SelectionEvent event) {
System.exit(0);
}
});
noButton.addSelectionListener(
new SelectionAdapter() {
public void widgetSelected(
SelectionEvent event) {
System.exit(1);
}
});
shell.pack();
shell.open();
while (! shell.isDisposed()) {
if (! display.readAndDispatch()) display.sleep();
}
}
}
IBM sponsors the Eclipse Project, an effort to produce an open-source development environment. One of the fruits of this project is the Standard Widget Toolkit, an alternative to AWT and Swing. SWT is a peer-based, operating system-independent interface that uses the host operating system's interface for rendering common components. Components not supported by an operating system are implemented in Java. On Linux, the libswt-gtk2 package provides a GTK peer for SWT. Peers also exist for other platforms, including Solaris and Windows. SWT code can run on any platform that has an SWT peer. An example SWT application is shown in Listing 4, which can be compiled against the GTK SWT peer with a variation of the following:
gcj --CLASSPATH=/usr/lib/libswt-gtk2.jar -lswt-gtk2 -o ExampleSWT --main=ExampleSWT ExampleSWT.java
See Resources for more information about the Standard Widget Toolkit.
With three existing Java GUI toolkits, one might ask why another alternative is necessary. GNOME's Java bindings are unique because they are tied directly to GNOME. An application written with GNOME's Java offerings looks and behaves exactly as if it had been written using GNOME's C libraries. It integrates seamlessly into the GNOME desktop and provides the same capabilities as any other GNOME application. The reason for this is GNOME's Java bindings use the Java Native Interface to delegate work directly to GNOME's C libraries.
Currently, GNOME's Java bindings consist of four libraries—libgconf-java, libglade-java, libgnome-java and libgtk-java. libgtk-java and libgnome-java provide the GUI components of the bindings. libglade-java allows Java applications to read graphical user interface descriptions created by GLADE. Investigating libgconf-java, the Java interface to the GConf configuration system, is left as an exercise for the reader.
libgtk-java and libgnome-java are similar to SWT and AWT because host code implements their graphical components. However, the GNOME libraries are quite different from AWT, Swing and SWT—GNOME libraries make no claim of platform-independence. GNOME applications written in Java run only in a GNOME environment. Any platform independence is a result of the entire GNOME environment itself being platform-independent.
Listing 5. ExampleGNOME.java Fragment
public class ExampleGNOME {
private LibGlade libglade;
private static final String GLADE_FILE =
"ExampleGNOME.glade";
public ExampleGNOME () throws IOException {
libglade = new LibGlade(GLADE_FILE, this);
}
public void on_noButton_released(GtkEvent event) {
Gtk.mainQuit();
System.exit(1);
}
public void on_yesButton_released(GtkEvent event) {
Gtk.mainQuit();
System.exit(0);
}
public static void main(String args[]) {
ExampleGNOME gui;
Gtk.init(args);
try {
gui = new ExampleGNOME();
} catch (IOException e) {
System.err.println(e);
System.exit(1);
}
Gtk.main();
}
}
A gcc-java-compiled GNOME application is captured in Figure 3. Listing 5 shows the GNOME application's source code and can be compiled with:
gcj --CLASSPATH=/usr/share/java/gtk2.4.jar:\ /usr/share/java/gnome2.8.jar:\ /usr/share/java/glade2.8.jar \ -lgtkjar2.4 -lgnomejar2.8 -lgladejar2.8 \ -o ExampleGNOME --main=ExampleGNOME \ ExampleGNOME.java

Figure 3. A Java GNOME Application
At first glance, Listing 5 may look a little sparse compared to the others. ExampleGNOME's user interface is defined in ExampleGNOME.glade; as a result, there is not much GUI code in the application itself. Instead, libglade-java reads ExampleGNOME.glade and creates the application's GUI components automatically. The GUI code is tied back to our code by event callback methods. Two of these callbacks, whose names and corresponding signals are defined in ExampleGNOME.glade, are on_noButton_released and on_yesButton_released. Listing 6 contains the contents of a portion of ExampleGNOME.glade.
Realizing the promise of Apache® Hadoop® requires the effective deployment of compute, memory, storage and networking to achieve optimal results. With its flexibility and multitude of options, it is easy to over or under provision the server infrastructure, resulting in poor performance and high TCO. Join us for an in depth, technical discussion with industry experts from leading Hadoop and server companies who will provide insights into the key considerations for designing and deploying an optimal Hadoop cluster.
Sponsored by AMD
Built-in forensics, incident response, and security with Red Hat Enterprise Linux 6
Every security policy provides guidance and requirements for ensuring adequate protection of information and data, as well as high-level technical and administrative security requirements for a system in a given environment. Traditionally, providing security for a system focuses on the confidentiality of the information on it. However, protecting the data integrity and system and data availability is just as important. For example, when processing United States intelligence information, there are three attributes that require protection: confidentiality, integrity, and availability.
Learn more about catching the bad guy in this free white paper.
Sponsored by DLT Solutions
| Designing Electronics with Linux | May 22, 2013 |
| Dynamic DNS—an Object Lesson in Problem Solving | May 21, 2013 |
| Using Salt Stack and Vagrant for Drupal Development | May 20, 2013 |
| Making Linux and Android Get Along (It's Not as Hard as It Sounds) | May 16, 2013 |
| Drupal Is a Framework: Why Everyone Needs to Understand This | May 15, 2013 |
| Home, My Backup Data Center | May 13, 2013 |
- Linux Systems Administrator
- New Products
- Senior Perl Developer
- Technical Support Rep
- UX Designer
- Web & UI Developer (JavaScript & j Query)
- Designing Electronics with Linux
- Dynamic DNS—an Object Lesson in Problem Solving
- Using Salt Stack and Vagrant for Drupal Development
- Making Linux and Android Get Along (It's Not as Hard as It Sounds)
- Have you tried Boxen? It's a
2 hours 8 min ago - seo services in india
6 hours 40 min ago - For KDE install kio-mtp
6 hours 41 min ago - Evernote is much more...
8 hours 41 min ago - Reply to comment | Linux Journal
17 hours 26 min ago - Dynamic DNS
18 hours 40 sec ago - Reply to comment | Linux Journal
18 hours 59 min ago - Reply to comment | Linux Journal
19 hours 49 min ago - Not free anymore
23 hours 51 min ago - Great
1 day 3 hours ago
Enter to Win an Adafruit Pi Cobbler Breakout Kit for Raspberry Pi

It's Raspberry Pi month at Linux Journal. Each week in May, Adafruit will be giving away a Pi-related prize to a lucky, randomly drawn LJ reader. Winners will be announced weekly.
Fill out the fields below to enter to win this week's prize-- a Pi Cobbler Breakout Kit for Raspberry Pi.
Congratulations to our winners so far:
- 5-8-13, Pi Starter Pack: Jack Davis
- 5-15-13, Pi Model B 512MB RAM: Patrick Dunn
- 5-21-13, Prototyping Pi Plate Kit: Philip Kirby
- Next winner announced on 5-27-13!
Featured Jobs
| Linux Systems Administrator | Houston and Austin, Texas | Host Gator |
| Senior Perl Developer | Austin, Texas | Host Gator |
| Technical Support Rep | Houston and Austin, Texas | Host Gator |
| UX Designer | Austin, Texas | Host Gator |
| Web & UI Developer (JavaScript & j Query) | Austin, Texas | Host Gator |
Free Webinar: Hadoop
How to Build an Optimal Hadoop Cluster to Store and Maintain Unlimited Amounts of Data Using Microservers
Realizing the promise of Apache® Hadoop® requires the effective deployment of compute, memory, storage and networking to achieve optimal results. With its flexibility and multitude of options, it is easy to over or under provision the server infrastructure, resulting in poor performance and high TCO. Join us for an in depth, technical discussion with industry experts from leading Hadoop and server companies who will provide insights into the key considerations for designing and deploying an optimal Hadoop cluster.
Some of key questions to be discussed are:
- What is the “typical” Hadoop cluster and what should be installed on the different machine types?
- Why should you consider the typical workload patterns when making your hardware decisions?
- Are all microservers created equal for Hadoop deployments?
- How do I plan for expansion if I require more compute, memory, storage or networking?




Comments
need to develop a software in java
hey buddy
i need to make a software for a billing to a customer suggest me a tool
Makefiles please
There are no compile instructions in the article for GnomeSesameFormat, and the rest (except for HelloWorld) don't seem to work for me on latest Fedora-Core development.
Could you add a simple Makefile to your resources? Perhaps one for FC3 and another for FC4?
is libglade available in Windows?
Loading GUI from a single descriptive .glade file is quite interesting... could I use it in my win32 pygtk app?
Yes indeed you can. Glade
Yes indeed you can.
Glade GUI files are brilliant in the way that you can reuse them for implementing an application in various programming languages (if needed). For instance in C/C++/C#, Python, Java.. and without making changes to the glade GUI file.
Brilliant that is!
Both Glade and Libglade are available on windows
Both Glade 2 and Libglade are available on windows
http://gladewin32.sourceforge.net/
Re:Both Glade and Libglade are available on windows
Yepp - excellent. Now I can use my Laptop, when I go on a holiday-trip. On this machine I am missing some special drivers ... so I am stuck to Windows.
This article claims that Exam
This article claims that ExampleSwing.java and ExmapleAWT.java were compiled with gcj, for example:
"Listing 3 can be compiled with gcj --main=ExampleSwing -o ExampleSwing ExampleSwing.java."
I don't think anyone has implemented a complete open source version of Swing yet, and it certainly doesn't work out of the box. Try it.
Try it yourself.
No, the Swing support in GCJ is not 100% yet. That doesn't mean it's not far along enough to be able to run that simple example.
Try it yourself. (And consider upgrading if it doesn't work.)
What about windows?
There's a windows compilation howto here:
http://java-gnome.sourceforge.net/cgi-bin/bin/view/Main/WindowsCompilation
However, this is non-free and non-native, as it still uses a JVM and .class files. Does anyone know how to use gcj to create native binaries of java-gtk/java-glade programs for windows?
Cross-compiling is fine, setting up Mingw/MSYS like the article suggests is fine, but nothing I've tried thus far can generate an executable like gcj on linux is doing.
it's free & native
i just completed the instructions using the "current" (as of earlier this week) MinGW, MSYS, & msysDTK.
there are a few gotchas not documented in the instructions (maybe due to different versions of MinGW), but otherwise the building of libgtk-java & libglade-java went okay.
to test the build i ran an example from each package (gtk & glade) using both gcj (bytecode & native) & gij.
the java-gnome instructions for native java compiles reference shared libraries, but as java-gnome won't build as shared libraries on win32, the instructions obviously can't apply to win32. here documents how to build DLLs, but i couldn't get that to work either (though i think the examples used there are all pure java, no C as with gtk, i believe). i can build huge monolithic native executables (5 MB stripped for one of the gtk example applications) by just referencing all needed jar files during the compile (and don't forget "-fjni"), but that's ridiculous (and doesn't allow for commercial applications as LGPL libraries, such as gtk, can only be compiled against as shared libraries without being LGPL or GPL).
the runExample.sh script doesn't work for me, so to run an example "by hand", after following the build instructions:
export PATH=/mingw/bin:/target/bin:/usr/local/bin:$PATH
export CLASSPATH=/mingw/share/java/libgcj-3.4.2.jar:/usr/local/share/java/gtk2.6-2.6.2.jar:/usr/local/share/java/glade2.10.jar
cd /usr/local/src/libgtk-java-2.6.2/doc/examples
gcj -C testgtk/TestGTK.java
gij testgtk.TestGTK
cd /usr/local/src/libglade-java-2.10.1/doc/examples
gcj -C glade/Test.java
gij glade.Test
maybe the runExample.sh script needs to be patched to properly handle MinGW's gcj/gij. maybe i'll do that... tomorrow.
Do it in C or Python
And don't expect Linux or Gnome users to use your java app.
Whats with the anti-Java attitude
im sick of people's attitude towards Java if you use gnome libs to build gui instead of swing then you dont have to stick with Suns vm or interpreter.
C wont give you a significant speed advantage and development of usable good code will be slower cause things a simply more lowlevel.
Python is supposed to have a much more beautiful and elegang syntax which might be true but many developers have experience with Java and dont like to learn a new syntax just because some ppl are running crusades against their language. And besides that Python is slow,, ppl always yap about java being slow its not,, a lot have changed since Java 1.3 yes, swing maybe slow and some stuff like geometry have some left to be desired, besides that Java will give C a run for its money
in several types of apps, no im not saying that stuff like the kernel
should be made in Java but desktop apps could be made just as good and
development would just be faster with Java. Python on the other hand is dead slow run psycho on it i dont care. In almost every perfooormance bench it LOSES.
support java, but don't bash python
i find it humorous that you respond to someone bashing java by bashing python. yes, the original poster tried to laud c & python over java, but that doesn't mean you have to lash out against python, because now you have shown the same narrow-mindedness as the original poster (just with a different language ignorance/prejudice).
many developers familiar with both java & python have documented their experience on the net, and many have said that python is prefered for various reasons, so there is something to be investigated there. but that is just those people's opinions, and of course it's not better than java in ALL situations (use the "right", most appropriate, tool for the job).
most humorously, the major reason python is touted over java is the reason you give for java over c: python is even more high-level than java, meaning higher productivity.
i'm interested in this article (though read in my dead-tree copy, i stumbled across the online edition searching for "java gtk glade" as i don't want the gnome dependency on linux and it's not available for windows) because i want to experiment with glade in both pygtk & java-gtk, while expanding my python knowledge and learning java (as a 10-year c++ veteran).
That users (either you) wont
That users (either you) wont even know it was coded in Java :-)))
Thats the most nice thing about gcj... creating native binaries.
a question
One question? Does the .glade file have to be distributed with the compiled application, or is it statically included in the compiled binary?
For example, in Listing 5, would I need to ship ExampleGNOME.glade with the compiled app?
Last time I was checking on G
Last time I was checking on Glade's progress it was already possible to load .glade from anywhere - effectively in-memory array.
So in the end you can have single executable with no external dependencies.
On other side, if you are talking about real-world distribution, it doesn't matter at all: end-user got only .deb or .rpm or whatever.
After all, license text must be included as well ;-)
Re: a question
No, the .glade file is not required to run the compiled binary. It is used while designing your GUI (in glade) and brought in during compilation.
Not if you use LibGlade, AFAI
Not if you use LibGlade, AFAIK. And LibGlade is recommended now, instead of C code generation...
Great article! If you comp
Great article!
If you compile java code to native code with gcj, it's a good idea to remove the symbols from the resulting object file, e.g.
strip HelloWorld
Reduces the size of the binary significally.
Hello-World is Cult 8-)
The "hello world" lines are cult and have to begin every programming-lesson 8-)))))))
This is a great article!
This is a great article! Thanks for the great tutorial as well as information on the differences between AWT and Swing.
Is there a way, however, to compile this almost like a Makefile where the libraries are automatically found via "pkg-config" or "pkgconfig" which can be saved in variables which are called during the actual compile?