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

时间:2014-07-21 00:41:44

标签: java swing components containers standards

我已经四处寻找,但是对于这个问题却无法解决问题。

我不确定我当前为我的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);
}

2 个答案:

答案 0 :(得分:2)

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

也就是说,通过为工作选择最佳布局管理器,可以减轻布局对象的大部分毛发。自从我尝试了第一个项目以来,我从中受益匪浅,我一直非常偏向于使用MigLayout(http://www.miglayout.com/),但我承认,对于简单的案例来说,它可能有点过分。看看他们的快速入门指南& Swing演示(显示它可以做什么以及执行它的代码)并查看它是否对您有意义。

答案 1 :(得分:2)

问题是上下文,有时候,您会以视觉顺序创建组件,有时您会按需要顺序创建它们(因此,首先会创建一个视觉上显示在另一个之后的组件,因为某些原因需要它)。

我能提出的唯一建议是限制混乱。如果要创建多个容器,则在创建一个或多个(工厂)方法时可能是值得的,这些方法负责执行繁重的工作。这样可以减少混乱,并且可以更容易地分离UI元素之间的可视/逻辑连接。

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

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

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