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());

  • overrideBasicButtonUIは、別の LaF へのインターフェースを持ち、空にすることができます。すべてのメソッドをオーバーライドせずにSystem LaFs、 の代わりにMetalButtonUI、あなたのカスタムMetalButtonUIは LaF に非常に敏感で壊れやすいです。UIManager

  • おそらくMetalButtonUIの部分的な回避策に役立つでしょう。カスタム UI を に登録する理由はないかもしれませんUIManager。最終的な決定はあなた次第です。

于 2013-05-25T09:01:31.713 に答える
1

クラス MyButtonUI では、public static メソッド createUI() を実装する必要があります。このような:

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

または、すべてのボタンに対して 1 つの共有インスタンスを返します。

于 2015-05-05T13:33:15.610 に答える