<Swing Dev> Review Request for Bug 8146320 JTextField ignores setPreferredSize when having columns

Andrej Golovnin andrej.golovnin at gmail.com
Thu Jan 21 07:50:59 UTC 2016


Hi all,

as a long time Swing developer I want to vote against this change.
This change may break the layout of existing applications and make
them unusable. This code exists for very long time. And it should stay
as is. The only change that you should make is to document the current
behaviour.

Please run the following application to see what this change may cause:

import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.border.EmptyBorder;

/**
 * @author Andrej Golovnin
 */
public class Main {

    public static void main(String... argv) {
        EventQueue.invokeLater(Main::createAndShowUI);
    }

    private static void createAndShowUI() {
        JTextField jdk8 = new JTextField(10);
        jdk8.setPreferredSize(new Dimension(10, 20));

        JTextField jdk9 = new JDK9TextField(10);
        jdk9.setPreferredSize(new Dimension(10, 20));

        JPanel content = new JPanel();
        content.setBorder(new EmptyBorder(10, 10, 10 , 10));
        BoxLayout layout = new BoxLayout(content, BoxLayout.X_AXIS);
        content.setLayout(layout);

        content.add(jdk8);
        content.add(jdk9);

        JFrame frame = new JFrame("Bug 8146320");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setContentPane(content);
        frame.pack();
        frame.setVisible(true);
    }


    static class JDK9TextField extends JTextField {

        private Dimension prefSize;

        JDK9TextField(int columns) {
            super(columns);
        }

        @Override
        public Dimension getPreferredSize() {
            if (isPreferredSizeSet()) {
                return prefSize;
            }
            return super.getPreferredSize();
        }

        @Override
        public void setPreferredSize(Dimension preferredSize) {
            super.setPreferredSize(preferredSize);
            this.prefSize = preferredSize;
        }

    }

}

Best regards,
Andrej Golovnin



More information about the swing-dev mailing list