![](/img/trans.png)
[英]How to change the background color of a JSpinner dependent on the current edited content of the field?
[英]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);
}
}
您可以在JSpinner
的DefaultEditor
的JFormattedTextField
上使用getFontMetrics和getFont 。
您可以手動執行此操作以預先找到最大首選寬度,如下所示:
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.