автоматическое изменение размера шрифта - PullRequest
0 голосов
/ 05 сентября 2010

Как я могу узнать, если текст в JTextField больше, чем видимая область этих JTextField, чтобы я мог изменить размер шрифта?

Спасибо за любую помощь. Искренне Christian

Ответы [ 2 ]

1 голос
/ 05 сентября 2010

Можно вычислить ширину текста для данного шрифта с классом FontMetrics и сравнить эту длину с шириной текстового поля.

JtextField field = new JTextField();
FontMetrics fm = field.getFontMetrics(field.getFont());
int textwidth = fm.stringWidth(field.getText());
1 голос
/ 05 сентября 2010

Вместо этого спросите у JTextField, какой высоты он должен быть для выбранного шрифта, и установите предпочтительную ширину в соответствии со своей спецификацией, например 240 в примере ниже. Пользователь может использовать клавиши со стрелками влево и вправо для прокрутки текста.

JTextField.png

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

/** @see http://stackoverflow.com/questions/3646832 */
public class JTextFieldTest extends JPanel {

    public JTextFieldTest() {
        String s = "A damsel with a dulcimer in a vision once I saw.";
        JTextField tf = new JTextField(s);
        tf.setFont(new Font("Serif", Font.PLAIN, 24));
        tf.validate();
        int h = tf.getPreferredSize().height;
        tf.setPreferredSize(new Dimension(240, h));
        tf.getCaret().setDot(0);
        this.add(tf);
    }

    private void display() {
        JFrame f = new JFrame("JTextFieldTest");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new JTextFieldTest().display();
            }
        });
    }
}

Добавление: еще лучше, используйте подходящий макет и соответственно установите предпочтительный размер вмещающей панели. Это позволяет вашему первоначальному макету «дышать», если пользователь увеличивает окно.

public JTextFieldTest() {
    this.setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
    String s = "It was an Abyssinian maid, and on her dulcimer she played,";
    JTextField tf = new JTextField(s);
    tf.setFont(new Font("Serif", Font.PLAIN, 24));
    tf.validate();
    int h = tf.getPreferredSize().height;
    tf.getCaret().setDot(0);
    this.setPreferredSize(new Dimension(240, h));
    this.add(tf);
}
...