Java-无法移动JTextField的位置

Java-无法移动JTextField的位置,java,swing,layout-manager,Java,Swing,Layout Manager,我试图在Jframe中创建一个新的JTextField。我想尝试一下文本字段的定位。我尝试使用setBounds和setLocation来更改文本框的位置,但它根本不会更改文本框的位置 这是我的代码: public class GUI_Tutorial extends JFrame { public static void main(String[] args) { GUI_Tutorial frame = new GUI_Tutorial(); fr

我试图在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);     
    } 
}

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

尝试删除
frame.setLayout(newflowlayout())。然后需要使用
num1.setBounds(x,y,width,height)
而不是
setLocation()


但是,正如其他用户所指出的,您应该使用布局管理器。仔细阅读并为您的GUI选择最佳的布局管理器。

您的问题在于布局管理器。将组件添加到容器中时,布局管理器将指示组件的位置。默认情况下,JFrame的contentPane(保存其组件的JFrame子容器)使用BorderLayout,以默认方式添加到此容器的项目将填充容器的中心部分,如果没有其他内容添加到其他BorderLayout位置,则将完全填充容器

放置项目的可能解决方案:

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

  • (同样)JFrames(实际上是它们的contentPanes)、JDialogs和其他顶级窗口默认使用BorderLayout,JPanel默认使用FlowLayout,JScrollPanes使用它们自己的专业布局,一个您可能永远不想弄脏的布局,以及大多数其他组件/容器,如JComponent、JLabel等等,。。。默认为空布局
  • 最佳资源是教程:
  • 边框在这里也很有用,尤其是EmptyBorder,它允许您在组件周围放置一个空白缓冲区
  • 开始使用更简单的布局管理器,FlowLayout、BorderLayout、GridLayout,然后是BoxLayout,然后再转到更复杂的布局

“我想摆弄一下定位”您是指实用还是拖动?实用地查看@c0der。更改布局的正确方法是使用布局管理器。阅读建议的教程。布局是必要的吗?“布局是必要的吗?”是的。Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作,在不同的地区使用不同的PLAF。因此,它们不利于像素完美布局。使用布局管理器,或者与布局填充和边框一起使用。完全没有效果。也许可以尝试在setLocation之后添加num1?@178865它不会更改最终结果。此外,当框架中只有一个组件时,您也不能期望看到太多内容。“布局管理器可能正在覆盖您的setLocation()”它确实存在。我建议在发布之前测试一下你的答案。谢谢你的建议,现在我正在尝试根据我的喜好对GUI进行硬编码。考虑到我的情况,仅仅学习GUI构建工具(拖放方法)是否更好?@LordJesus:如果你必须维护GUI,你会发现硬编码位置是最糟糕的解决方案。为什么?每当您想要更改组件的位置时,您必须(手动)将一系列更改级联到可能受此更改影响的任何其他组件,这可能会很快导致噩梦般的情况。此外,虽然您的GUI在您自己的计算机上看起来不错,但如果将其移植到另一台计算机上,您可能会发现未显示组件或未显示文本。别这样,好吧。那么我应该如何学习GUI呢?我是否应该学习其他框架,如JavaFx、AWT等?还是挥杆是一个好的开始方式?我应该学习通过硬编码或使用构建工具构建GUI吗?@LordJesus:我自己,如果我刚开始,我会跳过Swing和AWT,使用最新的Java GUI库JavaFX。我会从一开始就避免使用构建器,而是努力学习整个库。JavaFx更容易吗?可以用JavaFx硬编码吗?在开始使用构建工具之前,我一直希望通过硬代码GUI学习,以了解基本原理。