Java-无法移动JTextField的位置
我试图在Jframe中创建一个新的JTextField。我想尝试一下文本字段的定位。我尝试使用setBounds和setLocation来更改文本框的位置,但它根本不会更改文本框的位置 这是我的代码: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
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学习,以了解基本原理。