Java 如何自定义Swing组件(以标准化字体)?

Java 如何自定义Swing组件(以标准化字体)?,java,swing,user-interface,Java,Swing,User Interface,我想用标准字体大小制作JavaSwing组件,因此我通过从Swing组件类扩展子类,将这些组件定制为HAHA组件 但是,自定义的JTextfield不能是type和setText。自定义按钮不显示任何文本。我确信我没有编写其他代码来更改定制组件的属性 调试后,我发现如果我删除HAHATextField中的setFont语句,该文本字段对象可以键入并设置为setText。此外,如果我通过HAHATextField实例设置font,它会正常工作 为什么这不能正常工作?正确的方法是什么 代码如下 cl

我想用标准字体大小制作JavaSwing组件,因此我通过从Swing组件类扩展子类,将这些组件定制为HAHA组件

但是,自定义的JTextfield不能是type和setText。自定义按钮不显示任何文本。我确信我没有编写其他代码来更改定制组件的属性

调试后,我发现如果我删除HAHATextField中的setFont语句,该文本字段对象可以键入并设置为setText。此外,如果我通过HAHATextField实例设置font,它会正常工作

为什么这不能正常工作?正确的方法是什么

代码如下

class HAHAButton extends JButton
{
    HAHAButton(String haha)
    {
        super(haha);
        this.setFont(new Font("haha",Font.BOLD,fontsize));
    }
}

class HAHALabel extends JLabel
{
    HAHALabel(String haha)
    {
        super(haha);
        this.setFont(new Font("haha",Font.BOLD,fontsize));
    }
}

class HAHATextField extends JTextField
{
    HAHATextField(int haha)
    {
        super(haha);
        this.setFont(new Font("haha",Font.BOLD,fontsize));
        this.setText("haha");
    }
}

我不知道什么是哈哈字体。无论何时测试新内容,都要使用系统类和对象测试逻辑

我们也不知道fontsize是什么,或者它是否有值

所以你可以这样做:

//this.setFont(new Font("haha", Font.BOLD, fontsize));
setFont( getFont().deriveFont( 24.0f ) );
如果可行,您可以尝试其他字体系列:

setFont(new Font("monospaced", Font.BOLD, 16));
如果可以,请尝试自定义字体

这将有助于隔离问题发生的位置

正确的方法是什么

如果您想为所有组件更改此设置,那么有时您可以利用UIManager。在创建组件之前的课程开始时,您可以执行以下操作:

UIManager.put("TextField.font", new FontUIResource( yourFontHere ));
现在,这将是创建组件时使用的默认字体

同样,从一个简单测试的标准系统字体开始。然后试试哈哈字体

您还需要对其他组件执行此操作


查看更多信息。不要疯狂尝试更改这些默认值,因为不能保证每个LAF都会使用这些属性

使用标准字体大小的swing组件最好通过自定义的外观和感觉来处理它。@andreThompson thx对于抛光,我不知道如何使用段落.thx。看来我解决了这个问题。我忘了说类是内部类,fontsize是一个初始化的const int。但是现在我发现了一个新问题,似乎我无法通过语句HAHATextFieldobject.setFont getFont.deriveFont 24.0f设置Font;在创建框架之前。程序抛出NullPointerException。但是hahaatextfieldobject.setFontnew FontMonospace,Font.BOLD,16;作品为什么?我不知道你的代码的结构是什么样的。在设置Swing组件的字体之前,没有理由创建JFrame。但是,应在事件调度线程EDT上创建所有GUI组件。当你提出问题时,张贴一个适当的例子来说明问题,这样我们就可以看到你在做什么。