現在、カスタム シンセ 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