如何将指定字符串的大小设置为 JTextField?

How set size of specified String to JTextField?

JTextField in JPanelJDialog 不采用指定大小。我尝试使用 BoxLayoutFlowLayout,但仍然没有达到所需的大小。 IE。我测量了Stringexample的尺寸,把这个尺寸设置为JTextFieldinputCat的宽度,但是inputCat没有取这个尺寸,那我就叫它.如何将指定的 String 的大小正确设置为 JTextField?这是我的代码:

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.util.Calendar;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JComboBox;
import javax.swing.JDesktopPane;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerDateModel;
import javax.swing.SpinnerModel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class DemoJDialog {

    static private JInternalFrame internal;


    public static void main(String[] args) {
        new DemoJDialog();
    }

    public DemoJDialog() {
        EventQueue.invokeLater(new Runnable() {
            @SuppressWarnings({ "rawtypes", "unchecked" })
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                internal = new JInternalFrame("Example", true, true, false, true);
                internal.setLayout(new BorderLayout());
                internal.setVisible(true);

                JDesktopPane dp = new JDesktopPane();
                dp.add(internal);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(dp);
                frame.setSize(800, 600);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);


                JTextField inputCat = new JTextField(); 


                String example = new String("Some very-very-very-"
                        + "very-very-very-very-very-very long string (really long )");
                int heightInputCat = inputCat.getSize().height;
                FontMetrics FN = internal.getFontMetrics(internal.getFont());
                int widthInputCat = SwingUtilities.computeStringWidth(FN, example);
                inputCat.setSize(widthInputCat, heightInputCat);



                String[] comboString = { "Telecast", "Radiocast" };
                JComboBox comboBox = new JComboBox(comboString);

                Calendar now = Calendar.getInstance();
                SpinnerModel modelSpinner = new SpinnerDateModel(now.getTime(), 
                        null, null, Calendar.MONTH);
                final JSpinner spinner = new JSpinner(modelSpinner);
                spinner.setEditor(new JSpinner.DefaultEditor(spinner)); 

                JPanel listPane = new JPanel();
                listPane.setLayout(new BoxLayout(listPane, BoxLayout.X_AXIS));
                listPane.add(comboBox);
                listPane.add(Box.createHorizontalStrut(10));
                listPane.add(inputCat);
                listPane.add(Box.createHorizontalStrut(10));
                listPane.add(spinner);

                Object[] array = {
                        new JLabel ("Enter a new category:"),
                        listPane
                };

                JOptionPane pane = new JOptionPane(array, JOptionPane.PLAIN_MESSAGE,
                        JOptionPane.OK_CANCEL_OPTION);
                JDialog dialog = pane.createDialog(internal, "Enter a new category:");
                dialog.setVisible(true);


            }
        });
    }

}

这在这里工作得很好:

import java.awt.EventQueue;
import java.util.Calendar;
import javax.swing.*;

public class DemoJDialog {

    public static void main(String[] args) {
        new DemoJDialog();
    }

    public DemoJDialog() {
        EventQueue.invokeLater(new Runnable() {
            @SuppressWarnings({"rawtypes", "unchecked"})
            @Override
            public void run() {
                String example = new String("Some very-very-very-"
                        + "very-very-very-very-very-very "
                        + "long string (really long)");
                // create a textfield the size of the string!
                JTextField inputCat = new JTextField(example);
                inputCat.setCaretPosition(0);

                String[] comboString = {"Telecast", "Radiocast"};
                JComboBox comboBox = new JComboBox(comboString); 

                Calendar now = Calendar.getInstance();
                SpinnerModel modelSpinner = new SpinnerDateModel(now.getTime(),
                        null, null, Calendar.MONTH);
                final JSpinner spinner = new JSpinner(modelSpinner);
                spinner.setEditor(new JSpinner.DefaultEditor(spinner));

                JPanel listPane = new JPanel();
                listPane.setLayout(new BoxLayout(listPane, BoxLayout.X_AXIS));
                listPane.add(comboBox);
                listPane.add(Box.createHorizontalStrut(10));
                listPane.add(inputCat);
                listPane.add(Box.createHorizontalStrut(10));
                listPane.add(spinner);

                Object[] array = {
                    new JLabel("Enter a new category:"),
                    listPane
                };

                JOptionPane pane = new JOptionPane(array, JOptionPane.PLAIN_MESSAGE,
                        JOptionPane.OK_CANCEL_OPTION);
                JDialog dialog = pane.createDialog(listPane, "Enter a new category:");
                dialog.setVisible(true);
            }
        });
    }
}

But JTextField is filled by the example String. And I need empty JTextField with this width

只需使用指定所需列数的构造函数:

JTextField inputCat = new JTextField(example.length());