2

我想创建自己的外观和感觉,并派生了 MetalLookAndFeel。我已经设置了一个非常基本的配置,其中所有文件都在同一个目录中并且没有包声明:

MyLookAndFeel.java

import javax.swing.UIDefaults;
import javax.swing.plaf.basic.BasicLookAndFeel;
import javax.swing.plaf.metal.MetalLookAndFeel;


public class MyLookAndFeel extends MetalLookAndFeel {

    public MyLookAndFeel() {
        setCurrentTheme(new DefaultMetalTheme());
    }

    @Override
    protected void initClassDefaults(UIDefaults table) {
        super.initClassDefaults(table);

        table.put( "ButtonUI", "MyButtonUI");
    }

    @Override
    public String getName() {
        return "MyLookAndFeel";
    }

    @Override
    public String getID() {
        return "MyLookAndFeel";
    }

    @Override
    public String getDescription() {
        return "MyLookAndFeel";
    }

    @Override
    public boolean isNativeLookAndFeel() {
        return false;
    }

    @Override
    public boolean isSupportedLookAndFeel() {
         return true;
    }
} 

我们还有 MyButtonUI.java:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;

import javax.swing.AbstractButton;
import javax.swing.JComponent;
import javax.swing.plaf.metal.MetalButtonUI;


public class MyButtonUI extends MetalButtonUI {

    @Override
    public void paint(Graphics g, JComponent c) {

    }

    @Override
    protected void paintButtonPressed(Graphics g, AbstractButton b) {
        g.fillRect(0, 0, 40, 40);
    }

    @Override
    protected void paintText(Graphics g, AbstractButton b, Rectangle textRect,
            String text) {
    }
}

使用上面的代码,当我使用此构造函数运行类时,我希望会绘制一个奇怪的按钮(或者根本没有按钮,因为该paint方法是空的)TestUI JFrame,但是该按钮看起来很正常:

public TestUI() throws UnsupportedLookAndFeelException {
        UIManager.setLookAndFeel(new MyLookAndFeel());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(200,200);
        setLayout(new FlowLayout());
        add(new JButton("Press"));
        add(new JLabel("Text"));
        setVisible(true);
    }

我忘记了什么重要的事情吗?

4

2 回答 2

2
  • "MyButtonUI"应该是完整路径(与打包在 jar 中的图标相同)或有效的类名,例如UIManager.put("ButtonUI", MyButtonUI.class.getName());

  • override BasicButtonUI,与另一个 LaFs 的接口,可以为空,而不覆盖 all 的所有方法System LaFs,而不是MetalButtonUI,您的自定义MetalButtonUI对 LaF 非常敏感,易碎,在注册的情况下UIManager

  • 也许会帮助您解决 MetalButtonUI 的部分问题,也许没有理由将自定义 UI 注册到UIManager,确保最终决定取决于您

于 2013-05-25T09:01:31.713 回答
1

在您的 MyButtonUI 类中,您必须实现一个公共静态方法 createUI()。像这样:

public static ComponentUI createUI(JComponent c)
{
    return new MyButtonUI ();
}

或者为所有按钮返回一个共享实例。

于 2015-05-05T13:33:15.610 回答