【问题标题】:JFrame labels appear overlappedJFrame 标签出现重叠
【发布时间】:2018-11-21 00:37:23
【问题描述】:

我刚刚编写了一个程序,它有一个JFrame,其中包含一组JLabel 组件。数组获取由 for 循环分配的单个标签的位置:

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]);   
}

不要混淆,我的框架名称是“对话框”。

有一个简单的问题:for循环不像for循环那样工作,我不知道为什么,这是我框架中的结果:

Imgur.

别在意单个标签条目,有趣的是Telefon的位置。

如果我将循环的开头设置为以下,也是同样的问题,只是换了一个标签。

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

这里是完整的代码

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]);   
}

这应该更容易理解。

【问题讨论】:

  • “不要混淆,我的框架的名称是“对话”。”“不要混淆”的一个简单方法是让提出问题的人不要使用混淆类、属性或方法的名称。在您创建新代码来演示问题时,请重命名任何让您感到不得不对其进行评论的令人困惑的内容。说到“新代码”。为了尽快获得更好的帮助,edit 添加minimal reproducible exampleShort, Self Contained, Correct Example

标签: java swing jframe jlabel


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答,我刚刚在另一个 JFrame 上使用了这种方法,我无法解释为什么我这次没有使用它...
【解决方案2】:

正如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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2012-08-29
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多