gpt4 book ai didi

Java:如何将 "bundle"GUI 元素分组并干净地收听多个组?

转载 作者:行者123 更新时间:2023-11-29 05:53:13 25 4
gpt4 key购买 nike

我不擅长GUI设计。经过深思熟虑、研究和实验,我提出了几种设计理念,但似乎仍然没有一个有效。一种设计有一个 Session god 对象在创建时在每个 UI 元素上注册一个监听器,并且每个关心任何操作的对象都在 Session 对象上注册一个监听器。这看起来简单而强大,因为所有消息传递都经过一个中心位置,因此丢失任何东西的可能性较小。虽然这是蛮力,而且看起来很麻烦且效率低下。

另一种设计试图创建相互对话的对象子组。这避免了巨大的顶级 Session 并且看起来更高效,但也似乎容易出错。

我正在尝试实现一个重用框架,在该框架中,我将具有相关用途的按钮分组到工具栏中,并采用分层方法来监听工具栏执行的操作以及对监听器的相关操作。到目前为止,我已经做到了这一点:

public class EditorToolBar extends JToolBar {
public static enum Command {
ZOOMIN,
ZOOMOUT,
FINER,
COARSER,
RESET
}

private ButtonCommandListener listener = new ButtonCommandListener();
public EditorToolBar() {
super("Editor Commands");
JButton button;
for (final Command cmd : Command.values()) {
button = new JButton(cmd.toString());
button.setEnabled(true);
button.setToolTipText(cmd.toString() + " Command");
button.setActionCommand(cmd.toString());
button.addActionListener(listener);
add(button);
}
}
public void addActionListener(ActionListener pNewListener) {
listener.cActionNotifier.addListener(pNewListener);
}
private class ButtonCommandListener implements ActionListener {
private NotifierImp<ActionListener> cActionNotifier = new NotifierImp<ActionListener>();
public void actionPerformed(ActionEvent pEvent) {
for (ActionListener listener : cActionNotifier) {
listener.actionPerformed(pEvent);
}
}
}
} // class EditorTooBar

然后监听器实现这样的东西:

    public void actionPerformed(ActionEvent pEvent) {
switch (EditorToolBar.Command.valueOf(pEvent.getActionCommand())) {
case ZOOMIN:
// do something
break;
case ZOOMOUT:
// do something
break;
case FINER:
// do something
break;
case COARSER:
// do something
break;
case RESET:
// do something
break;
default:
System.out.println("Unknown EditorToolBar Command: "+pEvent.getActionCommand());
return;
}

我可以增强枚举的指导器,使其还包括工具提示文本、图像等。我想重用这个设计,只是用一个不同的枚举来描述其他工具栏。监听器将使用 ActionEvent.getActionCommand() 和使用 Command.toValue(String) 来区分不同的按钮操作。我希望将其扩展到正在监听的类的层次结构:父类(super class)可以为一种类型的工具栏实现监听器,子类通过监听不同的工具栏类型来添加它。如果事件不是来自子类感兴趣的工具栏,它可以将事件转发给父类(super class)。为了完成这项工作,我需要一种方法来区分一个工具栏和另一个工具栏,但最好不必检查该工具栏中可能出现的每个按钮事件。理想情况下,我想要一个工具栏工厂,只需指定一个枚举就足以完整地描述一个工具栏。无法对枚举进行子类化增加了这里的挑战。

这是一个有前途的设计模式吗?我还没有在其他任何地方看到它。有没有更好的方法我应该使用而不是发明劣质的东西?欢迎提供指向其他选项的链接。

编辑:根据 yash ahuja 的回答,我应该澄清一下,当我提到层次结构时,我的意思是类似于处理键绑定(bind)的方式(即你有绑定(bind)吗?没有,那么没有你的容器有绑定(bind)?......直到某人使用键事件)而不是实际的类层次结构。

最佳答案

作为封装功能的一种方式,考虑结合 JToolBar,在 How to Use Tool Bars 中讨论。 ,带有 Action,在 How to Use Actions 中讨论.引用的例子here导出单个工具栏。相比之下,StyledEditorKit,图文并茂here , 导出应用于当前选择的文本组件的 Action 子类型系列。

关于Java:如何将 "bundle"GUI 元素分组并干净地收听多个组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13133629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com