Resize JTextField to KeyPress

I need to expand the size of a JTextField on a KeyPressed event when a user types text into a text field. Please give me some idea on how to achieve this?

early

0
source share
4 answers

Ok, jumping for him :-)

Suppose the question

How to adjust the width of a JTextField so that it always matches its width of the content?

Ordinary collaborators

  • LayoutManager, which determines the sizes of its children by the size of pref, fi FlowLayout
  • JTextField reports its pref size corresponding to the content
  • automatic makeup expected.

Quick example:

JTextField field = new JTextField("something");
JComponent parent = new JPanel(); // has FlowLayout by default
parent.add(field);
frame.add(parent);
// just to ensure it bigger 
frame.setSize(400, 400);

type... : . : - - . , (: - DocumentListener) :

final JTextField field = new JTextField("something");
DocumentListener l = new DocumentListener() {

    private void updateField(JTextField field)
        // has no effect
        field.revalidate();
    }


    @Override
    public void removeUpdate(DocumentEvent e) {
        updateField(field);
    }

    @Override
    public void insertUpdate(DocumentEvent e) {
        updateField(field);
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
   }
};

field.getDocument().addDocumentListener(l);
JComponent parent = new JPanel(); // has FlowLayout by default
parent.add(field);
frame.add(parent);
// just to ensure it bigger 
frame.setSize(400, 400);

@Gagandeep Bali , , :

private void updateField(JTextField field) {
    field.getParent().revalidate();
}

, - ? : , validateRoot? api doc:

, , , JViewport, false.

, : , validateRoot. false:

JTextField field = new JTextField("something") {

    @Override
    public boolean isValidateRoot() {
        return false;
    }
};
JComponent parent = new JPanel(); // has FlowLayout by default
parent.add(field);
frame.add(parent);
// just to ensure it bigger 
frame.setSize(400, 400);

, - , . true, , .

+5

, , - CaretListener JTextField Document, Increase/Decrease JTextField, setColumns (...), Increase/Decrease JTextField

, , :

import java.awt.*;
import javax.swing.*;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;

public class JTextFieldColumnExample
{
    private int columns = 1;
    private JTextField tfield;

    private void displayGUI()
    {
        JFrame frame =  new JFrame("JTextField Columns Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JPanel contentPane = new JPanel();
        tfield = new JTextField();
        tfield.setColumns(columns);
        tfield.addCaretListener(new CaretListener()
        {
            public void caretUpdate(CaretEvent ce)
            {
                int len = tfield.getDocument().getLength();
                if (len > columns)
                    tfield.setColumns(++columns);
                else
                {
                    if (--columns != 0)
                        tfield.setColumns(columns);
                    else
                    {
                        columns = 1;
                        tfield.setColumns(columns);
                    }   
                }   
                contentPane.revalidate();
                contentPane.repaint();
            }
        });

        contentPane.add(tfield);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new JTextFieldColumnExample().displayGUI();
            }
        });
    }
}
+3

LayoutManager . , KeyListener JTextField keyRelease, ( ) ,

addDocumentListener(new DocumentListener() {

    public void changedUpdate(DocumentEvent e) {
        updateField();
    }

    public void insertUpdate(DocumentEvent e) {
        updateField();
    }

    public void removeUpdate(DocumentEvent e) {
        updateField();
    }

    public void updateField() {

        FontMetrics fm = getFontMetrics(getFont());
        String text = getText();

        int length = fm.stringWidth(text);

        Dimension size = getPreferredSize();
        Insets insets = getInsets();
        if (length < min) {

            size.width = min;

        } else {

            size.width = length + (insets.left + insets.right);

        }

        setSize(size);
        invalidate();
        repaint();

    }

});

, :

addDocumentListener(new DocumentListener() {

    public void changedUpdate(DocumentEvent e) {
        updateField();
    }

    public void insertUpdate(DocumentEvent e) {
        updateField();
    }

    public void removeUpdate(DocumentEvent e) {
        updateField();
    }

    public void updateField() {

        setColumns(getText().length());

    }

});

, . KeyListener , , - setText .

+2

1) KeyListener JTextComponent, DocumentListener,

2) FontMetrics, TextLayout, SwingUtilities

3) LayoutManager,

4), JTextField, pack() Top-Level Container,

5) ( , JPanel JComponents), revalidate() repaint(),

  • pack() Top-Level Container, contens

  • pack() Top-Level Container, , JScrollPane

6) , String , JTextComponent GUI, JTextArea ( JScrollPane), JTextField

+2

All Articles