SSCCEを作りました。Windows の Look&Feel である必要があることに注意してください。
import java.awt.*;
import javax.swing.*;
public class DefaultButtonBug {
private static final String LAF_WINDOWS = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(LAF_WINDOWS);
} catch (Exception ex) {
System.out.println("Setting the L&F failed so I cannot reproduce the bug.");
System.exit(1);
}
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JPanel content = new JPanel();
JButton defaultButton = new JButton("Default");
content.add(defaultButton);
JFrame frame = new JFrame();
frame.getRootPane().setDefaultButton(defaultButton);
frame.setContentPane(content);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
});
}
}
- これを起動
- ボタンがフォーカスされている必要があります。そうでない場合は、クリックしてください。
- 他のウィンドウをクリックして、この現在のウィンドウがフォーカスを失うことを確認します
- このウィンドウにフォーカスがなくなった場合でも、ボタンは青みを帯びたアニメーションを続けます。
ボタンの「パルス」アニメーションは、標準の Java L&F には存在しないものです。
このボタンがデフォルト ボタンではなくなった場合 (コード内の適切な行を削除)、ウィンドウがフォーカスを失った後、ボタンは灰色になり、アニメーションはまったく表示されないことに注意してください。
あなたへの私の質問は次のとおりです。これはバグと見なされますか? これにより、ウィンドウが別のウィンドウの後ろに隠れている場合でも、EDT がアイドル状態になるのではなく、何かを実行し続けるためです (私はいくつかのプロファイリングを行いました)。ウィンドウを非表示にしても、EDT がアイドル状態になるわけではありません。