9-patch how image scaling for Java?

I'm not sure if this is the right place, but I wonder if there is something like 9 patch images on Android, but for Java like Oracle, PC java. All my google searches show me android because people call this Java, but it’s not exactly the same.

I found LibGdx, but it's healthy enough for the only nine patch ability I'm looking for.

Nine patch images are one that has areas of "9," with the corners "not scaled," as a rule, while the side walls and the central area are stretched to fit the screen. Example from Android: http://developer.android.com/tools/help/draw9patch.html

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

+6
source share
1 answer

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

Long: you can divide the image into 9 images (borders, angles and center) and create a component that, when repainted, moves and resizes images.

The following example is adapted for my case when:

  • The component is JPanel.
  • The center of the panel should be transparent, so I need a smaller image.
  • The component will not be smaller than the specified images.
  • Images have transparency, this explains the calls to setOpaque (false) in the code.
  • The code is a draft.

Here is 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 is 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); } } 
+2
source

Source: https://habr.com/ru/post/958686/


All Articles