2012-12-05 11 views
5

Próbuję automatycznie zwiększać/zmniejszać rozmiar czcionki tekstu JButton (jeśli JButton zwiększa/rozciąga się jego tekst również się zwiększy, jeśli JButton zmniejszy się jego tekst również się zmniejszy). Domyślną czcionką JButtonów będzie Sans-Serif, rozmiar 20 i nigdy nie może spaść poniżej 20 (może być 21, 30, 40 lub coś powyżej lub równego 20, ale nigdy poniżej 20). Mam JPanel, nazwany MenuJPanel, używa GridLayout do dodania 5 JButtonów, które zwiększą/zmniejszą rozmiar, gdy JPanel wzrośnie/zmarnie. Wybrałem GridLayout, ponieważ wygląda na najlepszy układ do tego celu, czy jestem w błędzie? Dodałem również komponentRozdzielony do MenuJPanel. Poniżej możesz zobaczyć mój kod, który częściowo działa.Jak automatycznie zwiększać lub zmniejszać rozmiar tekstu JButton na podstawie rozmiaru JButton?

enter image description here

public class MenuJPanel extends JPanel { 

    private JButton resizeBtn1; 
    private JButton resizeBtn2; 
    private JButton resizeBtn3; 
    private JButton resizeBtn4; 
    private JButton resizeBtn5; 

    public MenuJPanel() { 
     initComponents(); 
     this.addComponentListener(new ComponentAdapter() { 
      @Override 
      public void componentResized(ComponentEvent e) { 

       Font btnFont = resizeBtn1.getFont(); 
       String btnText = resizeBtn1.getText(); 

       int stringWidth = resizeBtn1.getFontMetrics(btnFont).stringWidth(btnText); 
       int componentWidth = resizeBtn1.getWidth(); 

       // Find out how much the font can grow in width. 
       double widthRatio = (double) componentWidth/(double) stringWidth; 

       int newFontSize = (int) (btnFont.getSize() * widthRatio); 
       int componentHeight = resizeBtn1.getHeight(); 

       // Pick a new font size so it will not be larger than the height of label. 
       int fontSizeToUse = Math.min(newFontSize, componentHeight); 

       // Set the label's font size to the newly determined size. 
       resizeBtn1.setFont(new Font(btnFont.getName(), Font.BOLD, fontSizeToUse)); 
      } 
     }); 
    } 

    private void initComponents() { 

     resizeBtn1 = new javax.swing.JButton(); 
     resizeBtn2 = new javax.swing.JButton(); 
     resizeBtn3 = new javax.swing.JButton(); 
     resizeBtn4 = new javax.swing.JButton(); 
     resizeBtn5 = new javax.swing.JButton(); 

     setLayout(new java.awt.GridLayout(5, 0)); 

     resizeBtn1.setText("Text to resize 1"); 
     add(resizeBtn1); 

     resizeBtn2.setText("Text to resize 2"); 
     add(resizeBtn2); 

     resizeBtn3.setText("Text to resize 3"); 
     add(resizeBtn3); 

     resizeBtn4.setText("Text to resize 4"); 
     add(resizeBtn4); 

     resizeBtn5.setText("Text to resize 5"); 
     add(resizeBtn5); 
    } 
} 
+3

Twoim problemem jest to, że nie wysłałeś SSCCE, whats btnOperatorLogout, gdzie w głównej klasie, przepraszam, leniwość też mnie pokonała, przy okazji ten prosty problem został rozwiązany wiele razy na tym forum, mogę zobaczyć kilka kodu dla DeriveFont & JLabel – mKorbel

+0

dziękuję, właśnie naprawiłem przykładowy kod – jadrijan

+1

czy potrafisz obliczyć wewnętrzny obszar (patrz linia o JButton, jeśli jest zaznaczony), co oznacza, że ​​otrzymujesz Insets z JButton i minus 1pixel dla Borders (patrz linia o JButton, jeśli jest wybrana), a następnie wynik jest dostępny wymiar dla SwingUtilities # computeStringWidht :-) – mKorbel

Odpowiedz

5

Zazwyczaj pierwszeństwo ButtonUI delegat na JButton oblicza Buttona preferowany rozmiar czcionki na podstawie wybranego projektanta i estetyki platformy. Ponieważ Twoje podejście to pokonuje, musisz sam zdecydować, w jaki sposób tekst będzie skalowany za pomocą przycisku i dekoracji przycisków.

Bez tworzenia własnego ButtonUI, można po prostu skalować tekst. W tym example, TextLayout jest używany do renderowania tekstu w dowolnym rozmiarze, który może zostać zmniejszony w razie potrzeby. W tym example znacznik jednej cyfry jest renderowany w postaci BufferedImage i skalowany, aby pasował do bieżącego rozmiaru przycisku. Jeśli chcesz poradzić sobie ze względnym pozycjonowaniem Icon, zobacz SwingUtilities.layoutCompoundLabel(), zbadane here.

+0

Dziękuję bardzo za tę odpowiedź. Mam jeszcze jedno pytanie, co jeśli Tekst mojego JButton używa HTML na przykład: " Linia1
Linia2", czy powyższe przykłady będą nadal działać? – jadrijan

+0

Dziękuję Spróbuję i dam znać – jadrijan

+0

Nie jestem pewien; 'layoutCompoundLabel()' może obsłużyć to. Może być łatwiej renderować 'JLabel', jak pokazano [tutaj] (http://stackoverflow.com/a/7028497/230513) dla' JPanel' [edytuj]. – trashgod

Powiązane problemy