Swing Pro の皆様、こんにちは。良い (といいのですが) 質問があります。
以下は、タスクの要件と考えられる解決策です。このようなハードコアな経験をした人に、これについていくつかの考えを共有してもらいたい.
これにはコーディングなどは必要ありません。sun.swing および/または javax.swing.plaf パッケージに存在するプライベートシンボルを操作する必要があるという事実に関して、どのアプローチがより信頼できるかについての一般的なアドバイスが必要です。
タスクは、JFileChooser の動作を変更/変更することです (実際にはほんの少しです)。
ユーザーがファイル名 JTextField で Enter キーを押し、フィールドにディレクトリへのパスが含まれている場合、そのディレクトリを「選択」せずにそのディレクトリに切り替えます。はい、ダイアログはディレクトリを受け入れるように構成されていますが、[開く] ボタンのクリックと、(場合によっては) ファイル リスト テーブルのダブルクリックのみを受け入れる必要があります。
ユーザーがファイル名テキスト フィールドで Enter キーを押して、1GB を超えるデータを含むディレクトリ/ファイルを選択できないようにします
以下に、一般的なソリューション オプションをいくつか示します。
を。JFileChooser が提供するプロパティベースの変更をリッスンします (AFAICS は事後にトリガーされ、ここで必要な程度の制御を提供しません)。
b. javax.swing.plaf.basic.BasicFileChooserUI をいじくり回し (リフレクションを介して、プライベート レベルのカプセル化を破る)、への参照を変更します。
private Action approveSelectionAction = new ApproveSelectionAction();
カスタム アクションが 1 と 2 の追加チェックを行うようにします。このアプローチは plaf パッケージとリンクし、この UI クラスの下のクラスでこのアクションが何らかの形でオーバーライドされた場合に失敗する可能性があります。
c. JFileChooser コンポーネント階層をトラバースし、JTextField (コンポーネント ツリーで 1 回だけ発生するようです) を見つけ、その JTextField にぶら下がっているすべてのアクション リスナーをカスタム チェックで装飾します。私のデバッグ セッションは、この JTextField が、sun.swing.FilePane にある JTextField の匿名サブクラスであることを示しています。このアプローチは OO に適しているように見えますが、一部の OS ではこのテキスト フィールドが存在しないか、階層内に他の JTextField も存在する可能性があります。
公共の JFileChooser API は、その動作を実現するのに十分ではないようです。他の 2 つのオプションは、ディープ マジックまたは非移植性 (長期的) のいずれか、あるいはその両方です。
では、問題は次のとおりです。どのアプローチを選択し、その理由は何ですか?