2011-06-28 31 views
0

これは私の最後の質問の続きです。私は、SwingコンポーネントでMVCパターンを使用してコードは、プログラムがハングアップしてイベントを公開を停止するようだ複数のボタンをしかし、このスカラースイングリスナーを制御する方法

よう
import scala.swing 
import scala.swing.event._ 

case object MyBusinessEvent extends Event 

class MyController extends Publisher { 
    val form = new MyForm 
    listenTo(form) 
    reactions += { 
     case MyBusinessEvent => //handle event code here 
    } 
} 

class MyForm extends Publisher { 
    val ui = new GridBagPanel { 
    val c = new Constraints 
    .... more code here 
    } 

    val button1 = new Button("Button 1") 
    //add button to panel 


    listenTo(button1) 
    reactions += { 
    case ButtonClicked(_) => publish(MyBusinessEvent) 
    } 
} 

を行きます。これを修正する方法はありますか?ありがとう

+1

問題を示す完全な実例を追加したい場合や、答えが得られない場合があります。 –

+0

まあ、真実はそれよりはるかに多くあります...より多くのボタンやイベントで正確に同じコードが期待されます。 –

答えて

1

問題が何であるかは分かりませんが、残念ながらスイングとMVCで非常に簡単に起こるサイクルを作成していると思います。つまり、1つのモデルが別のモデルのリッスンの一部として更新され、もう1つのモデルでもう一度更新がトリガーされます。 Javaのスイングでは、2つの選択肢が、持っている

a)に一時的に例えば

B)JComboBoxsetSelectedItemを呼び出す前にremoveActionListenerを行い、その後、その後addActionListenerに再登録(モデルを更新しているリスナーを削除します)イベントソース(java.util.EventObjectgetSource)をチェックし、まったく同じモデルから発生したモデルのイベントを無視します。

今やscala swingはより単純化されているので、イベントオブジェクトとイベントソースはありません。カスタムイベントケースクラスにソースを追加することができます。モデルの状態を設定した後で反応を取り除き、それを再追加することも可能です。私はミックスで、私は解雇イベントの詳細な制御をしたいコンポーネントに

trait Editable extends Publisher { 
    private var _editing = false 

    def editing = _editing 

    def editing_=(b: Boolean) = _editing = b 

    override def publish(e: Event) { 
     if(!editing) super.publish(e) 
    } 
} 

:私はこのような形質を持っている0 __さんの回答で述べたサイクルを避けるため

+0

私はこの質問を投稿したことを忘れてしまいました。私はどうにかして、あまりにも多くの例をtheresだけ多くのボタンは、彼らはしばらくの間働いて、その後、彼らはハングアップコンパイラエラー。 –

0

。イベントを発生させずに何かを変更したい場合は、コードをediting = trueediting = falseの間に置きます。

関連する問題