声明单个对象或将匿名对象循环到ArrayList是更好的做法吗?

时间:2013-08-21 04:25:40

标签: java swing

我正在通过教科书学习Java编程。编程练习要求您:

(Swing常用功能)显示包含六个标签的框架。设置背景 标签为白色。将标签的前景设置为黑色,蓝色,青色, 绿色,洋红色和橙色,分别如图12.28a所示。设置边框 每个标签到黄色的线条边框。将每个标签的字体设置为 Times Roman,粗体和20像素。将每个标签的文本和工具提示文本设置为 前景色的名称。

我有两个问题的答案。我的答案和书籍回答。两个答案都很好。

我使用一个数组并使用一个循环用匿名对象填充它(如类Sixlabels扩展JFrame {}所示):

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;


public class TWELVE_point_8 {

public static void main(String[] args) {

    JFrame frame = new SixLabels();
    frame.setTitle("Six Labels");
    frame.setSize(300, 200);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

}

}

class SixLabels extends JFrame {

public SixLabels() {
    setLayout(new GridLayout(2, 3));

    JLabel[] list = {
        new JLabel("Black"),
        new JLabel("Blue"),
        new JLabel("Cyan"),
        new JLabel("Green"),
        new JLabel("Magenta"),
        new JLabel("Orange")};

     // set foreground colors
    list[0].setForeground(Color.black);
    list[1].setForeground(Color.blue);
    list[2].setForeground(Color.cyan);
    list[3].setForeground(Color.green);
    list[4].setForeground(Color.magenta);
    list[5].setForeground(Color.orange);

    // set background colors
    for (int i = 0; i < list.length; i++)
        list[i].setBackground(Color.white);

    // set fonts
    Font font = new Font("TimesRoman", Font.BOLD, 20);

    for (int i = 0; i < list.length; i++)
        list[i].setFont(font);

    // set borders
    Border lineBorder = new LineBorder(Color.yellow, 1);

    for (int i = 0; i < list.length; i++)
         list[i].setBorder(lineBorder);

    // set tooltip
    for (int i = 0; i < list.length; i++)
            list[i].setToolTipText(list[i].getText());

    // add all labels to container
    for (int i = 0; i < list.length; i++)
        add(list[i]);

}
}

书中的答案不使用数组列表(如公开练习12_8所示,扩展JFrame {});

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

public class Exercise12_8 extends JFrame {
      private JLabel jlblBlack = new JLabel("black");
      private JLabel jlblBlue = new JLabel("blue");
      private JLabel jlblCyan = new JLabel("cyan");
      private JLabel jlblGreen = new JLabel("green");
      private JLabel jlblMagenta = new JLabel("magenta");
      private JLabel jlblOrange = new JLabel("orange");

      public Exercise12_8() {
          setLayout(new GridLayout(2, 3));
          this.add(jlblBlack);
          this.add(jlblBlue);
          this.add(jlblCyan);
          this.add(jlblGreen);
          this.add(jlblMagenta);
          this.add(jlblOrange);

          jlblBlack.setBackground(Color.WHITE);
          jlblBlue.setBackground(Color.WHITE);
          jlblCyan.setBackground(Color.WHITE);
          jlblGreen.setBackground(Color.WHITE);
          jlblMagenta.setBackground(Color.WHITE);
          jlblOrange.setBackground(Color.WHITE);

          jlblBlack.setForeground(Color.BLACK);
          jlblBlue.setForeground(Color.BLUE);
          jlblCyan.setForeground(Color.CYAN);
          jlblGreen.setForeground(Color.GREEN);
          jlblMagenta.setForeground(Color.MAGENTA);
          jlblOrange.setForeground(Color.ORANGE);

          Font font = new Font("TImesRoman", Font.BOLD, 20);
          jlblBlack.setFont(font);
          jlblBlue.setFont(font);
          jlblCyan.setFont(font);
          jlblGreen.setFont(font);
          jlblMagenta.setFont(font);
          jlblOrange.setFont(font);

          Border border = new LineBorder(Color.YELLOW);
          jlblBlack.setBorder(border);
          jlblBlue.setBorder(border);
          jlblCyan.setBorder(border);
          jlblGreen.setBorder(border);
          jlblMagenta.setBorder(border);
          jlblOrange.setBorder(border);

          jlblBlack.setToolTipText("black");
          jlblBlue.setToolTipText("blue");
          jlblCyan.setToolTipText("cyan");
          jlblGreen.setToolTipText("green");
          jlblMagenta.setToolTipText("magenta");
          jlblOrange.setToolTipText("orange");
      }

      public static void main(String[] args) {
          Exercise12_8 frame = new Exercise12_8();
          frame.setTitle("Exercise12_8");
          frame.setSize(400, 400);
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setLocationRelativeTo(null); // Center the frame
          frame.setVisible(true);
     }
}

我的问题是:是否更好的做法是单独声明JLabel对象(如本书所示)或者像我一样匿名填充数组(或ArrayList)?我在书中看到的唯一好处是可读性和可变名称(可以在未来的程序中使用,但不能在这个特定的程序中使用)。

5 个答案:

答案 0 :(得分:3)

我可以为你提供第三个答案。创建一个采用JLabel并配置它的方法。这样您就可以使用其他两个中的任何一个并降低代码复杂性。

答案是,这取决于。这取决于你想要达到的目标。

如果您要对相同的严重组件进行大量更改,例如您在这里,我可能会想要使用简单的List或数组。如果元素的数量是动态的,或者只能在类内部访问,则此功能特别有用。

另一方面,如果要在外部更改或更新组件的状态,通常更容易为组件提供命名访问。是的,你可以提供一个使用int参数的方法,但随后你开始遇到问题,总是要验证参数:P

所以我猜,问题是,你需要实现什么?

答案 1 :(得分:2)

我建议如果你因为职业原因学习编程,那么你应该按照书中的说法进行操作。因为在较大的项目中(如果你将来可能会在一个项目上工作),这种做法很常见,正如你所说,可读性和变量名称。说它就像一个惯例。

答案 2 :(得分:0)

集合或数组将是我的偏好。进行更改或添加其他字段非常简单。在您的第一个示例中,您可以在一个循环中执行所有操作。每个属性不需要单独的循环。删除额外的循环后,你的代码会很小。

答案 3 :(得分:0)

在我看来,更好的做法是创建方法Jlabel createLabel(String text, Color foregroundColor)并在循环中使用它来创建标签

答案 4 :(得分:0)

您似乎已经自己回答了这个问题。是的,如果您需要在事件生成中操纵标签(更改属性),则需要引用(您称之为变量名称)。但是,如果没有这样的要求,那么在这种情况下,使用数组或列表的方法是干净的,并且需要较少的代码编写工作。