簡體   English   中英

如何讓 Jspinner 改變大小以適應內容

[英]how to make Jspinner change size to fit the content

我希望 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);
    }
}

您可以在JSpinnerDefaultEditorJFormattedTextField上使用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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM