尽管在 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 中显示空格填充的ints。认为它可能是一个标签工件,我添加了一个 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 组件库

尽管设置为框架,但Java菜单栏不会出现在Swing GUI中

在swing组件中显示时所使用的字体可以用啥方法来设置

在 Java 中使用 GridBagLayout 时防止 Swing 组件偏离中心

Java详解菜单组件

我必须使用哪个 Swing 组件在 java 的同一字段中应用不同样式的文本