UIManager.getSystemLookAndFeelClassName() を呼び出しています。現在のテーマを WindowsClassicLookAndFeel に設定している場合でも、結果として WindowsLookAndFeel を取得します。しかし、私は WindowsClassicLookAndFeel を期待しています。質問は、Windows クラシック テーマが現在アクティブになっていることを検出する方法です。
3 に答える
あなたはこの質問をするために特別にサインアップしたようです。そして今、私はそれに答えるために特別にサインアップしています! 私はまったく別のことをグーグルで調べていましたが、興味をそそられて実験を行ったところ、次のことがわかりました。
あなたは正しいですWindowsClassicLookAndFeel
。このクラスは拡張WindowsLookAndFeel
されますが、何もオーバーライドされず、Windows クラシックがアクティブな場合でもまったく使用されていないようです。そこで、 のコードを調べたWindowsLookAndFeel
ところ、package-private クラスを参照する興味深い内部コードが見つかりましたXPStyle
。このクラスはシングルトンのように見え、ゲッター メソッド はgetXP()
、「XP」テーマがアクティブな場合にのみインスタンスを返します。
/**
* Get the singleton instance of this class
*
* @return the singleton instance of this class or null if XP styles
* are not active or if this is not Windows XP
*/
static synchronized XPStyle getXP() {
if (themeActive == null) {
Toolkit toolkit = Toolkit.getDefaultToolkit();
themeActive =
(Boolean)toolkit.getDesktopProperty("win.xpstyle.themeActive");
if (themeActive == null) {
themeActive = Boolean.FALSE;
}
if (themeActive.booleanValue()) {
GetPropertyAction propertyAction =
new GetPropertyAction("swing.noxp");
if (AccessController.doPrivileged(propertyAction) == null &&
ThemeReader.isThemed() &&
!(UIManager.getLookAndFeel()
instanceof WindowsClassicLookAndFeel)) {
xp = new XPStyle();
}
}
}
return xp;
}
興味深いことに、コードはWindowsClassicLookAndFeel
再び をチェックしますが、これはもう使用されていない (おそらく変更されている) ことがわかっています... しかし、最良の部分はデスクトップ プロパティのチェックです。win.xpstyle.themeActive
これをコードから抽出して、次のテストを行いました。
package test;
import java.awt.Toolkit;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.UIManager;
public class WindowsClassicThemeDetector {
public static boolean isWindowsLAF() {
return UIManager.getLookAndFeel().getID().equals("Windows");
}
public static boolean isWindowsClassicLAF() {
return isWindowsLAF()
&& !(Boolean) Toolkit.getDefaultToolkit().getDesktopProperty(
"win.xpstyle.themeActive");
}
public static void main(String... args) throws Exception {
// Apply the system look and feel (which will be Windows)
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
// Check the initial theme state on startup
System.out.println(UIManager.getLookAndFeel().getClass());
System.out.println("Windows classic is initially: " + isWindowsClassicLAF());
// Register a listener in case the theme changes during runtime.
Toolkit.getDefaultToolkit().addPropertyChangeListener("win.xpstyle.themeActive",
new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
System.out.println("Windows classic is now: " + isWindowsClassicLAF());
}
});
// Wait until user presses ENTER in the console and then exit.
System.in.read();
}
}
このクラスをプログラムにインポートしてisWindowsClassicLAF()
、Look&Feel を設定した後でいつでもメソッドを呼び出すことができます。また、実行時にテーマの変更をリッスンする方法の例も示しました。
これはXPで試行およびテストされています。ユーザーがある XP テーマから別のテーマに変更した場合、リスナーは起動しませんが、ユーザーがテーマからクラシックに変更した場合、またはその逆の場合は起動しました。
それが役立つことを願っています!
あなたが何を求めているのかよくわかりません。
SWING が現在使用しているテーマ/ルック アンド フィールを 知りたい場合は、 UIManager.getSystemLookAndFeelClassName()を試してください。
Windows が使用しているテーマを調べようとしている場合は、わかりません。おそらく、それを見つけるのはそれほど簡単ではありません。
編集:簡単なハック (JNA/JNA を使用して、使用されているテーマを Windows API に直接クエリすることを除く) は、新しい JFrame を作成し、それをある領域に配置し、その境界線の小さな部分をキャプチャして、それと比較することです。境界線のサンプル (事前に作成し、コードと一緒に出荷する必要があります。これにより、ちょうど取得したスクリーン キャプチャ ビットと出荷するすべての境界線イメージをプログラムで比較できるようになります)
UIManager.getLookAndFeel()
現在インストールされている LaF を返します。getSystemLookAndFeel()
現在のシステムのテーマとして見えるルック アンド フィールを返します。たとえば、Windows の WindowsLookAndFeel、Linux の GTKLookAndFeel、Solaris の MOtifLookAndFeel などです。