【问题标题】:Java - Unable to move position of JTextFieldJava - 无法移动 JTextField 的位置
【发布时间】:2018-05-13 23:47:41
【问题描述】:

我正在尝试在我的 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);     
    } 
}

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

【问题讨论】:

  • “我想玩弄定位”你的意思是务实还是拖拉?看看A Visual Guide to Layout Managers
  • @c0der 务实。
  • 更改布局的正确方法是使用布局管理器。阅读建议的教程。
  • 布局是必须的吗?
  • “布局是必须的吗?” 是的。 Java GUI 必须在不同的操作系统、屏幕尺寸、屏幕分辨率等上使用不同地区的不同PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或 combinations of them 以及 white space 的布局填充和边框。

标签: java swing layout-manager


【解决方案1】:

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

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

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

注意

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

【讨论】:

  • 感谢您的建议,现在我正在尝试根据自己的喜好对 GUI 进行硬编码。考虑到我的情况,使用 GUI 构建器工具(拖放方法)学习会更好吗?
  • @LordJesus:如果您必须维护 GUI,您会发现硬编码位置是最糟糕的解决方案。为什么?每当您想更改组件的位置时,您必须(手动)将一堆更改级联到可能受此更改影响的任何其他组件,这可能很快导致噩梦般的情况。此外,虽然您的 GUI 在您自己的计算机上看起来不错,但如果将其移植到另一台计算机上,您可能会发现未显示组件或未显示文本。只是不要这样做。
  • 好的。那么我应该如何学习GUI呢?我应该学习其他框架,如 JavaFx、AWT 等吗?还是 Swing 是一个好的开始方式?我应该通过硬编码还是使用构建器工具来学习构建 GUI?
  • @LordJesus:我自己,如果我刚开始,我会跳过 Swing 和 AWT 并使用最新的 Java GUI 库 JavaFX。我会避免从构建者开始,而是努力通过和彻底地学习图书馆。
  • JavaFx 更容易吗?是否可以在 JavaFx 中进行硬编码?在开始使用构建器工具之前,我总是想通过硬编码 GUI 来了解基础知识。
【解决方案2】:

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

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

【讨论】:

  • 完全没有效果
  • 或许尝试在 setLocation 之后添加 num1?
  • @178865 不会改变最终结果。此外,当框架中只有一个组件时,您不能期望看到太多。
  • “布局管理器可能会覆盖您的 setLocation()” 确实如此。我建议在发布之前测试您的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
相关资源
最近更新 更多