Javaプログラムを「ネイティブに表示」するのが難しいのはなぜですか?


98

ほとんどのJavaアプリケーションは、C / C ++アプリケーションと同じようには見えません。Swingは、見た目が明確になるように意図的に設計されたかもしれませんが、私が読んだ内容に基づいて、たとえばSWTは「ネイティブに見える」ことを試みましたが、完全に成功しません。

私の質問は:

Java言語の開発者がネイティブGUIの外観を正確にコピーするGUIシステムを設計するのが難しいのはなぜですか?ネイティブGUIの違いは何ですか?「ネイティブ」ボタンのように見えるボタンを設計するだけの問題ではありませんか?それともそれよりも深くなりますか?


31
スイングはネイティブを模倣しようとする独自のGUIコンポーネントを書き込むため、代わりに実際のネイティブコンポーネントへの結合を作成するのではなく、可搬性のアイデアに
フリークラチェット

5
私はこのトピックの専門家ではありませんが、GUIツールキットベンダーがすべての厄介な詳細を正しくするためにどれだけの労力を費やすかは問題だと思います。例えば、参照、C ++ framwork「Qtの」と、このSO質問:stackoverflow.com/questions/7298441/...
ドク・ブラウン

4
世話をする多くの詳細があります。たとえば、ファイルを開くダイアログで自動補完が機能する方法は、ネイティブのJavaアプリケーションが故障した1つのポイントです。
CodesInChaos 14

4
Swingには、デフォルトの代わりにプラグインできる「ネイティブな外観」のルックアンドフィールがあります。また、Javaは最初に利用可能なネイティブのものをAWTで使用しようとしましたが、プラットフォーム間の固有の違いのために、うまく機能しませんでした。Javaアプリがどこでもまったく同じように機能するように、Swingを作成したのはそのためです。
マルツェルム14

5
JavaFXを見落とさないでください。これはSWINGの代替品であり、Java 8以降はデフォルトでJDK / JREにあります。SWINGやAWTよりもはるかに現代的で、ほぼすべてのプラットフォームでよりネイティブに見えます(それぞれのネイティブUIツールキットに多くのフックをかけます)プラットフォーム)。そうは言っても、他の人が述べたように、Javaのような「万能」言語から正確にネイティブな外観のアプリケーションを取得するには、いくつかの作業を行う必要があります。JavaのUIは、そのままで「すべてのプラットフォームに最適」になることを目的としていました。
SnakeDoc 14

回答:


56

「ネイティブ」ボタンのように見えるボタンを設計するだけの問題ではありませんか?

まあ-ちょっと、ボタン用。しかし、これは想像以上に難しいかもしれません。最近では、GUIコンポーネントを表すために使用されるグラフィックは、ストレッチされたランダムなビットマップほど単純ではありません(これらはまったくうまくスケーリングされないため)-多くの場合、多くのコーナーケースがプログラムされたベクターベースのグラフィックです(そのため、ボタンが画面の端に達すると、たとえばわずかに異なって見える場合があります。)そしてもちろん、ボタンをクリックしたときに異なるグラフィックが必要になります。著作権上の理由で、開発者はこれらの既存のグラフィックスをそのまま使用することはできないことが多いので、再作成する必要があります-そして、ほとんどの部分で良い仕事をしている間、必然的にそこにある膨大なグラフィックコンポーネントを考えると見逃されることがあります。

もちろん、上記のすべてはSwingに基づいていますが、これはもちろん軽量で非ネイティブのGUIツールキットです。SWTはネイティブではないので、具体的にはSWTがネイティブに見えないと言いますが、これは少し奇妙です。これは、下にあるJNIを使​​用してネイティブコンポーネントを呼び出すツールキットです。そのため、何かが正しく表示されない場合は、ルックアンドフィールのせいではありません。


1
ありがとう。「軽量」とはどういう意味ですか?そして、「ネイティブ」とは実際にはどういう意味ですか?コンピューターのOSのリソースを使用したり、コンピューターと直接やり取りしたりすることを意味すると思います。これは本当ですか?
user3150201 14

1
@ user3150201もちろん、基になるOSにはネイティブに配置できるボタンとウィジェットが一定量ありますが、明らかにこれらのボタンはOSとプラットフォーム間で異なります-これらは重いネイティブコンポーネントです。軽量コンポーネントは、OSによって指示されたコンポーネントではなく、Javaによって描画され(この場合)、GUIコンポーネントのように見え、動作します。プラットフォームの外観は、必要に応じて無料で入手することはできません。)
berry120 14

14
ボタンの配置、正確なサイズ、および推奨されるGUIスタイルはプラットフォームによって異なり、Javaにそれらを模倣させるには手間がかかります。Swingはネイティブボタンを提供できますが、10ピクセルの高さであれば、ユーザーはまだ何かがオフになっていると思うでしょう。Appleにはヒューマンインターフェイスガイドラインがあり、Microsoftには正しいネイティブルックを得るのに役立つユーザーインターフェイスガイドラインがあります。プラットフォーム間でUIを多少変更する必要があります。
マイケルショップシン14

4
JavaFXは、SWINGやAWTよりもはるかに「ネイティブ」に見えます。ネイティブの透明なウィンドウなどがあります。すぐに使用できるようになりました。
SnakeDoc 14

2
@SnakeDoc確かにもっとモダンに見えますが、「ネイティブ」とは言いません。プラットフォームの基盤となるGUIコンポーネントを使用せず、すべてCSSでスキン化されています。
berry120 14

71

一部のシステムでは「ネイティブ」と見なすことができるツールキットが文字通り半ダースあります。これらのいくつかはかなりユニークな概念または機能を備えており、クロスプラットフォームツールキットでそれらを複製するのは退屈です。アプリケーションのルックアンドフィールは、「スキン」によって決まるだけでなく、レイアウトとその動作によっても決まります。考慮事項:

  • ダイアログでは、「OK」ボタンはどちら側に属しますか(左側または右側)。さて、システムごとに個別のダイアログを作成しましょう。
  • 画面上のデフォルトのボタンをどのようにマークしますか?ボタンを拡大する色合い、太字フォント?結構です、それをスタイルシートに入れましょう。
  • Windowsでは、「リボン」の概念はかなりネイティブです。これは、リボンが一般的ではないMacにどのように変換されますか?結構、ピクセルの正確なレイアウトを忘れて、システムごとに異なるツールバー実装を提供しましょう。
  • メニューバーはウィンドウの一部ですか(Windows、オプションでKDE)、または画面の上部にありますか(Mac、Unity)?十分正確に、ピクセルごとの正確なレイアウトは既に捨てているため、システムごとに異なる実装を作成しましょう。
  • フォントはどのようにレンダリングされますか?可能な限り鮮明、または滑らかでアンチエイリアス処理されていますか?そして、どのフォントを使用する必要がありますか?フォントごとにメトリックが異なるため、同じ幅にレンダリングされた同じ段落には、フォントに応じて行数が異なる場合があることに注意してください。
  • ウィンドウの背景は単色、画像、またはグラデーションですか?それもスタイルシートに入れましょう。
  • スクロールバーはどのように見えますか?ボタンはどこにありますか(ある場合)。それらはどのくらいの幅ですか、またはポインターが特定の領域に移動したときにのみ表示されますか?
  • 他の配色をどのように組み込むのですか?
  • ドラッグ可能なものは何ですか?コンテキストメニューはどこにありますか?

これらの問題は、アプリケーションの動作や一般的なレイアウトに触れる場合、単純なスタイルシートでは解決できません。唯一の実際のソリューションは、各システムのアプリケーションを書き直すことです(したがって、Javaのクロスプラットフォームの利点を無視します)。唯一の現実的な解決策は、ピクセルの正確なレイアウトを忘れ、システム固有のツールキットを抽象化する共通のインターフェースに書き込むことです。Swingがとる解決策は、さまざまなシステムをエミュレートすることです。

そして、クロスプラットフォームの一貫性があります。これは、アプリがすべてのシステムでまったく同じに見えるという考え方です(多くの場合、ゲームで選択され、没入感が増します)。デスクトップアプリケーションでは、これは単に迷惑であり、ユーザーの期待を覆します。


1
+1。追加したいことは1つだけです。コンテキストメニューを開く方法などの「単純な」詳細から始めて、システムがユーザーに構成を許可するものについてはどうでしょうか。(そして、私はWindowsプログラムにリボンやMacアプリを持たないことを望んでいます。はい。OSごとに良いGUIを設計する必要があります。)
クリストファー・クロイツ14

@ChristopherCreutzigそれが私の経験の由来です。メインデスクトップでは、Linux上のKDE(どちらも非常に構成可能)を使用し、QtCurveを使用してアプリケーションの外観を調整します。これらの特別なスタイルは、主要なKDEアプリケーションでうまく機能します。よく書かれたGTKアプリは互換性レイヤーを利用できますが、背景のグラデーションがなく、メニューバーがウィンドウ内にとどまります。しかし、プログラムはシステムスタイル(スクロールバーなど)からウィジェットを取得するため、すぐに劣化し始めます。 、しかし、他のものを無視します(フォントレンダリングやメニューの周りの影など)
amon 14

+1この回答にはいくつかの長所がありますが、いくつかの短所もあります。「このウィンドウマネージャがXをどのように描画するか」問題は、ネイティブAPIを使用して処理されます。たとえば、OS X上のX11は、ネイティブOS Xウィンドウ、ボタン、スクロールバー、ダイアログなどを描画できます。したがって、これらの問題の多くはなくなります。本当の答えは@TheSpooniestは以下の言ったことです:UXはそんなに多くちょうどウィジェットを描画するよりも。間隔、タイミング、アニメーション、マウスアクセラレーション、タッチ入力...クロスプラットフォームツールキットで再現するには非常に費用のかかる微妙な詳細の世界があります。
マークE.ハーセ

13

はい、より深くなります。

このボタンのみを作成する場合、WindowsまたはOS Xボタンのように見えるボタンを作成するのは簡単です。しかし、ボタンは元のボタンと同じように「振る舞う」必要があり、簡単ではないかもしれません。あるバージョンではより多くのスペースがあり、別のバージョンではない場合があります。

これは、GUI全体を使用している場合は大げさです。OSXプログラムは、Windowsプログラムとは異なるコンテンツを表示します。これは1つのGUIでキャプチャすることはほとんど不可能です。2つのGUIが必要になりますが、それほど多くのアプリケーションはそれほど騒ぎません。代わりに、彼らは「ほとんどのシステムで大丈夫に見える」ことを目指しています-これはまだいくらか異質に見えますが、使いやすく、開発がずっと簡単です。


9

OSXボタン、Windowsボタン、または他のツールキットのボタンのように見えるボタンを作成するのは難しくありません。ただし、ほとんどの環境のUIガイドラインは、「これがボタンの外観です」という基本ほど単純ではありません。UI要素間の間隔から、特定の既知のアクションがリストに表示される順序、メニューシステムの[設定/オプション]ダイアログの正確な位置まで、多くの微妙な違いがあります。非常にシンプルなユーザーインターフェイスの最も一般的なケースを自動化できますが、ほとんどのUIタスクではないにしても、多くの場合、より細かいタッチが必要です。

SWTはこれをある程度自動化しようとしましたが、単純なUIタスクに適しています。しかし、万能ソリューションはありません。そのため、UIがより複雑になると、使用する基本的な方法が崩れ始めます。一般に、骨の折れる手作業によるUI作業に戻すことは可能ですが、これはほとんどのプログラマーがすべてのプラットフォームで実行できる、または実行しようとするものではありません。

これに対するSwingのアプローチは、可能な限りネイティブツールキットを避けることでした。それはネイティブではなく、そうしようとはしていません。代わりに、どこで実行されても(ほとんど)同じように見えるものを作成しようとします。みんなを喜ばせる(無駄に)のではなく、自分自身を喜ばせようとしましたが、それが成功するまでは成功しましたが、その結果がユーザーコミュニティ全体にどれほど効果的であるかを疑問視できます。


7

アプリケーションがすべてのシステムでできる限り自然に見えることと、アプリケーションが各システムで同じように動作することを期待することとの間にはトレードオフがあります。「正しい」選択はありません。

さらに、「自然な」側面を選択した場合でも、グラフィックツールキットのユーザーを、アプリケーションの予期せぬ破損を引き起こす可能性のあるネイティブコンポーネントおよびAPIの「改善」から保護することができます。

これが、一部のGUIツールキット開発者が、ネイティブコンポーネントを模倣する独自のコンポーネントを提供することを好みますが、独自の実装を提供するためです。一方、機能的に完全なGUIツールキットを開発することは多大な労力であり、経済的な考慮事項がいくつかの端を切ることにつながる可能性があります。

この問題はJava固有のものではありませんが、プラットフォームに依存しないツールキットを作成するすべての企業が直面していることに注意してください。


静かにダウン投票するのではなく、答えに対して間違っていると感じることを説明することで、コミュニティに対してより良いサービスを提供します。それだけで個人的な問題...でない限り
ニコラMusatti

4

それはすべて歴史によるものです。

Sunは、すべてのJavaソフトウェアがすべてのマシンで同じように動作することを望んでいました。

ソフトウェアが「ネイティブに表示される」ためには、特定のOS上で他のソフトウェアと同じように動作する必要があります。

Sunは、OSとの統合によりソフトウェアが各OSで異なる動作をするため、OSと統合されたJavaソフトウェアの作成を困難にするために、あらゆる力を尽くしました。

最近では、Webサーバーベースのソフトウェア以外を気にするJavaプログラマーはほとんどいません。

Sunは、Microsoft Javaベースのシステムを使用したすべてのプログラマーを駆り立てて、デスクトップ上のJavaを殺しました。そのため、初期にJavaを選択したプログラマーは見苦しくなりました。

「ネイティブに見える」ことを重視するデスクトップソフトウェアを作成する人は、Javaを使用しないことをずっと前に学んでおり、Oracleソフトウェアを使用するたびにビューが強化されています。

そのため、最近では、Javaプログラマーからデスクトップソフトウェアに「ネイティブに表示」する必要はありません。


5
「SunはOSに統合されたJavaソフトウェアの作成を困難にするために、あらゆる力を尽くしました」と間違っています。彼らはそれを簡単にするために大きな努力をしません。「Sunは、Microsoft Javaベースのシステムを使用するすべてのプログラマーを軸にすることでデスクトップ上のJavaを殺しました」という間違った、MicrosoftとSunの相互敵意により、MicrosoftはSunの要件と互換性のないバージョンのAWTライブラリを作成し、悪名高いSun / MSの訴訟。
jwenting

1
@ jwenting、Sunは、MicrosoftのJavaベースのシステムを使用することを選択したプログラマーよりも、Microsoftに問題を起こすことを重視しました。したがって、はJaveをあきらめ、C#が出るまでMFCを使い続けました。
イアン14

3
Sunの人もいるかもしれませんが、その感情は相互のものでした。単一のプラットフォーム専用に開発している場合、そのプラットフォームのネイティブツールが常に推奨されるオプションであり、これは企業の政治とは何の関係もありません。「私はSunが嫌い」または「Microsoftが嫌い」に基づいてツールを選択した場合、それはあなたの職業的態度にほとんど反映されていません。私はほとんどJavaを使用しましたが、それに加えて、Delphi、C#、Ruby、C ++、C、Progressなど、手元の仕事に最適なものも使用しました。そして、多くの場合、それはハイブリッドソリューションになります。
jwenting

3

nativeSWTなどのツールキットは、そのOSのUIに対して公開されている標準に従っているのに対し、実際には独自の処理を行うネイティブアプリです。問題は、これらの標準に準拠したアプリを誰も作成しないため、Javaアプリを起動するときです。ネイティブではないようです。例として、Microsoftのプロジェクト(Office、Outlookなど)のほとんどすべては、Windows標準コントロールを使用して視覚的に再現することはできません。

MicrosoftとAppleの両方がOSプラットフォームに動的UI機能を追加すると、さらに悪化します。WebデザインがWebサイトのスタイルを作成するのとほぼ同じ方法で、開発者がアプリのスキン/スタイルを設定できるようにします。

Androidプラットフォーム上のJavaは、このパスをたどっています。スキナブルスタイルを使用してXMLで定義されたAndroidのUI要素を作成します。

Javaは、デスクトッププラットフォームとして非常に人気があったことはありません。その結果、これらの業界の変化はデスクトップランタイムにまで伝播していません。問題を修正するために時間を費やすことをいとわない開発者が不足しています。


1
+ 1、Windows 95時代には、Windowsコントロールの「標準的な」外観がありました。さて、それほどではありません。
GrandmasterB 14

ええ、デスクトップをプログラミングしてから数年が経ちましたが、MSが生産するソフトウェアに不可欠になったにもかかわらず、.NETにリボンスタイルのコントロールが付属していなかったことに驚きました。
リグ14

@Rig NET 4.0以降、.NETには適切なネイティブリボンコントロールがあります。ここに良い記事があります:c-sharpcorner.com/UploadFile/0b73e1/ribbon-control-in-wpf-4-5
クリスチャン・ザウアー

1
@Rig .NET 4ではなく.NET 4.5が必要です。VisualStudio 2010は最大4つしかターゲットにできません。4.5をターゲットにするにはVS2012以降が必要です。私はVS2013で4.5をターゲットとする場合それを見ることができますが、私は4にターゲットバージョンを変更しないとき
ボブ

1
@Rig Net 4.0でリボンを使用できます。Microsoftからリボンをダウンロードすると、10rem.net / blog / 2010/10/22 / wpf-ribbon-october-release(これがわからないは最新バージョンです)。Nugetからダウンロードする方が良いでしょう。Windows XPで実行しなければならないプログラムでそれをしなければなりませんでした-正常に動作し、Net 4.5バリアントとほとんど互換性があります。
クリスチャンザウアー14

-1

どのオペレーティングシステムを「ネイティブ」に見せたいですか?

あなたはそれらのすべてに100%の時間をネイティブにすることはできません

SWTなどは、何らかの妥協が必要な場合に、それらすべてにネイティブに見えるようにするためのベストエフォートアプローチです。

そして実際、この妥協点はますます到達しにくくなっています。オペレーティングシステムのせいではなく、入力デバイスのせいです。タッチスクリーンの場合、実際にはマウスの右ボタンがないため、デザインを変える必要があります。したがって、それ以外の場合は同じ機能に対応する必要があります。

そこなし、guesturesに、マウスの右ボタンから「直感的」な機能を動かす魔法のボタンになることはありませんあなたは(その時点で、あなたはあなたが考えられているすべてのプラットフォームに固有のすべての単一の入力デバイスごとに詳細な態様をspecifiyingが、それにもかかわらず、非-あなたが考慮していないものにネイティブ)。


-2

本当に良い質問です。過去数年間、私はいつも自分でそれについて疑問に思っていました。この背後には正当な理由があると思っていましたが、実際はそうではありません。

答えはかなり単純で、多くの答えが実際に問題を掘り下げているわけではないと思います。

あなたの言語が画面上にピクセルを描画することを許可している場合、それに基づいてWindowsフォームコントロールのルックアンドフィールを正確に模倣するGUIフレームワークを100%作成することができます。

Javaはクロスプラットフォームであるため、実際の実行システムタイプ(Mac / Windows)に基づいて、UIが両方のプラットフォームで異なるように選択され、ランタイムプラットフォームスタイルに一致することを確認できます。

たとえば、XAMLでわかるように、UIは非常に構造化された形式と言語で簡単に表示できます。時間がかかる場合は、「ネイティブ」動作を選択することもできます。

したがって、Java開発者がMacおよびWindowsでネイティブに見えるアプリケーションを取得できるようにするGUIフレームワークを作成することが可能です。

そこで、Swingに行きます。これは、Java用に作成できるGUIフレームワークの無限の可能性のうち、たった1つのGUIフレームワークです。それはプログラムされた方法で動作しますが、上記のプロセスに従わず、両方のシステムで奇妙に見えるアプリを取得します。これがSwing開発者の選択であり、誰も彼らにこれを強制し、そのように振る舞わせたわけではありません。


2
この質問に答えていない、アスカーは、すでにこの点をカバー:「Swingは独特の外観持つように意図的に設計されている可能性があります」
ブヨ

同意しませんが、マイナス(?)にコメントしていただきありがとう
ござい
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.