Java/Swing JFC/Synth Look feel

Материал из Java эксперт
Перейти к: навигация, поиск

Create and use Synth Look and feel

   <source lang="java">

/*

* 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 id="backingStyle">
   
   <opaque value="TRUE"/>
   <font name="Dialog" size="12"/>
   <state>
     
     <color value="#D8D987" type="BACKGROUND"/>
     <color value="RED" type="FOREGROUND"/>
   </state>
 </style>
 <bind style="backingStyle" type="region" key=".*"/>
 <style id="buttonStyle">
   
   <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 style="buttonStyle" type="region" key="button"/> 

</synth>

</source>
   
  
 
  



Synth dialog style

   <source lang="java">

/*

* 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.
*/ 

package lookandfeel; import java.awt.ruponent; import javax.swing.*; import static javax.swing.GroupLayout.Alignment.*; import javax.swing.plaf.synth.*; public class SynthDialog extends JFrame {

   public SynthDialog() {
     JLabel label = new JLabel("Find What:");;
       JTextField textField = new JTextField();
       JCheckBox caseCheckBox = new JCheckBox("Match Case");
       JCheckBox wrapCheckBox = new JCheckBox("Wrap Around");
       JCheckBox wholeCheckBox = new JCheckBox("Whole Words");
       JCheckBox backCheckBox = new JCheckBox("Search Backwards");
       JButton findButton = new JButton("Find");
       JButton cancelButton = new JButton("Cancel");
       // remove redundant default border of check boxes - they would hinder
       // correct spacing and aligning (maybe not needed on some look and feels)
       caseCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
       wrapCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
       wholeCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
       backCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
       GroupLayout layout = new GroupLayout(getContentPane());
       getContentPane().setLayout(layout);
       layout.setAutoCreateGaps(true);
       layout.setAutoCreateContainerGaps(true);
       layout.setHorizontalGroup(layout.createSequentialGroup()
           .addComponent(label)
           .addGroup(layout.createParallelGroup(LEADING)
               .addComponent(textField)
               .addGroup(layout.createSequentialGroup()
                   .addGroup(layout.createParallelGroup(LEADING)
                       .addComponent(caseCheckBox)
                       .addComponent(wholeCheckBox))
                   .addGroup(layout.createParallelGroup(LEADING)
                       .addComponent(wrapCheckBox)
                       .addComponent(backCheckBox))))
           .addGroup(layout.createParallelGroup(LEADING)
               .addComponent(findButton)
               .addComponent(cancelButton))
       );
      
       layout.linkSize(SwingConstants.HORIZONTAL, findButton, cancelButton);
       layout.setVerticalGroup(layout.createSequentialGroup()
           .addGroup(layout.createParallelGroup(BASELINE)
               .addComponent(label)
               .addComponent(textField)
               .addComponent(findButton))
           .addGroup(layout.createParallelGroup(LEADING)
               .addGroup(layout.createSequentialGroup()
                   .addGroup(layout.createParallelGroup(BASELINE)
                       .addComponent(caseCheckBox)
                       .addComponent(wrapCheckBox))
                   .addGroup(layout.createParallelGroup(BASELINE)
                       .addComponent(wholeCheckBox)
                       .addComponent(backCheckBox)))
               .addComponent(cancelButton))
       );
       setTitle("Find");
       pack();
       setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
   }
   
   
   private static void initLookAndFeel() {
        SynthLookAndFeel lookAndFeel = new SynthLookAndFeel();
      

           try {
             
             // SynthLookAndFeel load() method throws a checked exception
             // (java.text.ParseException) so it must be handled
             lookAndFeel.load(SynthDialog.class.getResourceAsStream("synthDemo.xml"),
                         SynthDialog.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();
           }
       
   }
   
   public static void main(String args[]) {
       java.awt.EventQueue.invokeLater(new Runnable() {
           public void run() {
               try {
                  //Set the look and feel.
              initLookAndFeel();
                  //Make sure we have nice window decorations.
               JFrame.setDefaultLookAndFeelDecorated(true);  
                } catch (Exception ex) {
                   ex.printStackTrace();
               }
               new SynthDialog().setVisible(true);
           }
       });
   }

} File: synthDemo.xml <synth>

 <style id="backingStyle">
   
   <opaque value="TRUE"/>
   <font name="Dialog" size="14"/>
   <state>
     <color value="#D8D987" type="BACKGROUND"/>
     <color value="RED" type="FOREGROUND"/>
   </state>
 </style>
 <bind style="backingStyle" type="region" key=".*"/>
 
 <style id="textfield">
   <insets top="4" left="6" bottom="4" right="6"/>
   <state>
      <font name="Verdana" size="14"/>
      <color value="#D2DFF2" type="BACKGROUND"/>       
      <color value="#000000" type="TEXT_FOREGROUND"/>
   </state>
   <imagePainter method="textFieldBorder" path="images/textfield.png"
                 sourceInsets="4 6 4 6" paintCenter="false"/>
 </style>
 <bind style="textfield" type="region" key="TextField"/>
   
 <style id="button">
   
   <property key="Button.textShiftOffset" type="integer" value="1"/>
   
   <insets top="15" left="20" bottom="15" right="20"/>
   <state>
     <imagePainter method="buttonBackground" path="images/button.png"
                   sourceInsets="10 10 10 10" />
     <font name="Dialog" size="16"/>
     <color type="TEXT_FOREGROUND" value="#FFFFFF"/>
   </state>
             
   <state value="PRESSED"> 
     <imagePainter method="buttonBackground"
            path="images/button_press.png"
                   sourceInsets="10 10 10 10" />
   </state>
           
   <state value="MOUSE_OVER">    
     <imagePainter method="buttonBackground"
            path="images/button_over.png"
                  sourceInsets="10 10 10 10" />
   </state>
 </style>
 <bind style="button" type="region" key="Button"/>
     
     
 <style id="checkbox">
   <imageIcon id="check_off" path="images/checkbox_off.png"/>
   <imageIcon id="check_on" path="images/checkbox_on.png"/>
   <property key="CheckBox.icon" value="check_off"/>
   <state value="SELECTED">   
     <property key="CheckBox.icon" value="check_on"/>
   </state>
 </style>
 <bind style="checkbox" type="region" key="Checkbox"/>   
 

</synth>

</source>