【问题标题】:How to optimize the class that extends JLabel with Singleton如何使用 Singleton 优化扩展 JLabel 的类
【发布时间】:2015-04-14 07:13:03
【问题描述】:

我有一个扩展 JLabel 的类。这是课程:

public class LabelFormat extends JLabel {
    public LabelFormat(String string){
        Font myFont=UtilitySwing.getLabelFont();
        this.setText(string);
        this.setFont(myFont);
    }
}

这是 UtilitySwing 类中的方法:

public static Font getLabelFont(){
    Toolkit t = Toolkit.getDefaultToolkit();
    Dimension screenSize = t.getScreenSize();

    double width = screenSize.getWidth();
    double height= screenSize.getHeight();
    Font myFont;
    if ((width == 1600.0) && (height == 900.0) || 
            (width == 1440.0) && (height == 900.0) || 
            (width == 1280) && (height== 800) || 
            ((width == 1280) && (height== 768)))
    {
        myFont = new Font("Century Gothic", Font.PLAIN, 14);
    }
    else if((width==1024) && (height ==600))
    {
        myFont = new Font("Century Gothic", Font.PLAIN, 12);
    }
    else if ((width == 1024) && (height== 768))
    {
        myFont = new Font("Century Gothic", Font.PLAIN, 12);
    }
    else if ((width == 800) && (height== 600))
    {
        myFont = new Font("Century Gothic", Font.PLAIN, 11);
    }
    else{
        myFont = new Font("Century Gothic", Font.PLAIN, 11);
    }   
    return myFont;
}

所以找到了那个类,但对我来说代码不是很有效,因为如果我创建 5 个标签,我有这个:

LabelFormat label1 = new LabelFormat("Pippo");
LabelFormat label2 = new LabelFormat("Pippo");
LabelFormat label3 = new LabelFormat("Pippo");
LabelFormat label4 = new LabelFormat("Pippo");
LabelFormat label5 = new LabelFormat("Pippo");

在这段代码中,我调用了 5 次类 UtilitySwing 来计算标签的字体。我想是否可以使用单例模式调用一次 UtilitySwing 来计算字体。

为此,也可以在主类中创建字体并将其设置为所有标签,但我想创建一个 jar 库,用户不必担心设置字体。

【问题讨论】:

  • 您可以在创建标签之前调用UtilitySwing.getLabelFont() 并设置每个标签的font 属性。现在,我要么考虑创建工厂方法,要么考虑创建循环......
  • 如果所有标签都是为了获得相同的字体,您可以使用类似UIManager.put("Label.font", UtilitySwing.getLabelFont()) 和所有JLabels 将自动继承字体...
  • 你为什么要这样做?您在该类中唯一的方法是静态的,因此在那里实现单例模式将是多余的。
  • 我知道,但我不想要这个。我希望用户创建 LabelFormat(一、二、三),而不是每次使用我构建的方法设置字体
  • 那你现在做的有什么问题?

标签: java swing singleton jlabel


【解决方案1】:

你可以...

在创建标签并设置字体属性之前调用UtilitySwing.getLabelFont()...

Font font = UtilitySwing.getLabelFont();
LabelFormat label1 = new LabelFormat("Pippo");
label1.setFont(font);
//...

但我会尝试放入工厂方法或循环以使这更容易......

Font font = UtilitySwing.getLabelFont();
LabelFormat label1 = createFormatLabel("Pippo", font);

你可以...

使用UIManager.put("Label.font", UtilitySwing.getLabelFont()); 设置所有JLabels 使用的字体,假设您希望更改是全局的

这会让您想到创建一个自定义外观和感觉委托,您可以更好地控制它并且只影响LabelFormat 实例

你可以...

缓存结果...

private static Map<Dimension, Font> mapFonts = new HashMap<>(25);

public static Font getLabelFont() {
    Toolkit t = Toolkit.getDefaultToolkit();
    Dimension screenSize = t.getScreenSize();

    Font font = mapFonts.get(screenSize);
    if (font == null) {

        double width = screenSize.getWidth();
        double height = screenSize.getHeight();
        if ((width == 1600.0) && (height == 900.0)
                        || (width == 1440.0) && (height == 900.0)
                        || (width == 1280) && (height == 800)
                        || ((width == 1280) && (height == 768))) {
            font = new Font("Century Gothic", Font.PLAIN, 14);
        } else if ((width == 1024) && (height == 600)) {
            font = new Font("Century Gothic", Font.PLAIN, 12);
        } else if ((width == 1024) && (height == 768)) {
            font = new Font("Century Gothic", Font.PLAIN, 12);
        } else if ((width == 800) && (height == 600)) {
            font = new Font("Century Gothic", Font.PLAIN, 11);
        } else {
            font = new Font("Century Gothic", Font.PLAIN, 11);
        }

        if (font != null) {
            mapFonts.put(screenSize, font);
        }
    }
    return font;
}

如果您认为默认屏幕尺寸可能会改变或...

private static Font font;

public static Font getLabelFont() {

    if (font == null) {

        Toolkit t = Toolkit.getDefaultToolkit();
        Dimension screenSize = t.getScreenSize();

        double width = screenSize.getWidth();
        double height = screenSize.getHeight();
        if ((width == 1600.0) && (height == 900.0)
                        || (width == 1440.0) && (height == 900.0)
                        || (width == 1280) && (height == 800)
                        || ((width == 1280) && (height == 768))) {
            font = new Font("Century Gothic", Font.PLAIN, 14);
        } else if ((width == 1024) && (height == 600)) {
            font = new Font("Century Gothic", Font.PLAIN, 12);
        } else if ((width == 1024) && (height == 768)) {
            font = new Font("Century Gothic", Font.PLAIN, 12);
        } else if ((width == 800) && (height == 600)) {
            font = new Font("Century Gothic", Font.PLAIN, 11);
        } else {
            font = new Font("Century Gothic", Font.PLAIN, 11);
        }           
    }
    return font;
}

如果您不在乎,只是想节省时间,并且不想多次重复决策过程...

【讨论】:

  • 我用过这个解决方案,对我来说是最好的:“使用 UIManager.put("Label.font", UtilitySwing.getLabelFont()); 设置所有 JLabels 使用的字体,假设您希望更改是全球性的”
  • 很高兴能帮上忙 ;)
猜你喜欢
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
相关资源
最近更新 更多