Java 如果文本不';不适用于JLabel

Java 如果文本不';不适用于JLabel,java,swing,fonts,jlabel,Java,Swing,Fonts,Jlabel,有很多关于这个问题的帖子,但是我不理解里面的人给出的答案。 就像在这篇文章中:“答案将字体大小转换为14!”!但这是静态的,在其他答案中更进一步;他们的整个输出屏幕似乎在增加 我在名为“lnum”的JLabel中显示某些数字,它最多可以显示3位数字,但之后显示为“4…”我希望,如果数字能够放入标签中,它不应该更改其字体大小,但如果数字是4位,它应该以适合的方式减小字体大小。注意:我不希望jLabel的尺寸发生变化。我只想更改其中的文本 编辑: 这是我试过的代码 String text = lnu

有很多关于这个问题的帖子,但是我不理解里面的人给出的答案。 就像在这篇文章中:“答案将字体大小转换为14!”!但这是静态的,在其他答案中更进一步;他们的整个输出屏幕似乎在增加

我在名为“lnum”的JLabel中显示某些数字,它最多可以显示3位数字,但之后显示为“4…”我希望,如果数字能够放入标签中,它不应该更改其字体大小,但如果数字是4位,它应该以适合的方式减小字体大小。注意:我不希望jLabel的尺寸发生变化。我只想更改其中的文本

编辑: 这是我试过的代码

String text = lnum.getText();        
System.out.println("String Text = "+text);//DEBUG
Font originalFont = (Font)lnum.getClientProperty("originalfont"); // Get the original Font from client properties            
 if (originalFont == null) { // First time we call it: add it
        originalFont = lnum.getFont();
        lnum.putClientProperty("originalfont", originalFont);
    }
 int stringWidth = lnum.getFontMetrics(originalFont).stringWidth(text);       

 int componentWidth = lnum.getWidth();
 stringWidth = stringWidth + 25; //DEBUG TRY
 if (stringWidth > componentWidth) { // Resize only if needed
        // Find out how much the font can shrink in width.
        double widthRatio = (double)componentWidth / (double)stringWidth;

        int newFontSize = (int)Math.floor(originalFont.getSize() * widthRatio); // Keep the minimum size

        // Set the label's font size to the newly determined size.
        lnum.setFont(new Font(originalFont.getName(), originalFont.getStyle(), newFontSize));
    }else{
        lnum.setFont(originalFont); // Text fits, do not change font size
        System.out.println("I didnt change it hahaha");//DEBUG 
 }
    lnum.setText(text);
我有一个问题,很多时候它不起作用,比如如果文本是“-28885”,它显示“-28…”

stringWidth=stringWidth+25//调试尝试

我不得不添加这段代码,这样它就增加了它得到的长度。这是我添加的代码,只是暂时解决了这个问题。我想要一个永久的解决方案。

改编自:

当您要显示一个合适的数字时,您应该将字体重置回原来的字体(请参阅
其他部分
部分)


编辑:如果你不能/不想保留对原始字体的引用,你可以将其保存为“客户端属性”(见第一行)。

检查你提到的问题的第二个答案:@Matthieu我读过那篇文章,但问题是我几乎无法理解他试图解释的内容。在他展示的图像中,输出窗口jlabel增加了,但我不想这样;我想调整(减小)字体大小,使其适合同一窗口-JLabelh基本上是计算
stringWidth
中文本所需的大小,并将其与
componentWidth
JLabel
的大小进行比较,以计算
宽度比。“我会在回答中发展出来的。”马修,还有一件事;我无法使用字体“labelFont=lnum.getFont();”properly@Matthieu因此,我不想采用它(因为它不采用我选择的字体),而是希望采用这样的字体:font-labelFont=“Times New Roman”;(但这确实有效)@user2203870总是乐于帮助:)如果代码是负数,我在使用文本代码时遇到问题number@user2203870它不会改变。最后,
JLabel
将显示一个字符串。只有那根绳子的宽度才重要。你的问题到底在哪里?
void setTextFit(JLabel label, String text) {
    Font originalFont = (Font)label.getClientProperty("originalfont"); // Get the original Font from client properties
    if (originalFont == null) { // First time we call it: add it
        originalFont = label.getFont();
        label.putClientProperty("originalfont", originalFont);
    }

    int stringWidth = label.getFontMetrics(originalFont).stringWidth(text);
    int componentWidth = label.getWidth();

    if (stringWidth > componentWidth) { // Resize only if needed
        // Find out how much the font can shrink in width.
        double widthRatio = (double)componentWidth / (double)stringWidth;

        int newFontSize = (int)Math.floor(originalFont.getSize() * widthRatio); // Keep the minimum size

        // Set the label's font size to the newly determined size.
        label.setFont(new Font(originalFont.getName(), originalFont.getStyle(), newFontSize));
    } else
        label.setFont(originalFont); // Text fits, do not change font size

    label.setText(text);
}