我正在通过教科书学习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)?我在书中看到的唯一好处是可读性和可变名称(可以在未来的程序中使用,但不能在这个特定的程序中使用)。
答案 0 :(得分:3)
我可以为你提供第三个答案。创建一个采用JLabel
并配置它的方法。这样您就可以使用其他两个中的任何一个并降低代码复杂性。
答案是,这取决于。这取决于你想要达到的目标。
如果您要对相同的严重组件进行大量更改,例如您在这里,我可能会想要使用简单的List
或数组。如果元素的数量是动态的,或者只能在类内部访问,则此功能特别有用。
另一方面,如果要在外部更改或更新组件的状态,通常更容易为组件提供命名访问。是的,你可以提供一个使用int
参数的方法,但随后你开始遇到问题,总是要验证参数:P
所以我猜,问题是,你需要实现什么?
答案 1 :(得分:2)
我建议如果你因为职业原因学习编程,那么你应该按照书中的说法进行操作。因为在较大的项目中(如果你将来可能会在一个项目上工作),这种做法很常见,正如你所说,可读性和变量名称。说它就像一个惯例。
答案 2 :(得分:0)
集合或数组将是我的偏好。进行更改或添加其他字段非常简单。在您的第一个示例中,您可以在一个循环中执行所有操作。每个属性不需要单独的循环。删除额外的循环后,你的代码会很小。
答案 3 :(得分:0)
在我看来,更好的做法是创建方法Jlabel createLabel(String text, Color foregroundColor)
并在循环中使用它来创建标签
答案 4 :(得分:0)
您似乎已经自己回答了这个问题。是的,如果您需要在事件生成中操纵标签(更改属性),则需要引用(您称之为变量名称)。但是,如果没有这样的要求,那么在这种情况下,使用数组或列表的方法是干净的,并且需要较少的代码编写工作。