将 Swing 组件添加到容器的标准方法?

Posted

技术标签:

【中文标题】将 Swing 组件添加到容器的标准方法?【英文标题】:Standard way of adding Swing components to a container? 【发布时间】:2014-09-11 10:32:18 【问题描述】:

我已经四处搜索,但无法真正解决这个问题。

我不确定其他程序员乍一看是否会完全理解我当前向 UI 添加大量组件的策略。我做了很多 Swing 工作(主要是为了我的个人应用程序),所以我的过程当然是我习惯的。

基本上,我喜欢创建所有组件(也许不是按顺序,有时我的想法从一开始就不是 100% 线性和正确的)。我可能会也可能不会回去好好订购它们。

但是,我确实确保按类似于网页的顺序添加它们。几乎总是在创建它们的方法结束时。

在 Swing 中是否有一种标准的方法可以将组件添加到容器中?我见过人们似乎在他们的代码中随意添加组件,如果我需要调整一个组件,有时很难找到。我尽量保持这部分集中,并以合理的方式将它们添加到容器中。

例子:

public void populateMyPanel()

    // Create all components
    JPanel wrapperPanel new JPanel(new BorderLayout());

    JPanel panelWest = new JPanel(new FlowLayout());
    JLabel labelOne = new JLabel("Label #1");
    JButton buttonOne = new JButton("Button #1");

    JPanel panelCenter = new JPanel(new FlowLayout());
    JButton buttonTwo = new JButton("Button #2");

    JPanel panelEast = new JPanel(new FlowLayout());
    JTextField myTextField = new JTextField();
    JButton buttonThree = new JButton("Button #3");

    // Now add them in a top-to-bottom & left-to-right order
    wrapperPanel.add(panelWest, BorderLayout.WEST);
      panelWest.add(labelOne);
      panelWest.add(buttonOne);

    wrapperPanel.add(panelCenter, BorderLayout.CENTER);
      panelCenter.add(buttonTwo);

    wrapperPanel.add(panelEast, BorderLayout.EAST);
      panelEast.add(myTextField);
      panelEast.add(buttonThree);

【问题讨论】:

【参考方案1】:

对于初学者,请遵循最少惊讶原则:如果您正在与其他人合作,并且他们已经建立了约定,请使用他们的约定。我见过一些人的代码非常像你给出的例子。我已经看到其他人声明但没有将对象初始化到类的顶部,然后稍后在一种方法中初始化它们,并将它们添加到另一种方法的面板中。可能有三打其他方法可以做同样的事情,并且每种方法都有一个有效的论据。

也就是说,通过为工作选择最佳布局管理器,可以减轻布置对象的大部分麻烦。自从我尝试的第一个项目从中受益匪浅以来,我一直强烈倾向于使用 MigLayout (http://www.miglayout.com/),但我承认这对于简单的情况来说可能是矫枉过正。看看他们的快速入门指南和 Swing 演示(展示了它可以做什么以及执行它的代码),看看它是否对您有意义。

【讨论】:

【参考方案2】:

问题是上下文相关的,有时,您会按视觉顺序创建组件,有时您会按需求顺序创建它们(因此,由于某种原因需要首先创建一个视觉上出现的组件,因此会首先创建它)。

我能提出的唯一建议就是限制混乱。如果您正在创建多个容器,则可能值得创建一个或多个(工厂)方法来负责完成繁重的工作。这减少了混乱,并且更容易分离 UI 元素之间的视觉/逻辑连接。

如果给定容器的关系很复杂,最好为它们创建一个单独的类,以便将管理隔离到一个类中。根据您的需要,这可能是内部或外部类。这样可以更轻松地将给定系列组件所需的功能与其他组件的管理隔离开来,这将有助于提高对代码的理解。

基本上,对于每种情况都没有硬性或快速的规则,您需要决定如何最好地管理它。就个人而言,我专注于责任和曝光领域。将功能错误隔离到管理卡盘中,使关系/管理/功能更容易理解(并且可以更改/可扩展)并尽可能隔离暴露。

也就是说,如果您的程序的一部分不关心如何收集或管理数据,那么它就不需要访问执行该功能的组件。这降低了理解各种组件如何相互关联的复杂性 - 恕我直言

【讨论】:

以上是关于将 Swing 组件添加到容器的标准方法?的主要内容,如果未能解决你的问题,请参考以下文章

将组件添加到组件时可能会出现啥问题

Swing 顶层容器

JPanel JScrollPanel

java窗口编程

第十一周课程总结

JavaSE基础(十 二 )---<GUI>GUI概述,Swing,容器组件,窗口,面板,布局管理器