【发布时间】:2021-12-05 02:07:18
【问题描述】:
我想要一个 TextField,它的宽度显示允许的最大值
输入字符。
我使用 Font.getStringBounds 来计算最大长度的宽度。
但令我惊讶的是,示例中的结果宽度看起来像是省略了
完整的角色!
- 使用 FontMetrics.stringWidth 提供相同的宽度值。
- 仅使用 JTextField(int columns) 构造函数创建 textField 结果更好,但场仍然太小。
缺少什么?
import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import javax.swing.*;
public class InputWidthTextField extends JFrame {
public InputWidthTextField() {
setSize(250, 230);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setLayout(new FlowLayout(FlowLayout.CENTER, 60, 20));
Font font= new Font(Font.MONOSPACED, Font.PLAIN, 12);
int max= 4;
JLabel lb= new JLabel("Enter up to "+max+" characters:");
add(lb);
MaxInputWidthTextField tf= new MaxInputWidthTextField(font, max);
add(tf);
setVisible(true);
}
public static void main(String... args) {
EventQueue.invokeLater(InputWidthTextField::new);
}
class MaxInputWidthTextField extends JTextField {
public MaxInputWidthTextField(Font font, int maxCount) {
super();
if (font==null)
font= getFont();
else
setFont(font);
FontMetrics fm= getFontMetrics(font);
FontRenderContext frc= fm.getFontRenderContext();
String buf= "8".repeat(maxCount);
Rectangle2D rect= font.getStringBounds(buf, frc);
Dimension dim= new Dimension((int)rect.getWidth(), (int)rect.getHeight());
setPreferredSize(dim);
System.out.println((int)rect.getWidth()+", "+(int)rect.getHeight());
System.out.println(fm.stringWidth(buf));
System.out.println(getGraphics());
}
}
}
【问题讨论】:
-
使用
public JTextField(int columns)有什么问题? -
@MadProgrammer 正如我所写:它给出了更好的结果,但并不令人满意。文本字段太小,无法在不滚动的情况下完全容纳最大字符。
-
@Jörg 仅使用 JTextField(int columns) 构造函数创建 textField 会得到更好的结果,但该字段仍然太小。 - 首选大小应该足够大保存“W”字符。必须承认,如果我输入 4 个“W”字符,它会被截断。但是对于所有其他组合,它对我来说都很好。因为我怀疑你是否会输入 4 个“W”字符,所以这个构造函数应该可以正常工作。使用用于测试此构造函数的数据发布您的minimal reproducible example,并且需要滚动 4 个字符。
-
@Jörg 真的,因为当我将您的尝试与默认实现进行比较时,我更喜欢默认实现
-
@Jörg 我认为文档说得很好“对于某些字体来说,列的含义可以被认为是一个相当弱的概念” - 所以,在非常最好,这是一个“猜测”。虽然固定宽度的字体通常会提供最好的效果,但可变宽度的字体会让你感到困惑。您还需要考虑 L&F 也将
insets应用于文本字段。查看JTextField#getPreferredSize的默认实现(发布在下面),这将使您了解 Swing 团队如何尝试解决此问题
标签: java swing jtextfield