BayGUI/バグ


BayGUI

【済】 [Mona] bayguiのEventにはまる

http://d.hatena.ne.jp/higepon/20061125/1164463464

e->getSource()がおかしいなぁ。

作法を間違えたか? 追記

最小再現コード

class Sample : public Frame {
private:
    Button* button_;
    Label* label_;
public:
    Sample()
    {
        setBounds(50, 50, 200, 200);
        button_ = new Button("test");
        button_->setBounds(100, 100, 24, 24);
        setTitle("Sample");
        add(button_);
        label_ = new Label("");
        label_->setBounds(10, 30, 150, 40);
        add(label_);
    }

    ~Sample()
    {
        delete label_;
        delete button_;
    }

    void processEvent(Event *event)
    {
        if (event->getType() == MouseEvent::MOUSE_PRESSED)
        {
            char buf[64];
            sprintf(buf, "source=%x\n", event->getSource());
            label_->setText(buf);
        }
    }
};

int MonaMain(List<char*>* pekoe)
{
    Sample* sample = new Sample;
    sample->run();
    delete sample;
    return 0;
}

event source をラベルに表示するコードですが、一度ボタンを押した後にボタン外を押してもボタンと同じsourceの event が来る場合がある。

パッチ by bayside

こんな感じでいけるかもです。

	void Container::dispatchEvent(Event* event)
	{
		// 非活性の時はイベントを受け付けない
		if (getEnabled() == false) return;

		// 活性部品にキーイベントを投げる
		if (event->getType() == KeyEvent::KEY_PRESSED || event->getType() == KeyEvent::KEY_RELEASED) {
			Component* component = getComponent();
			// 部品でイベントが起こった
			if (component != NULL) {
				event->setSource(component);
				component->processEvent(event);
			}
			// 部品以外でイベントが起こった
			processEvent(event);
		// マウスクリック
		} else if (event->getType() == MouseEvent::MOUSE_PRESSED) {
			MouseEvent* me = (MouseEvent *)event;
			// マウスイベントが起こった部品を探す
			Component* component = getComponentAt(me->getX(), me->getY());
			// 部品でイベントが起こった
			if (component != NULL) {
				// イベントが起こった部品以外をフォーカスアウト状態にする
				int I = this->componentList.size();
				for (int i = 0; i < I; i++) {
					Component* c = (Component *)this->componentList.get(i);
					if (c != component) {
						c->setFocused(false);
					}
				}
				component->setFocused(true);
				event->setSource(component);
				Rectangle* bounds = component->getBounds();
				me->setX(me->getX() - bounds->x);
				me->setY(me->getY() - bounds->y);
				//syscall_print("MOUSE_PRESSED,");
				component->processEvent(event);
			// 部品以外でイベントが起こった
			} else {
				// 部品をフォーカスアウト状態にする
				int I = this->componentList.size();
				for (int i = 0; i < I; i++) {
					Component* c = (Component *)this->componentList.get(i);
					c->setFocused(false);
				}
				event->setSource(this); /* ココ! */
				processEvent(event);
			}
		// マウスクリック以外のマウスイベント
		} else if (event->getType() == MouseEvent::MOUSE_RELEASED || 
				   event->getType() == MouseEvent::MOUSE_DRAGGED || 
				   event->getType() == MouseEvent::MOUSE_MOVED)
		{
			MouseEvent* me = (MouseEvent *) event;
			// マウスイベントが起こった部品を探す
			Component* component = getComponentAt(me->getX(), me->getY());
			// 部品でイベントが起こった
			if (component != NULL) {
				event->setSource(component);
				Rectangle* bounds = component->getBounds();
				me->setX(me->getX() - bounds->x);
				me->setY(me->getY() - bounds->y);
				component->processEvent(event);
			// 部品以外でイベントが起こった
			} else {
				event->setSource(this); /* ココ! */
				processEvent(event);
			}
		} else {
			processEvent(event);
		}
	}

[Mona] bayguiへの要望

   * MOUSE_ENTERED
   * MOUSE_EXITED

イベントが欲しいな。マウスカーソルを当てると見た目が変わるコンポーネントとか実装するのが楽になる!>id:Baysideさん

参照

MouseEvent (Java 2 プラットフォーム SE v1.4.0)

上記のイベント処理部分で、過去のイベントをスタックに積んで置けばわかるかもしれないですが、もうちょっといいアルゴリズムはありますかね? -- bayside

コメント

最新の1000件を表示しています。 コメントページを参照

お名前:
  • コミットできなくなりますた(涙) -- bayside 2006-12-02 (土) 03:37:24
    • どういう症状ですか。 -- ひげぽん 2006-12-02 (土) 10:03:03
    • sf.net は定期的にパスワードを変えないとログインできなくなるらしい&SSH公開鍵は面倒なのでパスフレーズを空文字で設定していた(笑)というのが原因でした。パスワード変更&パスフレーズ設定を行ってコミットしました。 -- bayside 2006-12-04 (月) 02:58:48
    • お疲れさまでした。 -- ひげぽん 2006-12-04 (月) 09:39:16
  • イベントバグについては、直っているのであればお手数ですが trunk にいれていただけますでしょうか。Eventは各Componentが今 Enteredかどうかのフラグさえ持てば何とかなるのではないでしょうか。例えば entered == false であれば、(x,y,w,h)の範囲にマウスが入ったらEnterイベントを発生させて、フラグを立てれば良い的な。 -- ひげぽん 2006-11-29 (水) 20:22:42

MENU

now: 1

リンク


最新の20件
2018-05-03 2017-09-29 2017-04-25 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-06-05 2016-05-29 2016-04-15 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 3307, today: 1, yesterday: 1

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:47:54 (3710d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.062 sec.