尽管在 Swing 组件中使用 String.format,但格式仍会摆动
Posted
技术标签:
【中文标题】尽管在 Swing 组件中使用 String.format,但格式仍会摆动【英文标题】:Formatting wiggle inspite of using String.format in Swing component 【发布时间】:2020-07-26 05:23:21 【问题描述】:我正在使用
String.format("w:%5d h:%5d n:%5d",a,b,c);
当鼠标移到JFrame
上时,在JLabel
中显示空格填充的int
s。认为它可能是一个标签工件,我添加了一个 JFormattedTextField
以进行很好的衡量,但它遇到了同样的问题:随着坐标从一位数变为多位数,文本会四处跳动。如何解决?
这是一些示例代码
package all.code.classes;
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
public class rough3
static String toString(int a,int b,int c)
return String.format("w:%5d h:%5d n:%5d",a,b,c);
JFormattedTextField ftf=new JFormattedTextField();
JLabel la=new JLabel();
static int x,y;
public static void main(String[] args)
SwingUtilities.invokeLater(()->
rough3 xx = new rough3();
xx.la.setHorizontalAlignment(SwingConstants.RIGHT);
JFrame fr = new JFrame();
fr.setLayout(new BorderLayout());
fr.getContentPane().add(xx.ftf, BorderLayout.SOUTH);
fr.getContentPane().add(xx.la, BorderLayout.NORTH);
fr.setSize(500, 100);
fr.setVisible(true);
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fr.addMouseMotionListener(new MouseMotionAdapter()
@Override
public void mouseMoved(MouseEvent e)
super.mouseMoved(e);
x = e.getX();
y = e.getY();
xx.ftf.setText(xx.toString(x,y,1));
xx.la.setText(xx.toString(x,y,135));
);
);
【问题讨论】:
您使用的是固定宽度字体吗?如果没有,您可能需要将这三个部分拆分为三个标签以使其“像素完美”。 @Thilo thnx..做详细说明..我使用的是默认情况下使用的摇摆...根本没有触及任何字体。 【参考方案1】:您应该添加这些行。
xx.ftf.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
xx.la.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
【讨论】:
new Font("monospaced", Font.PLAIN, 12)
虽然Font.PLAIN
是一个常量,它提供了编译时检查的优势,但"monospaced"
不是。请改用Font.MONOSPACED
(检查拼写,或让IDE/编译器为您完成!)。
@saka1029 所以问题出在字体上。由于 jdk 方法中没有内置方法来查找默认字体是否为等宽字体,因此是否必须始终使用自定义等宽字体以确保没有摆动? (Font.MONOSPACED 不适合 laf 应用)以上是关于尽管在 Swing 组件中使用 String.format,但格式仍会摆动的主要内容,如果未能解决你的问题,请参考以下文章
尽管设置为框架,但Java菜单栏不会出现在Swing GUI中