2016-02-29 9 views
0

我需要知道如何正確更新/調整JTextfield的高度,以便它適應運行時更改其文本字體大小?如何正確動態更新/調整JTextfield的高度,使其適應運行時更改的文本字體大小?

此代碼是我的情況的SSCCE。代碼首先從Preferences讀取字體大小;並在沒有保存優先值的情況下返回指定的默認值(12)。然後,當您通過JSpinner更改字體大小時,它會將新值保存在Preferences中,並且會在您下次啓動應用程序時讀取保存的值。下次該應用程序啓動時; JtextField將使用新保存的字體大小值創建。如何動態地實現高度的更新/調整大小?

import java.awt.*; 
import java.util.prefs.Preferences; 
import javax.swing.*; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class Accommodated_JTextField extends JFrame implements ChangeListener { 

    Preferences prefs; 
    final String fontSizePref; 

    JTextField textField; 
    Font font; 
    int fontSize; 

    SpinnerNumberModel spinnerModel; 
    JSpinner spinner_fontSize; 

    public Accommodated_JTextField() { 
     prefs = Preferences.systemNodeForPackage(Accommodated_JTextField.class); 
     fontSizePref = "fontSizePref"; 

     fontSize = prefs.getInt(fontSizePref, 12); 
     System.out.println(fontSize); 
     font = new Font(Font.SANS_SERIF, Font.PLAIN, fontSize); 

     textField = new JTextField(10); 
     textField.setFont(font); 

     spinnerModel = new SpinnerNumberModel(fontSize, 12, 40, 1); 
     spinner_fontSize = new JSpinner(spinnerModel); 
     spinner_fontSize.setPreferredSize(new Dimension(45, spinner_fontSize.getPreferredSize().height)); 
     spinner_fontSize.addChangeListener(this); 

     JPanel panel = new JPanel(); 
     panel.add(textField); 
     panel.add(spinner_fontSize); 

     add(panel); 

     setSize(700, 300); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
    } 

    @Override 
    public void stateChanged(ChangeEvent e) { 
     fontSize = ((Integer) spinner_fontSize.getValue()); 
     font = new Font(Font.SANS_SERIF, Font.PLAIN, fontSize); 
     textField.setFont(font); 
     prefs.putInt(fontSizePref, fontSize); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       Accommodated_JTextField accommodated_textField = new Accommodated_JTextField(); 
      } 
     }); 
    } 
} 
+0

您需要'revalidate'容器層次結構和'repaint'的UI – MadProgrammer

回答

1
boolean packIt = false; 

@Override 
public void stateChanged(ChangeEvent e) { 
    fontSize = ((Integer) spinner_fontSize.getValue()); 
    font = new Font(Font.SANS_SERIF, Font.PLAIN, fontSize); 
    textField.setFont(font); 
    prefs.putInt(fontSizePref, fontSize); 
    if (packIt) { 
     pack(); // will resize the GUI to minimum size needed 
     // this will result in a call to.. 
    } else { 
     revalidate(); // tell the UI to revalidate itself 
    } 
} 
+0

請[接受答案】(http://meta.stackexchange.com/a/5235/155831),如果它幫助解決了這個問題。 –

相關問題