スウィングコンポーネントをすべて受信した イベントをその親コンテナ(またはルートまでのすべての親)に転送する簡単な方法を探しています。スイング:サブコンポーネントから親コンテナへのすべてのイベントの転送を達成する方法
編集:
どこが必要ですか?私はダイアグラムエディタを持っています。コンポーネントは、キーを押して マウスクリックを転送する必要があります(ユーザーがそのコンポーネントのサブエレメント をクリックすると、アクティブに設定されます)。
まず、私の既存の解決策を提示しましょう。これは少しの回避策です。
public interface IUiAction {
void perform(Component c);
}
public static void performRecursiveUiAction(Container parent, IUiAction action) {
if (parent == null) {
return;
}
for (Component c : parent.getComponents()) {
if (c != null) {
action.perform(c);
}
}
for (Component c : parent.getComponents()) {
if (c instanceof Container) {
performRecursiveUiAction((Container) c, action);
}
}
}
/**
* 1) Add listener to container and all existing components (recursively).
* 2) By adding a ContainerListener to container, ensure that all further added
* components will also get the desired listener.
*
* Useful example: Ensure that every component in the whole component
* tree will react on mouse click.
*/
public static void addPermanentListenerRecursively(Container container,
final IUiAction adder) {
final ContainerListener addingListener = new ContainerAdapter() {
@Override
public void componentAdded(ContainerEvent e) {
adder.perform(e.getChild());
}
};
// step 1)
performRecursiveUiAction(container, adder);
// step 2)
performRecursiveUiAction(container, new IUiAction() {
@Override
public void perform(Component c) {
if (c instanceof Container) {
((Container) c).addContainerListener(addingListener);
}
}
});
}
使用法:
addPermanentListenerRecursively(someContainer,
new IUiAction(
@Override
public void perform(Component c){
c.addMouseListener(somePermanentMouseListener);
}
)
);
コードを見ていることで、あなたはそれが良いコンセプトだと思いますか?
私の現在のコンセプトの問題は、リスナーが手動で指定されたイベントのみを転送することです。
あなたはより良いものを提案できますか?
あなたはそのためにスイングのKeyStrokeの機能を使用することができます:私は物事のキーボード側のための提案を持って、あなたのシナリオに基づいて
あなたのハンドラでイベントを消費したことを示すために使用されるいくつかのスイングイベントで、consume()メソッドが発生しました。私はあなたが必要としているのはその反対ですと思います。 – akarnokd
例:マウスクリック、マウスドラッグ(ビジュアル図要素を「アクティブにする」)、あらゆる種類のホットキー、... –