4

私は奇妙な問題を抱えています... 私は比較的新しい「熱狂的な」Java プログラマー (以前のキャリアでは Perl をハッキングして生計を立てていました) で、最初の半現実的なアプリケーションに取り組んでいます。「Main-Class」は、インスタンスMyAppを作成するクラスです。UserInputDialog

UserInputDialogは、私が作成したクラスでextendあり、 をJFrame実装ActionListenerKeyListener、 を使用し、 、、および Cancel/OK をFlowLayoutユーザーに提示します。が whereを生成するとき、または "OK"が を生成するとき、いくつかの入力検証を行い、 を呼び出し、次に を呼び出します。JLabelJTextFieldJButtonJTextFieldKeyEventkeyReleased() == KeyEvent.VK_ENTERJButtonActionEventUserInputDialogsetVisible(false)MyApp.doSomething( JTextFieldInstance.getText() )

それはすべて完璧に機能します。しかし、完了するまでにかなりの時間がかかる場合があるためMyApp、進行状況ウィンドウを に追加しようとしています。doSomething()

を拡張し、 を使用し、 in をトスするProgressWindowクラスを作成しました。と(ラップ) で。. テストデータからインスタンス化してフィードすると、完全に機能します。ループのテストをにコピーアンドペーストし、インスタンス化していない場合にも問題なく動作します(つまり、この動作を引き起こしている固有のものは何もありません。私が理解していない何らかの相互作用のようです。および)。JFrameBorderLayoutJProgressBarNORTHJScrollPaneJTextAreaCENTERProgressWindowProgressWindowTesterProgressWindowTesterMyAppMyAppUserInputDialogMyAppUserInputDialogProgressWindow

しかし、意図ProgressWindowしたとおりに使用しようとするMyAppと、つまりProgressWindowsetVisible(true) を使用すると、空白の Swing ウィンドウが表示されます (適切なサイズで、タイトル バーが適切に設定されています)。およびコンポーネントは表示さJProgressBarJScrollPane / JTextAreaません。ProgressWindowメソッドは適切に呼び出されていますMyApp(System.err.println()メッセージは適切な相互作用を示しています) ProgressWindow

コード スニペットを投稿することはできますが、ちょっと複雑で、おそらく明らかな何かが欠けているだけです...

UI とビジネス ロジックを一般的に分離するという概念には精通していますが (たとえば、 Perl アプリケーションを構築するときにHTML::TemplateandClass::DBIとを使用しCGI::Applicationました)、Java で「正しく行っている」かどうかはわかりません...

前もって感謝します!

ああ、コードを試した 2 つの環境でまったく同じ動作が得られます。Fedora 15 Linux ディストリビューション、カーネル 2.6.31.10-3、LXDE デスクトップ環境の javac 1.7.0_02[1]。

[1] oracle.com から直接ダウンロード。私; OpenJDK (JDK 7 が OpenJDK に基づいていることは知っています) や gcj などは使用していません。

4

1 に答える 1

5

Swing イベント スレッドまたは EDT で実行時間の長いプロセスを実行しようとすると、Swing の問題で同時実行性が発生します。このスレッドはすべてのコンポーネントの描画とユーザー入力の処理を担当するため、実行時間の長いプロセスによって拘束されている場合、GUI はプロセスが完了するまで効果的に凍結されます。重要なのは、SwingWorker が長時間実行するプロセスに提供するようなバックグラウンド スレッドを使用して、イベント スレッドがロックされないようにすることです。詳細については、Swing での同時実行を確認してください。また、バックグラウンド スレッドで進行状況バーを使用する方法に関するその他の洞察については、 JProgressBar チュートリアルもご覧ください。

また、JDialog などのダイアログがはるかに適している場合は、JFrame を使用したくないでしょう。また、Swing での KeyListeners の使用を避ける必要があります。ActionListener のデフォルトの動作はキーの押下に応答するため、 JTextField に単純に ActionListener を追加する方がはるかに優れています。

そして、StackOverflow.com へようこそ!

于 2012-02-03T22:29:29.877 に答える