2015-11-16 11 views
5

Javaがルートとルート以外のユーザーに対して異なるルック・アンド・フィール・クラスを提案していることに気付きました。 LAFを一貫性のあるものにする方法を理解しようとしています。また、それも、ユーザ/ルート内矛盾だ:LinuxのJava - ルートとルート以外のルック・アンド・フィールのクラス

サンプルコード(laf.jarでコンパイルおよびパッケージ):の中

import javax.swing.UIManager; 

public class laf { 
    public static void main(java.lang.String[] args) { 
     try { 
      System.out.print(UIManager.getSystemLookAndFeelClassName()); 
     } catch (Exception e) { 
     } 
    } 
} 

シナリオ1ログユーザ/ルートがログイン方法に依存します正規ユーザとして(GUIモード)機械

サンプル出力(ユーザなど)

[[email protected] Downloads]$ java -classpath laf.jar laf 
com.sun.java.swing.plaf.gtk.GTKLookAndFeel 

サンプル出力

サンプル出力(ルートとしてルートとして(GUIモード)マシンにシナリオ2つのログ

[[email protected] Downloads]# java -classpath ./laf.jar laf 
javax.swing.plaf.metal.MetalLookAndFeel 

(スイッチsu経由ルートに) )

[[email protected] Downloads]# java -classpath ./laf.jar laf 
com.sun.java.swing.plaf.gtk.GTKLookAndFeel 

シナリオ(上記のシナリオ#1と同様、この場合には - 同じLAF)正規ユーザとしてSSHを介して機械に3つのログに

サンプル出力(ユーザなど)

[[email protected] Downloads]$ java -classpath laf.jar laf 
javax.swing.plaf.metal.MetalLookAndFeel 

[[email protected] Downloads]# java -classpath ./laf.jar laf 
javax.swing.plaf.metal.MetalLookAndFeel 

ソフトウェア版

サンプル出力(ルートへの移行)シオン:

[[email protected] Downloads]# java -version 
java version "1.7.0" 
Java(TM) SE Runtime Environment (build pxa6470sr9fp10-20150708_01(SR9 FP10)) 
IBM J9 VM (build 2.6, JRE 1.7.0 Linux amd64-64 Compressed References  20150701_255667 (JIT enabled, AOT enabled) 
J9VM - R26_Java726_SR9_20150701_0050_B255667 
JIT - tr.r11_20150626_95120.01 
GC - R26_Java726_SR9_20150701_0050_B255667_CMPRSS 
J9CL - 20150701_255667) 
JCL - 20150628_01 based on Oracle jdk7u85-b15 

[[email protected] Downloads]# cat /etc/redhat-release 
Red Hat Enterprise Linux Workstation release 6.7 (Santiago) 
+0

これは、ユーザーの環境の違いに起因する可能性があります。さまざまなシナリオで 'env'の結果を試してみるか、Javaで' System.getenv() 'の結果を使用してください。 – fge

+0

あなたの環境に 'GNOME_DESKTOP_SESSION_ID'という変数があるかどうか、さまざまな設定で確認できますか? – RealSkeptic

+0

1)ユーザーが "これは駄目だ"と言った2) "su - "の後にルートとして空白を出力 –

答えて

0

getSystemLookAndFeelClassNameの最初の行は次のとおりです。

public static String getSystemLookAndFeelClassName() { 
    String systemLAF = AccessController.doPrivileged(
         new GetPropertyAction("swing.systemlaf")); 

ですから、デフォルトとして

-Dswing.systemlaf=javax.swing.plaf.metal.MetalLookAndFeel

を設定するために、ユーザのJAVA_OPTSを使用することができます。

は、ユーザーの.rc - ファイルに以下を追加:

set JAVA_OPTS=-Dswing.systemlaf=javax.swing.plaf.metal.MetalLookAndFeel 
export JAVA_OPTS 

よろしく

+0

確かに、私はプロパティで試してみますが、それは箱の外で動作していないのに驚いています。 –

+1

ユーザレベル(bashrcまたはprofile)での変更はオプションではありませんでした。私たちはそれを制御せず、アプリケーションがシステムに影響を与えたくないからです。だから、私の解決策は、アプリケーションの起動スクリプトに "-Dswing.systemlaf = javax.swing.plaf.metal.MetalLookAndFeel"という部分を追加することです。 –

+1

メモをつける** com.sun.javax.swing.plaf.metal.CrossPlatformLookAndFeel **私は使用しているIBM JREで利用できません。したがって、クロスプラットフォームのソリューションではありません。前のコメントで言及したものを使用することをお勧めします。** javax.swing.plaf.metal.MetalLookAndFeel ** –

1

これは、環境変数のルートについて以下であり、さらにあります。

基本的には、UIManager.getSystemLookAndFeelClassName方法は次のように動作します。

  • swing.systemlafシステムプロパティを確認してください。これにより、ユーザーはシステムが選択したいものを無効にすることができます。 nullでない場合は使用されます。
  • オペレーティングシステムがWindowsの場合は、WindowsLookAndFeelを返します。
  • それ以外の場合は、sun.desktopプロパティをチェックします。 sun.desktopgnomeに設定されていて、GTKがネイティブで使用可能な場合は、GTKLookAndFeel
  • をチェックします。そうでない場合は、Mac OS XとSolarisをチェックし、これらのオペレーティングシステムに適切な値を返します。
  • 他のすべてのチェックに失敗した場合は、「クロスプラットフォーム」L & F(MetalLookAndFeel)が返されます。

Linux/Unixに関連する部分は、sun.desktopをチェックする部分です。このプロパティは、JVMの起動時に設定されます。環境変数GNOME_DESKTOP_SESSION_IDが存在し、その内容が無視されている場合はgnomeに設定され、それ以外の場合はnullに設定されます。私はこれを行うthis is the pertinent native source codeを信じています。

Linuxでは、その環境変数が設定されている場合(GTKが使用可能な場合)、L & FはGTKLookAndFeelに設定されます。そうでない場合は、MetalLookAndFeelに設定されます。

デスクトップマネージャを使用してGnomeベースのLinuxにログインすると、その環境にその変数が設定されます。しかし、suコマンドは、デフォルトで環境変数を伝播しません。したがって、必ずしもrootでなくても、どのユーザーにもsuを実行すると、GNOME_DESKTOP_SESSION_ID環境変数が失われ、JavaはデフォルトでMetalLookAndFeelになります。

suを使用してsu -pを使用したり、sudoを使用している場合は、sudo -Eを使用して環境を通過させることができます。

suおよびsudoのようなsshコマンドは、環境変数を伝播しません。これは、~/.ssh/environmentを使用して回避することもできます。

ただし、既に述べたように、-Dswing.systemlaf=...スイッチをjavaコマンドに渡すことで、特定のL & Fを簡単に強制することができます。

+0

GNOME_DESKTOP_SESSION_IDに意味のある内容はありません。私の選択は、LAFを-D –

+0

BTWで明示的に定義することでしたが、その問題はUbuntu OS 12.04.02でも確認されました。驚いたことに、Ubuntuでは、まったく同じ結果が得られます。ユーザーはecho echo $ GNOME_DESKTOP_SESSION_ID => "これは控除されました"、rootとブランクの出力、およびユーザーとルートと異なるLAFです。 –

+0

@BaratSahdzijeu意味のある*何も入れる必要はありません。 GTKのL&Fを選ぶだけです。そして確かに、UbuntuはGnomeベースのLinuxです。 – RealSkeptic

関連する問題