2016-02-29 1 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' интерфейс – 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), если помогли решить проблему. –

Смежные вопросы