JTextField定位/布局问题

时间:2018-11-21 16:10:49

标签: java layout jtextfield

我一直在为我当前正在开发的桌面应用程序创建一个对话窗口。对话框必须具有预定数量的文本字段(换句话说,变量),但是在对代码的初始化部分进行编码时遇到了一个奇怪的错误:当JTextField组件被初始化时,最后一个决定占用全部窗口。我尝试了许多奇怪的方法来更改将其添加到窗口的方式,但是无论如何它都会继续执行此操作(我将默认文本设置为字段的索引,以便我知道它始终是最后一个)。这是代码:

package com.main;

import java.awt.EventQueue;
import java.awt.TextField;

import javax.swing.JFrame;

public class classAddingDialog extends startingMenuWindow {

    private JFrame frame1;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    classAddingDialog window = new classAddingDialog();
                    window.frame1.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public classAddingDialog() {
        initialize();
    }

    private void initialize() {
        frame1 = new JFrame();
        frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        int count = 18,i;                                                                             //startingMenuWindow.countForNewClass;
        frame1.setBounds(100, 100, 450, 20+50*count/2+50);
        TextField[] nameInputs=new TextField[count];

        for(i=0;i<count;i++) {
            nameInputs[i]=new TextField();
            if(i<Math.ceil((double) count/2)) {
                nameInputs[i].setBounds(10, 10+50*i, 100, 30);
            }else {
                nameInputs[i].setBounds(180, (int) (10+50*(i-Math.ceil((double) count/2))), 100, 30);
            }
            nameInputs[i].setText(Integer.toString(i));
            frame1.add(nameInputs[i]);
        }
    }
}

也不要花费精力检查最后一个JTextField的位置和界限,我已经做了,并且

nameInputs[i].getBounds();

函数返回正确的位置(应该在正确的位置),但实际上它只覆盖整个Window。

如果有人知道问题出在哪里,请告诉我。预先感谢。

1 个答案:

答案 0 :(得分:1)

  

初始化JTextField组件时,最后一个决定占据整个窗口。

Swing使用布局管理器。 JFrame内容窗格的默认布局管理器是BorderLayout。当您不指定约束时,组件将添加到框架的BorderLayout.CENTER。只能将一个组件添加到CENTER,这是您添加的最后一个组件。然后,BorderLayout的规则说明CENTER中的组件将占用框架中所有剩余的空间。

请阅读Layout Manager上Swing教程中的部分,以获取更多信息和使用BorderLayout的示例。

解决方案是不要尝试设置组件的边界,而要使用布局管理器。

  1. 不要使用TextField,它是AWT组件。您应该使用JTextField
  2. 创建JTextField时,请使用类似new JTextField(10)的名称。 10将指定一次可在文本字段中显示的“ W”字符数。这样,文本字段就可以计算其首选大小,然后布局管理器可以使用它。
  3. 不要尝试分配文本字段的边界。 Swing旨在与布局管理器一起使用。布局管理器将根据布局管理器的规则确定组件的大小和位置。
  4. 在我看来,您好像试图在两列网格中显示文本字段,因此可以使用带有GridLayout的面板。有关示例,请参见教程。

所以您的基本逻辑将类似于:

JPanel grid = new JPanel( new GridLayout(0, 2) );

for(i = 0; i < count; i++) 
{
    JTextField textField = new JTextField(10);
    textField.setText( Integer.toString(i) );
    nameInputs[i] = textField();
    grid.add( textField ):
}

frame.add(grid);
frame.pack();
frame.setVisible( true );