2013-11-23 14 views
6

Non sono sicuro se questo è il posto giusto per chiederlo, ma mi chiedo se c'è qualcosa come 9 immagini di patch su Android, ma per Java, come Oracle, PC java. Tutte le mie ricerche su google mi mostrano solo Android perché la gente chiama Java, ma non è esattamente la stessa cosa.9-patch come il ridimensionamento delle immagini per Java?

Ho trovato LibGdx ma è abbastanza pesante per l'unica capacità di nove patch che sto cercando.

Una immagine di nove patch è una che ha aree "9", con gli angoli non "ridimensionati" in genere mentre le pareti laterali e l'area centrale si estendono per adattarsi allo schermo. Un esempio da Android: http://developer.android.com/tools/help/draw9patch.html

Qualcuno sa qualcosa che può scalare in questo modo? Ho bisogno di qualcosa che supporti PNG.

+2

Google 'simile 9-patch per oscillazione buttons' I primi collegamenti a' weblookandfeel' sembrano essere quello che stai cercando. http://weblookandfeel.com/nine-patch-editor/ –

+0

Usa java2d/imageio. Puoi disegnare tutto su una BufferedImage usando la traduzione e il ridimensionamento corretti (AffineTransform) e scriverlo come PNG usando imageio –

risposta

2

Se si sta cercando un modo per utilizzare un'immagine a 9 patch su un componente Java ho posto la stessa domanda qui: How use a 9-patch image as background on a JPanel? e la risposta breve è no, non è possibile.

Quello lungo è: È possibile se si divide l'immagine in 9 immagini (bordi, angoli e centro) e si crea un componente che quando viene ridipinto si muove e ridimensiona le immagini.

L'esempio che segue è adattato per il mio caso dove:

  • Il componente è un JPanel.
  • Il centro del pannello deve essere trasparente, quindi ho bisogno di un'immagine in meno.
  • Il componente non sarà più piccolo delle immagini fornite.
  • Le immagini hanno trasparenze, questo spiega le chiamate setOpaque (false) nel codice.
  • Il codice è una bozza di massima.

Ecco il codice:

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); 
} 

} 

Ecco il codice per la classe JPanelWithBackground:

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); 
} 
} 
Problemi correlati