6

I'm not sure if this is the right place to ask, but I'm wondering if there is something like 9 patch images on android, but for Java, like Oracle, PC java. All my google searches only show me android because people call that Java, but it's not really the same.

I've found LibGdx but it's quite hefty for the single nine-patch ability that I'm looking for.

A nine patch image is one that has '9' areas, with the corners being 'not scaled' typically while the side walls and the center area stretched to fit the screen. An example from Android: http://developer.android.com/tools/help/draw9patch.html

Does anyone know anything that can scale like this? I need something that can support PNG.

Mgamerz
  • 2,872
  • 2
  • 27
  • 48
  • 2
    Google `similar 9-patch for swing buttons` The first few links to `weblookandfeel` seem to be what you're looking for. http://weblookandfeel.com/nine-patch-editor/ – Paul Samsotha Nov 23 '13 at 06:30
  • Use java2d/imageio. You can draw everything on a BufferedImage using the right translation and scaling (AffineTransform) and write it out as a PNG using imageio – Erwin Bolwidt Mar 28 '14 at 17:20

1 Answers1

2

If you are searching a way to use a 9-patch image on a Java component I asked the same question here: How use a 9-patch image as background on a JPanel? and the short answer is no, you can not.

The long one is: You can if you split the image in the 9 images (borders, corners and center) and create a component that when is repainted moves and resizes the images.

The example that follows is adapted for my case where:

  • The component is a JPanel.
  • The center of the panel has to be transparent, so I need one image less.
  • The component is not going to be smaller than the given images.
  • Images have transparences, this explains the setOpaque(false) calls in the code.
  • The code is a rough draft.

Here the code:

public class NinePatchLikePanel extends JPanel{
private JPanel corner_top_l;
private JPanel corner_top_r;
private JPanel corner_bot_l;
private JPanel corner_bot_r;

private JPanel border_ver_l;
private JPanel border_ver_r;
private JPanel border_hoz_t;
private JPanel border_hoz_b;

private int min_width, min_height;

private int corners_width;
private int corners_height;
private int borders_width;
private int borders_height;


public NinePatchLikePanel (String[] urls) {

    if(urls.length != 8) {
        throw new UnsupportedOperationException("Exception to be managed!");
    } else {
        corner_top_l = new JPanelWithBackground (urls [0]);
        corner_top_r = new JPanelWithBackground (urls [1]);
        corner_bot_r = new JPanelWithBackground (urls [2]);
        corner_bot_l = new JPanelWithBackground (urls [3]);

        border_hoz_t = new JPanelWithBackground (urls [4]);
        border_ver_r = new JPanelWithBackground (urls [5]);
        border_hoz_b = new JPanelWithBackground (urls [6]);
        border_ver_l = new JPanelWithBackground (urls [7]);

        corners_width   = corner_top_l.getWidth();
        corners_height  = corner_top_l.getHeight();

        borders_width   = border_hoz_t.getWidth();  
        borders_height  = border_ver_l.getHeight();

        min_width   = 2 * corners_width  + borders_width;
        min_height  = 2 * corners_height + borders_height;

        this.setSize (min_width, min_height );
        this.setMinimumSize ( new Dimension (min_width, min_height) );
        this.setOpaque(false);
        this.setLayout(null);
        this.add(corner_top_l);
        this.add(corner_top_r);
        this.add(corner_bot_l);
        this.add(corner_bot_r);

        this.add(border_hoz_t);
        this.add(border_ver_r);
        this.add(border_hoz_b);
        this.add(border_ver_l);
    }
}

@Override
public void paintComponent(Graphics g)  {
    super.paintComponent(g);

    int actual_width = this.getWidth();
    int actual_height = this.getHeight();

    int _x = actual_width - corners_width;
    int _y = actual_height - corners_height;

    corner_top_l.setLocation(0, 0);
    corner_top_r.setLocation(_x, 0);
    corner_bot_l.setLocation(0, _y);
    corner_bot_r.setLocation(_x, _y);

    int new_borders_width  = _x - corners_width;
    int new_borders_height = _y - corners_height;


    border_hoz_t.setLocation(corners_width, 0);
    border_hoz_t.setSize(new_borders_width, border_hoz_t.getHeight());

    border_ver_r.setLocation(_x, corners_height);
    border_ver_r.setSize(border_ver_r.getWidth(), new_borders_height);

    border_hoz_b.setLocation(corners_width, _y);
    border_hoz_b.setSize(new_borders_width, border_hoz_b.getHeight());

    border_ver_l.setLocation(0, corners_height);
    border_ver_l.setSize(border_ver_l.getWidth(), new_borders_height);
}

}

Here the code for the JPanelWithBackground class:

public class JPanelWithBackground extends JPanel { 
Image bg = null; 

public JPanelWithBackground(String url) { 
    try{
        bg = ImageIO.read(getClass().getResourceAsStream(url));
        int height = bg.getHeight(null);
        int width  = bg.getWidth(null);
        Dimension d = new Dimension(width,height);
        this.setSize (width, height);
        this.setMinimumSize ( d );
        this.setOpaque(false); 
    } catch (IOException ex) {
        //TODO: Manage this exception in a better way
            System.err.println(ex);
            System.exit(1);
    }  
} 

@Override
public void paintComponent(Graphics g) { 
    super.paintComponent(g);
    if (bg != null)
        g.drawImage(bg, 0, 0, this.getWidth(), this.getHeight(), null);
}
} 
Community
  • 1
  • 1
Nicola
  • 395
  • 2
  • 13