JFrame标签出现重叠

时间:2018-11-21 00:37:23

标签: java jframe jlabel

我刚刚编写了一个程序,该程序具有一个包含JLabel数组的JFrame。数组获取由for循环分配的单个JLabel的位置:

for(int i=0; i<label_entries.length; i++){
    label_entries[i].setLocation(10, i*30);
    label_entries[i].setSize(120,30);
    dialog.add(label_entries[i]);   
}

不要困惑,我的JFrame的名称是“ dialog”。 有一个简单的问题:for循环不应该像for循环那样工作,我也不知道为什么,这是我的JFrame中的结果: Imgur

不要关心单个JLabel条目,有趣的是“ Telefon”的位置。 如果我将循环的开始设置为

for(int i=0; i<label_entries.length-1; i++){...}

这是同样的问题,只是另一个JLabel。

希望您能帮助我, 来自德国的问候

编辑:这是完整的代码:

    JFrame dialog = new JFrame();
    dialog.setBounds(25, 50, 500, 500);
    dialog.setTitle("Eintrag hinzufügen");
    dialog.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    dialog.setVisible(true);

    JLabel[] label_entries = new JLabel[11];
    JTextField[] textfields = new JTextField[11];
    label_entries[0] = new JLabel("Vorname :");
    label_entries[1] = new JLabel("Nachname :");
    label_entries[2] = new JLabel("Nummer :");
    label_entries[3] = new JLabel("Geburtstag :");
    label_entries[4] = new JLabel("Land :");
    label_entries[5] = new JLabel("PLZ :");
    label_entries[6] = new JLabel("Stadt :");
    label_entries[7] = new JLabel("Strasse :");
    label_entries[8] = new JLabel("Hausnummer :");
    label_entries[9] = new JLabel("E-Mail :");
    label_entries[10] = new JLabel("Telefon :");


    for(int i=0; i<label_entries.length; i++){
        label_entries[i].setLocation(10, i*30);
        label_entries[i].setSize(120,30);
        dialog.add(label_entries[i]);   
    }

这应该更容易理解...

2 个答案:

答案 0 :(得分:1)

一个明显的问题是您正在设置组件的绝对位置。通常,LayoutManager用于此目的。

要清除JFrame内容窗格的默认布局管理器,请在创建框架后立即将其设置为null

JFrame dialog = new JFrame();
dialog.setLayout(null);

答案 1 :(得分:1)

JFrame的Javadoc说:

  

默认的内容窗格上将设置一个BorderLayout管理器。

BorderLayout的Javadoc说:

  

边界布局可对容器进行布局,并对其组件进行调整并调整其大小以适合五个区域:北,南,东,西和中部。每个区域最多可以包含一个组成部分,并由相应的常量NORTHSOUTHEASTWESTCENTER标识。将组件添加到具有边框布局的容器时,请使用以下五个常量之一,例如:

Panel p = new Panel();
p.setLayout(new BorderLayout());
p.add(new Button("Okay"), BorderLayout.SOUTH);
     

为方便起见,BorderLayout将字符串规范的缺失解释为与常量CENTER相同:

Panel p2 = new Panel();
p2.setLayout(new BorderLayout());
p2.add(new TextArea());  // Same as p.add(new TextArea(), BorderLayout.CENTER);

自从您调用add()的1-arg版本以来,所有JLabel都添加了BorderLayout.CENTER,所以最后一个获胜,BorderLayout管理器随后将其自动定位在左中角。

要防止这种情况发生,只需删除布局管理器即可:

dialog.setLayout(null);