2016-11-03 1 views
0

J'ai un BorderLayout avec cette distribution: Dans la position rouge enter image description hereComment puis-je obtenir l'espace disponible dans une mise en page?

Je veux mettre une image à l'échelle afin qu'elle remplisse tout l'espace disponible. J'ai aussi la possibilité de montrer l'image avec différentes échelles de l'image réelle (20%, 50%, 100% ...).

J'essaie de trouver le facteur d'échelle qui rend l'image adapter parfaitement:

//GET VALUES 
    int imageWidth = image1.getWidth(); 
    int imageHeight = image1.getHeight(); 
    System.out.println("Image: "+imageWidth + " "+ imageHeight); 
    int targetWidth = this.getBounds().width; 
    int targetHeight = this.getBounds().height; 
    System.out.println("Target: " + targetWidth + " "+ targetHeight); 

    //GET SCALE 
    float scaleWidth=1; 
    float scaleHeight=1; 
    if (imageWidth > targetWidth) { 
     scaleWidth = (float) targetWidth/(float) imageWidth; 
    } 
    if (imageHeight > targetHeight) { 
     scaleHeight = (float) targetHeight/(float) imageHeight; 
    } 

    return min(scaleWidth, scaleHeight); 

Le problème est que je ne trouve pas la taille de l'espace disponible (pour BorderLayout.CENTER). Je l'ai écrit dans le code de la taille de la fenêtre, mais qui est incorrecte, j'ai aussi essayé avec:

this.getLayout().preferredLayoutSize(this).width; 

mais il donne également une valeur incorrecte ou du moins pas ce que je suis en train de trouver. Et je ne trouve pas d'autre méthode liée à la taille. Et essayer d'obtenir la valeur du panel qui va être là n'est pas faisable car j'ai besoin de la valeur avant de le créer.

Quelqu'un pourrait-il me dire comment trouver cette valeur? Merci.

+0

Vous avez oublié de spécifier la structure que vous utilisez. On dirait que vous utilisez AWT/swing? – SOFe

+0

@PEMapModder oui, désolé, je viens de l'ajouter. – nck

Répondre

1

Vous ne devriez pas essayer d'obtenir la taille disponible.

Si vous voulez vraiment connaître cette valeur, vous devez effectuer une peinture personnalisée et redimensionner dynamiquement l'image et peindre l'image dans la méthode paintComponent().

Ainsi, le code de base serait quelque chose comme:

public class ImagePanel extend JPanel 
{ 
    public ImagePane(...) 
    { 
    } 

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

     int width = getWidth(); 
     int height = getHeight(); 

     // do your scaling 

     g.drawImage(...); 
    } 
} 

Ou si vous ne voulez pas faire mise à l'échelle dynamique vous pouvez ajouter un ComponentListener à votre panneau et gérer l'événement componentResized. Ensuite, vous pouvez obtenir la taille réelle du panneau et faire vos calculs d'échelle. Lisez la section du tutoriel Swing sur How to Write a Component Listener pour plus d'informations et d'exemples.

Enfin, vous pouvez également utiliser le Stretch Icon de Darryl qui met automatiquement à l'échelle une icône en fonction de l'espace disponible. Tout ce que vous devez faire est de créer un JLabel en utilisant le StretchIcon et l'ajouter à votre interface graphique.