2010-08-14 16 views
5

Çalışma zamanında bir JButton öğesini nasıl yeniden boyutlandırırsınız, böylece setSize tarafından verilen metne uyarlanır? Bazı araştırmalar yaptım ve şu ana kadar geldiğim kod bu. Bu bir yardımcı programa dönüştürülebilir mi?JButtons ve diğer bileşenleri metne göre yeniden boyutlandırma

FontMetrics metrics = getFontMetrics(font); 
int width = metrics.stringWidth(string); 

P.S: Düzen yöneticisi kullanılmıyor.

+1

Cevabımı güncelledim, istediğinizi yaptığını düşünüyorum. – jjnguy

cevap

6

Bileşen üzerinde setPreferredSize() kullanmanız gerekir. Daha sonra yeniden boyutlandırmak için setBounds()'u arayın.

Büyük olasılıkla düğmeyi alt sınıf olarak sınıflandırır ve yeniden boyutlandırma kodunu eklemek için setText(String text) yöntemini geçersiz kılar. o resized eğer butonuna tıklandığında zaman

public ResizeToTextButton(String txt){ 
    super(txt); 
    addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      setText(JOptionPane.showInputDialog("Text")); 
     } 
    }); 
} 

Yani, metni değiştirmek ve görebiliyordu:

@Override 
public void setText(String arg0) { 
    super.setText(arg0); 
    FontMetrics metrics = getFontMetrics(getFont()); 
    int width = metrics.stringWidth(getText()); 
    int height = metrics.getHeight(); 
    Dimension newDimension = new Dimension(width+40,height+10); 
    setPreferredSize(newDimension); 
    setBounds(new Rectangle(
        getLocation(), getPreferredSize())); 
} 

test için benim yeni JButton alt sınıfının yapıcı içinde bunu uygun şekilde.

+2

The line: "FontMetrics metrics = getFontMetrics (yeni Yazı Tipi (Font.SANS_SERIF, Font.PLAIN, 12));" diyelim: "FontMetrics metrics = getFontMetrics (getFont());", ancak bunun için çok teşekkürler. :-) – AudioDroid

+0

@ Ses, hoş geldiniz. Ve hatama işaret ettiğin için teşekkürler. Onu düzelttim. – jjnguy

+0

Ayrıca teşekkür etmeliyim. Bu, birden fazla dilde gösterilebilen uygulamalar için özellikle yararlı olmalıdır. –

2

Bir düzen yöneticisi (BorderLayout) kullanırken bile aynı sorunu yaşadım. Ama benim durumumda, ilgili düzen yöneticisinin layoutContainer() numarasına ve JFrame üzerinde repaint()'a basit bir çağrı butonun genişliğini değiştirmek için yeterliydi.

button1.setText("New Label that differs in width"); 
// button1 is inside the container horizontalBox 
horizontalBox.getLayout().layoutContainer(horizontalBox); 
repaint(); // on the containing JFrame 
+0

İpucu hoşgeldiniz :) –