java与Android本署一个平台。大部分技术可以移植。在java标准平台中引入Android NinePatch技术可以使其UI设计大大得到改善:
图片准备:
   
Android NinePatch技术介绍:http://developer.android.com/tools/help/draw9patch.html
附NinePatch jar包下载:http://download.csdn.net/detail/gaowen_han/5204821
应用NinePatch技术代码:
package com.han;import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.io.IOException;
import java.io.InputStream;import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;import com.android.ninepatch.NinePatch;@SuppressWarnings("serial")
public class NinePatchTest extends JPanel {
NinePatch ninePatch; /**
 * This constructor which serves as a content pane uses a default flow
 * layout and a double-buffering strategy.
 */
public NinePatchTest() {
ninePatch = loadNinePatch("/images/content_bg1.9.png"); add(new JButton("Button 1"));
add(new JButton("Button 2"));
add(new JButton("Button 3"));
add(new JButton("Button 4"));
} /**
 * @param path
 *            - the image path.
 * @return an NinePatch object, or {@code null} if the given path is not
 *         valid or an error occurs during loading.
 */
private NinePatch loadNinePatch(String path) {
InputStream stream = this.getClass().getResourceAsStream(path);
if (stream != null) {
try {
return NinePatch.load(stream, true, false);
} catch (IOException e) {
System.err.println("An error occurs during loading.");
e.printStackTrace();
return null;
}
} else {
System.err.println("Couldn't find the file: " + path);
return null;
}
} /**
 * To improve the repaint speed, the code block contained in
 * paintComponent() must be able to be executed quickly. For example, we
 * usually put the load image code out of the paintComponent() for rapid UI
 * update.
 * 
 * @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
 */
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
Rectangle clip = g2.getClipBounds();
ninePatch.draw(g2, clip.x, clip.y, clip.width, clip.height);
} private static void createAndShowGUI() {
// Create and set up the window.
JFrame frame = new JFrame("NinePatch test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Set up the content pane.
JPanel contentPane = new NinePatchTest();
contentPane.setOpaque(true); // content pane must be opaque
contentPane.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
frame.setContentPane(contentPane); // Display the window.
frame.pack();
frame.setVisible(true);
} public static void main(String[] args) {
// Schedule a job for the EDT:
// Creating and showing this application's GUI.
SwingUtilities.invokeLater(new Runnable() { @Override
public void run() {
createAndShowGUI();
} });
}}利用后2幅图(格式.9.png)得到如下效果:
 
如果使用传统的双线性插值进行图像缩放,我们来对比下效果:
双线性插值应用代码:
package com.han;import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;@SuppressWarnings("serial")
public class NinePatchTestForCompare extends JPanel {
BufferedImage image; /**
 * This constructor uses a default flow layout and a double-buffering
 * strategy.
 */
public NinePatchTestForCompare() {
image = loadImage("/images/content_bg2.png"); add(new JButton("Button 1"));
add(new JButton("Button 2"));
add(new JButton("Button 3"));
add(new JButton("Button 4"));
} /**
 * @param path
 *            - the image path.
 * @return an BufferedImage object, or {@code null} if the given path is not
 *         valid or an error occurs during loading.
 */
private BufferedImage loadImage(String path) {
InputStream stream = this.getClass().getResourceAsStream(path);
if (stream != null) {
try {
return ImageIO.read(stream);
} catch (IOException e) {
System.err.println("An error occurs during loading.");
e.printStackTrace();
return null;
}
} else {
System.err.println("Couldn't find the file: " + path);
return null;
}
} @Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
Rectangle clip = g2.getClipBounds();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.drawImage(image, clip.x, clip.y, clip.width, clip.height, null);
} private static void createAndShowGUI() {
// Create and set up the window.
JFrame frame = new JFrame("NinePatchTestForCompare");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Set up the content pane.
JPanel contentPane = new NinePatchTestForCompare();
contentPane.setOpaque(true); // content pane must be opaque
contentPane.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
frame.setContentPane(contentPane); // Display the window.
frame.pack();
frame.setVisible(true);
} public static void main(String[] args) {
// Schedule a job for the EDT:
// Creating and showing this application's GUI.
SwingUtilities.invokeLater(new Runnable() { @Override
public void run() {
createAndShowGUI();
} });
}}使用的前2幅图(格式.png),效果如下:不用我多说,就可以看出NinePatch技术的优势了。javaAndroidNinePatchjarSwing