java - 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);
}
}
我可以知道我做错了什么吗?
解决方案
您的问题是布局管理器之一。当您将组件添加到容器时,布局管理器将指示组件的去向。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,然后再转向更复杂的布局管理器
推荐阅读
- java - 需要 Java JUnit 测试指南
- python - 如何使用多处理从多个函数中获取返回的数据
- r - 如何将 geom_density 和 geom_histogram 放在相同的计数范围内
- sql - 如何平均每个 SQL 组中的前 n 个
- python - 如何在使用自定义用户模型时修复 django admin 中的“无法解压不可迭代的 NoneType 对象”错误
- java - 如何使用springboot在json对象中表示日历日期
- javascript - JavaScript 中二次函数的大 O 时间效率
- r - 按组连接
- c# - 用dependencyinjection替换autofac后根本没有调用asp.net核心控制器构造函数
- javascript - 将特定的 JS 对象值附加到它被点击的 div