2016-11-03 9 views
0

Ich habe einen Border mit dieser Verteilung: enter image description hereWie bekomme ich den verfügbaren Platz in einem Layout?

In der roten Position Ich möchte ein Bild so skaliert setzen, dass sie alle füllt sich der Raum zur Verfügung. Auch habe ich die Möglichkeit, das Bild mit verschiedenen Maßstäben des realen Bildes zu zeigen (20%, 50%, 100% ...).

Ich versuche, den Skalierungsfaktor zu finden, die das Bild passen perfekt macht:

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

Das Problem ist, dass ich nicht die Größe des verfügbaren Speicherplatzes (Für BorderLayout.CENTER) finden können. Ich schrieb im Code der Fenstergröße, aber das ist falsch, habe ich auch versucht, mit:

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

aber es gibt auch einen falschen Wert oder zumindest nicht, was ich versuche zu finden. Und ich kann keine andere Methode finden, die sich auf die Größe bezieht. Und es ist nicht machbar, den Wert aus dem Panel zu bekommen, das da sein wird, da ich den Wert vor der Erstellung brauche.

Kann mir jemand sagen, wie ich diesen Wert finden könnte? Danke.

+0

Sie haben vergessen, das von Ihnen verwendete Framework anzugeben. Sieht so aus als würdest du AWT/Swing benutzen? – SOFe

+0

@PEMapModder ja, tut mir leid, ich habe es gerade hinzugefügt. – nck

Antwort

1

Sie sollten nicht versuchen, die verfügbare Größe zu erhalten.

Wenn Sie diesen Wert wirklich wissen möchten, sollten Sie eine benutzerdefinierte Bemalung durchführen und die Größe des Bildes dynamisch ändern und das Bild in der paintComponent()-Methode malen.

So ist der Grund Code wäre so etwas wie:

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

Oder wenn Sie nicht dynamische Skalierung tun wollen, dann können Sie eine ComponentListener zu Ihrem Panel hinzufügen und behandeln Sie das componentResized Ereignis. Dann können Sie die tatsächliche Größe des Panels ermitteln und Ihre Skalierungsberechnungen durchführen. Lesen Sie den Abschnitt aus dem Swing-Tutorial unter How to Write a Component Listener für weitere Informationen und Beispiele.

Schließlich können Sie auch Darryl's Stretch Icon verwenden, die automatisch ein Icon basierend auf dem verfügbaren Platz skalieren wird. Alles, was Sie tun müssen, ist ein JLabel mit dem StretchIcon erstellen und es zu Ihrer GUI hinzufügen.

Verwandte Themen