2012-12-10 13 views
6

Ich versuche, mein Symbol so zu skalieren, dass es die gesamte Schaltfläche abdeckt und in der Mitte der Schaltfläche sitzt. Wenn ich es versuche, streckt es meinen Knopf und vermasselt alles andere. Wie kann ich es tun? Derzeit ist mein Code:Java Stretch-Symbol zum Anpassen der Schaltfläche

In meinem Konstruktor einer Klasse ..

javax.swing.JButton Console = new javax.swing.JButton; 
ScaleButtonImage(Console, ConsoleEnabledImage); 

Innerhalb dieser Klasse ..

private void ScaleButtonImage(javax.swing.JButton Button, java.awt.Image ButtonIcon) { 
     double Width = ButtonIcon.getWidth(Button); 
     double Height = ButtonIcon.getHeight(Button); 
     double xScale = 28/Width;//Button.getWidth()/Width; 
     double yScale = 28/Height;//Button.getHeight()/Height; 
     double Scale = Math.min(xScale, yScale); //ToFit 
     //double Scale = Math.max(xScale, yScale); //ToFill 
     java.awt.Image scaled = ButtonIcon.getScaledInstance((int)(Scale * Width), (int)(Scale * Height), java.awt.Image.SCALE_SMOOTH); 
     Button.setIcon(new javax.swing.ImageIcon(scaled)); 
    } 

LAYOUT:

.addGroup(layout.createSequentialGroup() 
         .addComponent(Enable, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE) 
         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
         .addComponent(Graphics, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE) 
         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
         .addComponent(Debug, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE) 
         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
         .addComponent(Console, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE) 
         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 

Dann verknüpfe ich alle von ihnen horizontal und vertikal, so dass sie alle die gleiche Größe haben.

Stattdessen sieht es wie folgt aus. Wenn ich das Symbol der ersten Schaltfläche ändere, ändern sich auch alle Schaltflächen aufgrund meiner Beschränkungen. Wie passe ich die Symbole den Schaltflächen an?

enter image description here

+0

[bitte Q & A von @mre zu überprüfen] (http://stackoverflow.com/search?q=user:584862+[jbutton]), JButton hat keinen LayoutManager implementiert – mKorbel

+0

Das ist schon versucht. Das Hinzufügen des Label-Bildes und das Hinzufügen zu der Schaltfläche funktioniert nicht. Ich habe auch versucht, Borderlayout in der Schaltfläche zu implementieren. Funktioniert immer noch nicht. – Brandon

+0

Ich vermute, dass bei der Größenanpassung des Bildes etwas nicht stimmt (double xScale = 28/Width; double yScale = 28/Height; ...). Auf diese Weise, denke ich, wird Ihr Verhältnis 1: 1 anstatt des ursprünglichen Verhältnisses wie 4: 3 oder 16: 9 sein. –

Antwort

10

so etwas wie dieses Versuchen (Wenn ich keinen Fehler mit Klammern gemacht habe):

JButton button = new JButton(new ImageIcon(((new ImageIcon(
      "path-to-image").getImage() 
      .getScaledInstance(64, 64, 
        java.awt.Image.SCALE_SMOOTH))))); 

Auf diese Weise wird das Bild (in meinem Fall Größe 64x64) die Größe verändert werden und hinzugefügt zu button, wie in diesem Beispiel hier:

enter image description here

EDIT:

Dies ist die Art und Weise Ihr Bild, um die zu Größe und Bild Verhältnis zu halten:

ImageIcon ii = new ImageIcon("path-to-image"); 
int scale = 2; // 2 times smaller 
int width = ii.getIconWidth(); 
int newWidth = width/scale; 
yourComponent.setIcon(new ImageIcon(ii.getImage().getScaledInstance(newWidth, -1, 
      java.awt.Image.SCALE_SMOOTH))); 
0

Das ist für mich gearbeitet:

public class ImageButton 
extends JButton { 
    private static final long serialVersionUID = 1; 

    /** @serial */ 
    private Image image; 

    /** @serial */ 
    private final Rectangle innerArea = new Rectangle(); 

    public Image getImage() { 
     return image; 
    } 

    public void setImage(Image image) { 
     this.image = image; 
     repaint(); 
    } 

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

     if (image != null) { 
      SwingUtilities.calculateInnerArea(this, innerArea); 

      g.drawImage(image, 
       innerArea.x, innerArea.y, innerArea.width, innerArea.height, 
       this); 
     } 
    } 
} 
Verwandte Themen