5

まず、gnome を使用することはできません (ただし、そのライブラリをインストールすることは可能です)。

現在インストールされている KDE の KDE ルック アンド フィールを使用して Java Swing デスクトップ アプリケーションを表示するには、何が必要かを知る必要があります。理想的には、ソリューションによって、基盤となるウィンドウ システムのようなルック アンド フィールを適用できるようにする必要があります (つまり、Windows 用の Windows LNF、Gnome (GTK) 用の GTK LNF、KDE ​​(QT) 用の QT LNF、他のプラットフォーム用のデフォルトのもの)。 )。

KDE では、GTK アプリケーションにも現在の KDE テーマを使用するように構成できます。そのため、ソリューションが GTK で動作する場合は問題ありません。

Gnome (Ubuntu 8.04) で次のコードを実行すると、Java アプリケーションが美しく見えます。他のアプリケーションと非常によく統合されます。

try {
  // Set System L&F
  UIManager.setLookAndFeel(
  UIManager.getSystemLookAndFeelClassName());
} catch(Exception e) { //Handle it }

ただし、KDE ​​を使用して Debian (Lenny) で同じことを実行すると、UIManager.getSystemLookAndFeelClassName() 呼び出しは Java のデフォルトのものを返します。GTK LNF の使用を強制すると、アプリケーションは機能しません。一部のフィールドは非表示になり、他のフィールドは場違いになり、すべてが使用できなくなります。

try {
  //Force the GTK LNF on top of KDE, but **it doesn't work**
  UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
} catch (Exception e) { /*Handle it*/ }

また、次のコードを配置しようとしました。ユーザーは利用可能な LNF のいずれかを選択し、それを設定しようとします。金属とモチーフはうまく機能します。GTK はそうではありません。スライダーは本当にめちゃくちゃです。リスト ボックスは見た目が悪く、消えますが、機能しているようです。ボタンとメニューは問題ないようです。関連するコードを次に示します。

(...)
    /** Creates new form SwingFrame */
    public SwingFrame() {

    initComponents();

    //Save all available lafs in a combobox
    cbLafs.removeAllItems();
    UIManager.LookAndFeelInfo[] lafs=UIManager.getInstalledLookAndFeels();

    for (int i=0,t=lafs.length;i<t;i++)
    {
        cbLafs.addItem(lafs[i]);
        System.out.println(lafs[i].getName());
    }

    }

public void changeLookAndFeel(String laf)
{
    //If not specified, get the default one
    if (laf==null) {
    laf=UIManager.getSystemLookAndFeelClassName();
    }

        try {
        // Set System L&F
        UIManager.setLookAndFeel(laf);
    }
    catch (Exception e) {
       // handle exception
        e.printStackTrace();
    }
    SwingUtilities.updateComponentTreeUI(this);

}

   private void cbLafsActionPerformed(java.awt.event.ActionEvent evt) {                                       
        // TODO add your handling code here:
        UIManager.LookAndFeelInfo laf=(UIManager.LookAndFeelInfo)cbLafs.getSelectedItem();
        if (laf==null)
            changeLookAndFeel(null);
        else
            changeLookAndFeel(laf.getClassName());
    }                                     

この同じシステムでは、すべての GTK アプリケーション (例: Firefox) が期待どおりに動作しています。そう:

1) KDE の下で Java GTK LNF アプリケーションを動作させる環境に欠けているものは何ですか?

2) デフォルトのシステムテーマとして GTK を返すために、JVM は何をチェックしますか?

ルイス・フェルナンドを助けてくれてありがとう

PS->JGoodies、プレーンAWT、SWTなど、他のソリューションも試しました。ただし、GTK LNF を使用した Swing は、SWT ネイティブ ライブラリと JGoodies の追加の jar の煩わしさを回避するための最良のソリューションです (また、JGoodies LNF は、Gnome での Swing GTK ほど統合されていないように見えます)。AWT はおぞましく (モチーフのように) 見え、多くの機能が欠けています。

4

4 に答える 4

2

コマンドラインからルックアンドフィールを設定できます。

java -Dswing.defaultlaf = com.sun.java.swing.plaf.gtk.GTKLookAndFeel MyApp

また、SwingSet2.jnlpは、変更可能なすべてのさまざまなもののサンプルデモを提供します。ソースと他の情報はここで見つけることができます:リンクテキスト

于 2008-10-18T13:04:04.323 に答える
1

ドキュメントの引用:

  1. システム プロパティswing.defaultlafが null でない場合は、その値をデフォルトのルック アンド フィール クラス名として使用します。

  2. プロパティ ファイルswing.propertiesが存在し、 key が含まれている場合swing.defaultlafは、その値をデフォルトのルック アンド フィール クラス名として使用します。チェックされる場所swing.propertiesは、Java プラットフォームの実装によって異なる場合があります。Sun の実装では、場所は次のとおりです。${java.home}/lib/swing.properties

詳細については、使用されている実装のリリース ノートを参照してください。

しかし、私はあなたの問題がこれであると99%確信しています(ドキュメントを再度引用します):

ルック アンド フィールを変更したら、updateUI必ず on allを呼び出しますJComponents。このメソッドSwingUtilities.updateComponentTreeUI(java.awt.Component)を使用すると、updateUI を格納階層に簡単に適用できます。詳しくはそちらをご参照ください。ルック アンド フィールを変更した後に updateUI を呼び出さない場合の正確な動作は規定されていません。予期しない例外、描画の問題、またはさらに悪いことが発生する可能性が非常に高くなります。

updateUIallで呼び出したくない場合は、他のすべての swing コードのJComponentsに呼び出すようにしてください。UIManager.setLookAndFeel

于 2008-10-17T19:30:25.137 に答える
0

多分これはうまくいきます:

try {
// sure look and feel
UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
// not-so-sure look and feel
System.setProperty("os.name", "Windows");
System.setProperty("os.version", "5.1");
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} 
catch (Exception ex) {
ex.printStackTrace();
}
于 2008-10-17T03:29:29.900 に答える
-1

GTK Laf は、IMHO の壊れた期間です。一部のランダム設定は考慮されません。ほとんどのコンポーネントで setBackground()、setForeground()、または setFont()を尊重することは想定されていないと思います。

Java > 1.4.2 を使用している場合は、MetalLookAndFeel [UIManager.getCrossPlatformLookAndFeelClassName()] を使用することをお勧めします。>1.6.0_u10 を使用している場合は、NautilusLookAndFeel を試すことができます。個人的にはMetalの方が見栄えが良いと思います。

于 2009-05-09T01:23:07.153 に答える