0

現在、カスタム シンセ lnf に取り組んでいますが、ルート ペインの defaultButton を正しく表示できません。

すべてのボタンは、次の定義で正しく描画されます。

<style id="Button">
    <property key="Button.defaultButtonFollowsFocus" type="boolean" value="true"/>
    <property key="Button.textShiftOffset" type="integer" value="1"/>
    <property key="Button.margin" type="insets" value="0 10 0 10"/>
    <insets top="4" left="4" bottom="4" right="4"/>

    <state>
        <imagePainter method="buttonBackground" path="images/Button.Normal.png" sourceInsets="4 4 4 4" paintCenter="true" stretch="true"/>
    </state>

    <state value="MOUSE_OVER">
        <imagePainter method="buttonBackground" path="images/Button.Normal.MouseOver.png" sourceInsets="4 4 4 4" paintCenter="true" stretch="true"/>
    </state>

    <state value="FOCUSED">
...
    </state>
...
</style>
<bind style="Button" type="region" key="Button"/>

しかし、1 つのボタンをルート ペインの defaultButton として設定すると、正しく描画されません。

例として、次のスクリーンショットを撮りました。左が通常のボタン、右がdefaultButtonです。左のものを defaultButton として設定すると、右のものは正しく描画され、同じ問題が発生します (たとえば、JFileChooseDialog を表示する場合、すべての defaultButton に同じ問題が存在します)。

左: 通常のボタン - 右: デフォルトのボタン

デフォルトのボタンのサイズを手動で設定すると正しく表示されるので、ボタンのサイズの計算に問題があると思います。

誰かが同様の問題を抱えていたり、defaultButton が通常のボタンとしてスレッド化されていない理由を教えてくれたりするかもしれません。

前もって感謝します。

編集: 簡単な実行可能なサンプル コードを追加しました。特別なレイアウトや特別なものはありません。デフォルトのボタンはペイントされていません。


DefaultButtonTest.java

public class DefaultButtonTest
{
    public static void main(String[] args) throws InterruptedException, NamingException
    {
        MyLookAndFeel.install();
        JFrame testFrame = new JFrame("test");
        JButton button1 = new JButton("button1");
        JButton button2 = new JButton("button2");
        JPanel testPanel = new JPanel(); // Applying for example FlowLayout makes no difference
        testPanel.add(button1);
        testPanel.add(button2);
        testFrame.setContentPane(testPanel);
        testFrame.getRootPane().setDefaultButton(button1);
        testFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        testFrame.revalidate();
        testFrame.pack();
        testFrame.setVisible(true);
    }
}    


MyLookAndFeel.java

public final class MyLookAndFeel extends SynthLookAndFeel
{
    public final void initialize()
    {
        super.initialize();
        JFrame.setDefaultLookAndFeelDecorated(true);
        JDialog.setDefaultLookAndFeelDecorated(true);
    }

    public final void uninitialize()
    {
        super.uninitialize();
    }

    public static boolean install()
    {
        try
        {
            final long start = System.currentTimeMillis();
            MyLookAndFeel laf = new MyLookAndFeel();
            laf.load(MyLookAndFeel.class.getResourceAsStream("laf.xml"), MyLookAndFeel.class);
            UIManager.setLookAndFeel(laf);
            return true;
        }
        catch (final Exception exception)
        {
            exception.printStackTrace();
            return false;
        }
    }

    public final boolean getSupportsWindowDecorations()
    {
        return true;
    }

    public final UIDefaults getDefaults()
    {
        UIDefaults defaults = super.getDefaults();
        defaults.put(SwingUtilities2.AA_TEXT_PROPERTY_KEY, SwingUtilities2.AATextInfo.getAATextInfo(true));
        defaults.addResourceBundle("com.sun.swing.internal.plaf.metal.resources.metal");
        return defaults;
    }
}


laf.xml

<synth>
    <!-- ****************************************************************************************************************************************
    CONTROLS
    ***************************************************************************************************************************************** -->
    <style id="Button">
    <property key="Button.defaultButtonFollowsFocus" type="boolean" value="true"/>
    <property key="Button.textShiftOffset" type="integer" value="1"/>
    <property key="Button.margin" type="insets" value="0 10 0 10"/>
    <insets top="4" left="4" bottom="4" right="4"/>

    <state>
        <imagePainter method="buttonBackground" path="images/Button.Normal.png" sourceInsets="4 4 4 4" paintCenter="true" stretch="true"/>
    </state>

    </style>
    <bind style="Button" type="region" key="Button"/>
</synth
4

2 に答える 2

1

私はついにこの問題の解決策を見つけました。それは単純です。

「MOUSE OVER」「FOCUSED」などの状態は、親からフォントと色の属性を継承しますが、フォントと色の属性を指定する必要はありません。ボタンまたはラジオ ボタンに 'DEFAULT' や 'SELECTED' などの状態が定義されている場合、それらは親から継承されず、フォントと色を明示的に定義する必要があります (サイズを手動で設定する場合、上記のように、少なくともサイズ計算のために)フォントと色は正しく表示されます)。

例えば

これは「DEFAULT」状態では機能しません

<style id="Button">
    <property key="Button.textShiftOffset" type="integer" value="1"/>

    <state>
        <imagePainter method="buttonBackground" path="images/Button.Normal.png" sourceInsets="4 4 4 4" paintCenter="true" stretch="true"/>
    </state>

</style>
<bind style="Button" type="region" key="Button"/>


これは「DEFAULT」状態で機能します

<style id="Button">
    <property key="Button.textShiftOffset" type="integer" value="1"/>

    <font name="Dialog" size="16"/>
    <color type="TEXT_FOREGROUND" value="#000000"/>

    <state>
        <imagePainter method="buttonBackground" path="images/Button.Normal.png" sourceInsets="4 4 4 4" paintCenter="true" stretch="true"/>
    </state>

</style>
<bind style="Button" type="region" key="Button"/>
于 2013-08-13T06:40:23.490 に答える