【问题标题】:how to make Jspinner change size to fit the content如何让 Jspinner 改变大小以适应内容
【发布时间】:2020-10-24 14:39:45
【问题描述】:

我希望 jspinner 调整大小以正确适应内容 我有一个带有操作系统字体的 SpinnerListModel,但是在选项之间导航时,有些选项在 Jspinner 的空间中没有正确输入

Jspinner 有什么办法可以动态调整大小,让每个字体的名字都能输入。 或者通过某种方式知道 Jspinner 的最大尺寸应该是多少,以便所有字体都可以输入。

class Lamina11 extends JPanel{

    public Lamina11(){
        String lista[]=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();

        JSpinner control= new JSpinner(new SpinnerListModel(lista));
        control.setPreferredSize(new Dimension(100,20));

        add(control);
    }
}

【问题讨论】:

    标签: java swing jcomponent autoresize jspinner


    【解决方案1】:

    您可以在JSpinnerJFormattedTextFieldDefaultEditor 上使用getFontMetricsgetFont

    您可以手动执行此操作以预先找到最大首选宽度,如下所示:

    import java.awt.Dimension;
    import java.awt.FontMetrics;
    import java.awt.GraphicsEnvironment;
    import javax.swing.JFormattedTextField;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JSpinner;
    import javax.swing.JSpinner.DefaultEditor;
    import javax.swing.SpinnerListModel;
    
    public class Main extends JPanel {
    
        public Main(){
            String lista[]=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
    
            JSpinner control= new JSpinner(new SpinnerListModel(lista));
    
            JFormattedTextField ftf = ((DefaultEditor) control.getEditor()).getTextField();
            final FontMetrics fmetrics = ftf.getFontMetrics(ftf.getFont());
            int maxWidth = 0;
            for (final String fontName: lista)
                maxWidth = Math.max(maxWidth, fmetrics.stringWidth(fontName));
            //maxWidth = Math.max(maxWidth, ftf.getPreferredSize().width); //Optional. Make this call if 'lista' could be empty.
            ftf.setPreferredSize(new Dimension(maxWidth, fmetrics.getMaxAscent() + fmetrics.getMaxDescent()));
    
            add(control);
        }
    
        public static void main(final String[] args) {
            final JFrame frame = new JFrame("JSpinner fit content size");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(new Main());
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    }
    

    动态”是指您将有一些空间供JSpinner 根据所选值增加或减少其大小,对吧?然后您可以在ChangeListener 中执行此操作,如下所示:

    import java.awt.Dimension;
    import java.awt.FontMetrics;
    import java.awt.GraphicsEnvironment;
    import javax.swing.JFormattedTextField;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JSpinner;
    import javax.swing.SpinnerListModel;
    
    public class DynamicMain extends JPanel {
    
        public DynamicMain() {
            String lista[]=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
    
            JSpinner control= new JSpinner(new SpinnerListModel(lista));
    
            //Add ChangeListener to change the size for each change in the selected value:
            control.addChangeListener(e -> {
                final JFormattedTextField ftf = ((JSpinner.DefaultEditor) control.getEditor()).getTextField();
                final FontMetrics fmetrics = ftf.getFontMetrics(ftf.getFont());
                final int maxHeightForASingleLine = fmetrics.getMaxAscent() + fmetrics.getMaxDescent();
                ftf.setPreferredSize(new Dimension(fmetrics.stringWidth((String) control.getValue()), maxHeightForASingleLine));
                revalidate();
                repaint();
            });
    
            //Note the initial size of the JFormattedTextField will depend on the currently selected value of the model.
    
            add(control);
        }
    
        public static void main(final String[] args) {
            final JFrame frame = new JFrame("JSpinner fit content size");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(new DynamicMain());
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-29
      • 2011-06-08
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 2021-05-21
      相关资源
      最近更新 更多