1

ユーザーが MIDI サウンドの再生中に UI を操作できるようにするために、MIDI ノートを再生できるシンプルな MIDI アプリケーションを開発しました。必要なロジックを次のような匿名サブクラスに配置しました。

public static void Play() 
{
        new Thread(new Runnable() 
        {
            public void run() 
            {
                if (!_sequencer.isRunning()) 
                {
                    try 
                    {
                        _sequencer.setSequence(_sequence);
                        _sequencer.start();
                    } 
                    catch (Exception e) 
                    {
                        Logger.Add(e.getMessage());
                    }
                }
            }
        }).start();
    }

たとえば、ComboBox をクリックすると、音楽が再生され始めますが、UI はまだ応答しません。

私が見ている動作を説明する、Java でスレッド化するための警告はありますか?

(役立つ場合は使用している Java API - javax.sound.midi )

御時間ありがとうございます。

編集:

UI をもう少しクリックしてみると、興味深いことがわかりました。左上隅にある 2 つの ComboBoxes を除いて、すべて正常に動作しているようです。それらを削除して置き換えてみましたが、違いはありません。クリックすると (通常どおり) ボックスが青に変わりますが、ドロップダウン ボックスはその下に表示されず、フォーカスが別の UI コンポーネントにある場合、色はデフォルトに戻りません。おそらく NetBeans によって導入されたバグでしょうか?

例:

ここに画像の説明を入力

編集2:

多くの試行錯誤の末、ようやく問題の原因を見つけました。スレッドはうまく機能します。問題は、NetBeans が何らかの方法で UI コンポーネントを再調整したため、ウィンドウが画面いっぱいになり、ComboBox のサイズを手動で変更してテストすると、実際に正常に動作することが示されました。

みんなのフィードバックに感謝します!

4

2 に答える 2

2

コンボ ボックスをクリックするとどうなりますか? と相互作用し_sequencerますか? さらに、シーケンサーは UI スレッドで作成されましたか? 別のスレッドで start メソッドを呼び出している間、シーケンサーは作成されたコンテキスト (つまり、UI スレッド) で引き続き実行されているのではないかと思います。

再生中のスレッド (つまり、UI スレッドではない) でシーケンサーを作成してみて、UI が解放されるかどうかを確認してください。

于 2011-04-17T03:10:06.000 に答える
0

多くの試行錯誤の末、ようやく問題の原因を見つけました。スレッドはうまく機能します。問題は、NetBeans が何らかの方法で UI コンポーネントを再配置したことで、ウィンドウが画面いっぱいになり、手動でサイズ変更して ComboBox をテストすると、実際に正常に動作することが示されました。

于 2011-04-17T16:43:49.270 に答える