【问题标题】:How can I create and dispose of my forms created with IntelliJ's GUI builder如何创建和处置使用 IntelliJ 的 GUI 构建器创建的表单
【发布时间】:2018-04-09 20:35:38
【问题描述】:

我使用 IntelliJ 的 GUI 构建器创建了一个表单,它有一个有效的 main() 方法,该表单可以正常工作并附加了一些侦听器。

除此之外,我还有一个自定义类,我想在其中调用我使用 IntelliJ 的 GUI 构建器创建的 GUI。我可以通过复制 GUI 类中的“main”方法中的代码并将其放置在我的自定义类中来完成此操作,如果我运行我的自定义类,则确实会显示表单。

但这就是我对创建的 GUI 所能做的所有事情,我只能调用它。我不能做其他事情,比如处理那个 GUI 表单实例 (frame.dispose()) 并打开另一个表单,因为我不知道如何从我的自定义类访问框架实例。

有人可以帮我解决这个问题吗?我认为如果我使用 GUI 构建器而不是从头开始为多个表单编写 GUI 代码,这将节省我很多时间。

【问题讨论】:

  • 1) 见The Use of Multiple JFrames, Good/Bad Practice? 2) “我认为如果我使用 GUI 构建器而不是从头开始为多个表单编写 GUI 代码,这会节省我很多时间。” .. 这很有趣!除非您了解如何使用 Java 代码(而非 GUI 构建器)编写 GUI,否则“自动”工具只会减慢一切。
  • @AndrewThompson 是的,我了解如何在 Java 代码中创建 GUI,并且已经做过很多次了。我决定在我正在处理的这个特定项目上第一次尝试 IntelliJ 的 GUI 构建器。使用 GUI 构建器是一个愉快而快速的过程,但正如 IntelliJ 团队所述,它有其局限性。

标签: java swing intellij-idea gui-builder


【解决方案1】:

我通过在 GUI 表单类中创建一个名为 load() 的方法解决了这个问题,其中包含 JFrame 设置

GUI 表单类

public void load()
{
    JFrame frame = new JFrame( "Login Form" );
    frame.setContentPane( new LoginForm().mainPanel );
    frame.setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE );
    frame.pack();
    frame.setLocationRelativeTo( null );
    frame.setVisible( true );
}

然后在我的主课中我用new LoginForm().load(); 调用它。

为了处理初始 GUI 表单并打开另一个表单,我在 GUI 表单类 中创建了一个辅助方法,名为 getMainFrame()

private JFrame getMainFrame()
{
    return (JFrame) SwingUtilities.getWindowAncestor( this.mainPanel );
}

之后,在 GUI 表单类构造函数中,有一个逻辑可以在满足条件时处理框架

if (age.equals("42"))
{
    //load the appropriate form
    new MainForm().load();

    //dispose of this current form
    this.getMainFrame().dispose();
}

【讨论】:

  • 我非常感谢您写得很清楚的答案,但它并没有解决我的问题。通过您的回答,我能够显示和处置框架,但这只能从我的程序入口点进行,我想从嵌入在 GUI 表单类中的逻辑中处置框架。
  • 为什么不将JFrame 实例作为构造函数参数传递给GUI 表单类?这将使disposeJFrame 在 GUI 表单类中成为可能。
【解决方案2】:

首先,为您的根面板命名:

然后为它创建一个getter,你可以在JFrame by 中使用它

JFrame f = new JFrame();
f.add(new YourGuiClass().getMainPanel());
f.setVisible(true);

当你想处置它时,处置JFrame 实例应该可以工作。

编辑

你说你想disposeJFrame在你的GUI表单类逻辑中,试试这个:

class YourGuiClass {
    private JFrame f = new JFrame();
    private JPanel mainPanel;

    public void load() {
       f.add(mainPanel);
       f.setVisible(true);
    }

    public void dispose() {
       f.dispose();
    }
}

这样你就可以在不了解主函数中任何Swing相关内容的情况下操作GUI表单类:

public static void main(String... args) {
   YourGuiClass myGuiClass = new YourGuiClass();
   myGuiClass.load(); // it now shows itself
   if (someLogic()) myGuiClass.dispose(); // you can
   // also call this elsewhere as you like
}

【讨论】:

    猜你喜欢
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多