我有一个名为Visual Data Structures的项目。我有这样的OOP设计。
Class VisualDataStructures extends JFrame
Class ControlPanel extends JPanel
Class CodePanel extends JPanel
Class VisualDataStructures
有主要内容。此类具有Class ControlPanel和CodePanel的实例。
Class ControlPanel
JMenuItem
内有JMenuBar
Class CodePanel
名为“加载”。
JTextArea
有JMenuItem
。
问题:
我需要在类ControlPanel
中为JTextArea
命名为“load”的actionlistener。单击加载后,用户将进入该文件的目录,然后该文件将加载并显示在CodePanel
的{{1}}处。
我是否需要将从VisualDataStructures实例化的对象CodePanel传递给ControlPanel
,以便我使用该对象然后修改JTextArea的值?
有人知道更好的方法吗?感谢。
答案 0 :(得分:4)
在没有看到实际代码的情况下回答这个问题有点困难,但我仍然会尝试。也许如果你能以某种方式分享你的代码,通过Github,Bitbucket,作为Gist或者在Pastebin中,我可以给出更好的答案。然后,在CodeReview stackexchange而不是StackOverflow上执行此操作可能会更好。
一般来说,我发现GUI父类有这么多extends
有点可疑。 扩展名用法可以是一些反模式。首先,它可能会在微小的应用程序中导致看似简单的代码,但从长远来看,它往往会混淆源代码,因为它鼓励混合使用业务逻辑和UI。误解延伸是OOP的核心。不是。多态抽象是为了解耦和反转关键依赖关系,这是OOP的核心。扩展只是一个很好的方便的东西,而且它被过度使用了。
说到这一点,您可能听说过 MVC - 模型视图控制器。这是用于保持事物分离的UI的典型模式。
您不希望对ActionListener
操作做出反应的load
直接知道CodePanel
,因为这样的依赖性太具体了。您希望在介于两者之间的抽象,如界面,并引用该界面而不是CodePanel
。
说到ActionListener
和类似的界面,如果你还没有完成,你可能会对升级到Java 8感兴趣。像ActionListener
这样只有一个抽象方法的接口是隐式功能接口,这意味着你可以使用lambdas或方法引用。
一般来说,我认为这有助于我们始终牢记以下问题:如果我用不同的工具包替换UI工具包该怎么办?即使它不是用途案例并且永远不会发生,为了回答这个问题,你所做的关注点的分离和分离会导致更模块化,更好的设计,更容易理解和维护。最后,问题如果我用不同的工具包替换UI工具包会怎样?会导致设计遵循更多 SOLID原则。
在Swing中处理ActionListener
时,您可能需要查看interface Action
和abstract class AbstractAction
。它们提供非常有趣的功能。以正确的方式使用,它们可以简化代码。