首页 > 解决方案 > Java - 无法移动 JTextField 的位置

问题描述

我正在尝试在我的 Jframe 中创建一个新的 JTextField。我想玩弄文本字段的定位。我尝试使用 setBounds 和 setLocation 来更改文本框的位置,但它根本不会更改文本框的位置。

这是我的代码:

public class GUI_Tutorial extends JFrame {

    public static void main(String[] args) {

        GUI_Tutorial frame = new GUI_Tutorial();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setSize(1000, 800);
        frame.setVisible(true);
        frame.setTitle("Calculator");
        frame.setLayout(new FlowLayout());

    }

    public GUI_Tutorial() {
        //frame.setLayout(new FlowLayout());
        JTextField num1;
        num1 = new JTextField(10);
        add(num1);
        num1.setVisible(true);
        num1.setLocation(5, 5);     
    } 
}

我可以知道我做错了什么吗?

标签: javaswinglayout-manager

解决方案


您的问题是布局管理器之一。当您将组件添加到容器时,布局管理器将指示组件的去向。JFrame 的 contentPane(保存其组件的 JFrame 子容器)默认使用 BorderLayout,以默认方式添加到此容器的项目将填充容器的中心部分,如果没有其他内容添加到其他容器,将完全填充它边框布局位置。

放置物品的可能解决方案:

  • 最糟糕的建议,使用null布局。你可以通过调用来做到这一点getContentPane().setLayout(null);。但是当你这样做时,你的程序员对添加的所有组件的确切位置和大小负有 100% 的责任。这导致难以维护甚至可能无法在其他平台上运行的 GUI——所以要这样做。
  • 使用 GUI 构建器来帮助构建程序:这有一定的优势,一个是它使您不必直接了解布局管理器,但这也是一个缺点,因为一旦遇到边缘情况(并且您通常很快)知识是必不可少的。我自己的观点是最初避免使用它以便更好地理解布局管理器,然后一旦你熟悉了管理器,那么一定要根据需要使用它。
  • 更好的是学习和试验布局管理器和边框,玩组件的放置。请记住,您可以嵌套容器(通常是 JPanel),并且可以为每个容器提供自己的布局管理器,从而可以轻松创建和维护复杂的 GUI。

注意

  • (再次)JFrames(实际上是它们的 contentPanes)、JDialogs 和其他顶级窗口默认使用 BorderLayout,JPanels 默认使用 FlowLayout,JScrollPanes 使用它们自己的特殊布局,您可能永远不想使用这种布局,以及大多数其他组件/容器,例如 JComponent、JLabel 等,默认情况下都具有空布局。
  • 最好的资源是教程:课程:在容器中布置组件
  • 边框在这里也很有用,尤其是 EmptyBorder,它可以让您在组件周围放置一个空白缓冲区。
  • 开始使用更简单的布局管理器,FlowLayout、BorderLayout、GridLayout,然后是 BoxLayout,然后再转向更复杂的布局管理器

推荐阅读