Java tutorial
/* * Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * SynthApplication.java requires a Synth XML file. * It should be in the class directory. Also required * are image files, which should be in the classes\images * directory */ import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.plaf.synth.*; public class SynthApplication implements ActionListener { private static String labelPrefix = "Number of button clicks: "; private int numClicks = 0; private static String synthFile = "buttonSkin.xml"; final JLabel label = new JLabel(labelPrefix + "0 "); public Component createComponents() { JButton button = new JButton("I'm a Swing button!"); button.setMnemonic(KeyEvent.VK_I); button.addActionListener(this); label.setLabelFor(button); /* * An easy way to put space between a top-level container * and its contents is to put the contents in a JPanel * that has an "empty" border. */ JPanel pane = new JPanel(new GridLayout(0, 1)); pane.add(button); pane.add(label); pane.setBorder(BorderFactory.createEmptyBorder(30, //top 30, //left 10, //bottom 30) //right ); return pane; } public void actionPerformed(ActionEvent e) { numClicks++; label.setText(labelPrefix + numClicks); } private static void initLookAndFeel() { // String lookAndFeel = "com.sun.java.swing.plaf.motif.MotifLookAndFeel"; SynthLookAndFeel lookAndFeel = new SynthLookAndFeel(); try { lookAndFeel.load(SynthApplication.class.getResourceAsStream(synthFile), SynthApplication.class); UIManager.setLookAndFeel(lookAndFeel); } catch (Exception e) { System.err.println("Couldn't get specified look and feel (" + lookAndFeel + "), for some reason."); System.err.println("Using the default look and feel."); e.printStackTrace(); } } /** * Create the GUI and show it. For thread safety, * this method should be invoked from the * event-dispatching thread. */ private static void createAndShowGUI() { //Set the look and feel. initLookAndFeel(); //Make sure we have nice window decorations. JFrame.setDefaultLookAndFeelDecorated(true); //Create and set up the window. JFrame frame = new JFrame("SynthApplication"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); SynthApplication app = new SynthApplication(); Component contents = app.createComponents(); frame.getContentPane().add(contents, BorderLayout.CENTER); //Display the window. frame.pack(); frame.setVisible(true); } public static void main(String[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application's GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } } File:buttonSkin.xml <synth><!-- Style that all regions will use--><style id="backingStyle"> <!-- Make all the regions opaque--><opaque value="TRUE"/><font name="Dialog"size="12"/><state><!--Provide default colors--><color value="#D8D987"type="BACKGROUND"/><color value="RED"type="FOREGROUND"/></state></style><bind style="backingStyle"type="region"key=".*"/><style id="buttonStyle"> <!-- Shift the text one pixel when pressed--><property key="Button.textShiftOffset"type="integer"value="1"/><insets top="15"left="20"right="20"bottom="15"/><state><imagePainter method="buttonBackground"path="images/button.png"sourceInsets="10 10 10 10"/></state><state value="PRESSED"><imagePainter method="buttonBackground"path="images/button2.png"sourceInsets="10 10 10 10"/></state></style><!-- Bind buttonStyle to all JButtons--><bind style="buttonStyle"type="region"key="button"/></synth>