擦除标签约束

Erase Label Constraints

我将一个自定义标签命名为 MyLabel,它的工作方式有些奇怪。 MyLabel是一个Label,它只是扩展了JLabel。

public class MyLabel extends JLabel {
    public MyLabel() {
        // TODO Auto-generated constructor stub
    }

    public MyLabel(String arg0) {
        super(arg0);
        // TODO Auto-generated constructor stub
    }

    public MyLabel(Icon arg0) {
        super(arg0);
        // TODO Auto-generated constructor stub
    }

    public MyLabel(String arg0, int arg1) {
        super(arg0, arg1);
        // TODO Auto-generated constructor stub
    }

    public MyLabel(Icon arg0, int arg1) {
        super(arg0, arg1);
        // TODO Auto-generated constructor stub
}

    public MyLabel(String arg0, Icon arg1, int arg2) {
        super(arg0, arg1, arg2);
        // TODO Auto-generated constructor stub
    }
}

如您所见,没有添加任何内容。但是,这里有一件奇怪的事情。每当我添加 MyLabel class 标签时,我添加的最后一个会得到约束,尽管我没有添加!

下面是我在 Contentpane 上添加标签的方法。

MyLabel label0_1 = new MyLabel("");
MyLabel label0_2 = new MyLabel("");
MyLabel label0_3 = new MyLabel("");
MyLabel label0_4 = new MyLabel("");
MyLabel label0_0 = new MyLabel("");
MyLabel label1_1 = new MyLabel("");
MyLabel label1_2 = new MyLabel("");
MyLabel label1_3 = new MyLabel("");
MyLabel label1_4 = new MyLabel("");
MyLabel label1_0 = new MyLabel("");
MyLabel label2_1 = new MyLabel("");
MyLabel label2_2 = new MyLabel("");
MyLabel label2_3 = new MyLabel("");
MyLabel label2_4 = new MyLabel("");
MyLabel label2_0 = new MyLabel("");
MyLabel label3_1 = new MyLabel("");
MyLabel label3_2 = new MyLabel("");
MyLabel label3_3 = new MyLabel("");
MyLabel label3_4 = new MyLabel("");
MyLabel label3_0 = new MyLabel("");
MyLabel label4_1 = new MyLabel("");
MyLabel label4_2 = new MyLabel("");
MyLabel label4_3 = new MyLabel("");
MyLabel label4_4 = new MyLabel("");
MyLabel label4_0 = new MyLabel("");
label0_1 = new MyLabel(defaultImage);
label0_2 = new MyLabel(defaultImage);
label0_3 = new MyLabel(defaultImage);
label0_4 = new MyLabel(defaultImage);
label0_0 = new MyLabel(defaultImage);
label1_1 = new MyLabel(defaultImage);
label1_2 = new MyLabel(defaultImage);
label1_3 = new MyLabel(defaultImage);
label1_4 = new MyLabel(defaultImage);
label1_0 = new MyLabel(defaultImage);
label2_1 = new MyLabel(defaultImage);
label2_2 = new MyLabel(defaultImage);
label2_3 = new MyLabel(defaultImage);
label2_4 = new MyLabel(defaultImage);
label2_0 = new MyLabel(defaultImage);
label3_1 = new MyLabel(defaultImage);
label3_2 = new MyLabel(defaultImage);
label3_3 = new MyLabel(defaultImage);
label3_4 = new MyLabel(defaultImage);
label3_0 = new MyLabel(defaultImage);
label4_1 = new MyLabel(defaultImage);
label4_2 = new MyLabel(defaultImage);
label4_3 = new MyLabel(defaultImage);
label4_0 = new MyLabel(defaultImage);
label4_4 = new MyLabel(defaultImage);
label0_0.setBounds(120, 120, 100, 100);
label0_1.setBounds(220, 120, 100, 100);
label0_2.setBounds(320, 120, 100, 100);
label0_3.setBounds(420, 120, 100, 100);
label0_4.setBounds(520, 120, 100, 100);
label1_0.setBounds(120, 220, 100, 100);
label1_1.setBounds(220, 220, 100, 100);
label1_2.setBounds(320, 220, 100, 100);
label1_3.setBounds(420, 220, 100, 100);
label1_4.setBounds(520, 220, 100, 100);
label2_0.setBounds(120, 320, 100, 100);
label2_1.setBounds(220, 320, 100, 100);
label2_2.setBounds(320, 320, 100, 100);
label2_3.setBounds(420, 320, 100, 100);
label2_4.setBounds(520, 320, 100, 100);
label3_0.setBounds(120, 420, 100, 100);
label3_1.setBounds(220, 420, 100, 100);
label3_2.setBounds(320, 420, 100, 100);
label3_3.setBounds(420, 420, 100, 100);
label3_4.setBounds(520, 420, 100, 100);
label4_0.setBounds(120, 520, 100, 100);
label4_1.setBounds(220, 520, 100, 100);
label4_2.setBounds(320, 520, 100, 100);
label4_3.setBounds(420, 520, 100, 100);
label4_4.setBounds(520, 520, 100, 100);
frame.getContentPane().add(label0_0);
frame.getContentPane().add(label0_1);
frame.getContentPane().add(label0_2);
frame.getContentPane().add(label0_3);
frame.getContentPane().add(label0_4);
frame.getContentPane().add(label1_0);
frame.getContentPane().add(label1_1);
frame.getContentPane().add(label1_2);
frame.getContentPane().add(label1_3);
frame.getContentPane().add(label1_4);
frame.getContentPane().add(label2_0);
frame.getContentPane().add(label2_1);
frame.getContentPane().add(label2_2);
frame.getContentPane().add(label2_3);
frame.getContentPane().add(label2_4);
frame.getContentPane().add(label3_0);
frame.getContentPane().add(label3_1);
frame.getContentPane().add(label3_2);
frame.getContentPane().add(label3_3);
frame.getContentPane().add(label3_4);
frame.getContentPane().add(label4_0);
frame.getContentPane().add(label4_1);
frame.getContentPane().add(label4_2);
frame.getContentPane().add(label4_3);
frame.getContentPane().add(label4_4);

我添加了一些标签。现在,label4_4 有约束条件。当我删除 label4_4 时,label4_3 得到了约束。当我也删除 label4_3 时,label4_2 明白了!为什么会这样?

首先,你需要特别去阅读Laying Out Components Within a Container and How to Use BorderLayout

A JFrame,默认使用BorderLayout。这意味着只有添加到五个可用位置(CENTER 是默认位置)中的任何一个的最后一个组件将被管理,所有其他组件将被忽略。

你的问题的答案很简单。

  1. 不要使用 setBounds
  2. 使用一个或多个合适的布局管理器