【问题标题】:JFrame cannot find 'pack' methodJFrame 找不到“打包”方法
【发布时间】:2011-11-03 23:34:54
【问题描述】:

我正在学习一个开始的 Java 类,并且一项作业要求我编写一个类来表示一个 JPanel,该 JPanel 带有用于递增和递减值的按钮以及用于显示该值的标签。然后,我必须创建一个单独的类来实例化面板并将其添加到框架中。我试图通过运行 pack 方法调整框架大小以适应面板的大小。我尝试使用以下方法调用框架的打包方法:

SwingUtilities.getAncestorOfClass(JFrame.class, this).pack()

我收到“找不到符号 - 方法 pack()”错误。 getAncestorOfClass 肯定返回一个 JFrame,它是正确的 JFrame。当我从创建 JFrame 的驱动程序类内部运行 pack 方法时,没有问题。任何想法为什么它找不到打包方法?是因为我试图从一个单独的类文件中运行它吗?我也无法访问其他一些 JFrame 方法,例如 getContentPane,但我am 能够访问其他一些方法,例如 add。嗯?

【问题讨论】:

  • 你为什么不直接打电话给jframe.pack ();
  • 就像我说的,我正在为一个类做这个,这个任务要求我创建一个单独的类来代表 JPanel。我不能简单地引用 JFrame,因为它没有在我需要调用 pack 方法的类中定义。
  • 您确定不必在 JPanel 上调用 pack 吗?你写了Then, I have to create a separate class which instantiates the panel and adds it to a frame.,所以我想,你可以在那里打电话给pack
  • JPanel 没有pack 方法,我的面板类扩展了JPanel。

标签: java swing user-interface jframe


【解决方案1】:

方法SwingUtilities.getAncestorOfClass 返回一个Container。现在,你知道Container 真的会是一个JFrame,但编译器不是。而且 Java 是一种静态语言,而不是一种动态语言,它只会尝试调用方法,而不管类是否声明它。

由于Container 没有打包方法,编译器会抱怨。您需要转换为 JFrame 才能使其工作:

((JFrame)SwingUtilities.getAncestorOfClass(JFrame.class, this)).pack();

不过要小心……如果找不到合适的祖先,该方法可能会返回 null。您可能需要先检查一下。

【讨论】:

  • 谢谢,我不知道编译器是这样工作的。我将添加一个异常处理程序来处理“null”问题。
  • 它与 Ruby 不同。该语言是解释的,因此没有预先进行静态检查来让您知道您可以调用和不能调用什么。如果你碰巧调用了一个不存在的方法,那么运气不好。当然,这确实开辟了关于运行时扩展和duck typing 的各种可能性。由于 Java 编译器看到返回类型 Container 并且它没有 pack,它会抱怨。但是,将其转换为 JFrame,一切都很好。除非您尝试强制转换不是 JFrame 的东西,否则您会在运行时遇到异常。
  • 我真正使用过的唯一其他语言是 Python —— 我被它的打字规则宠坏了:P
【解决方案2】:

您需要将其转换为 JFrame:

((JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, this)).pack();

【讨论】:

  • 啊,getAncestorOfClass返回一个通用Container,不管我要找什么类型,谢谢!我只是从这里开始;当我自己有一些声誉时,我会回来投票给你的答案:)
【解决方案3】:

SwingUtilities.getAncestorOfClass(Class, Component) 方法返回一个组件,而不是一个 JFrame。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-03
    • 2021-10-26
    • 2013-12-18
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2014-09-02
    相关资源
    最近更新 更多