javafx2 用一个按钮 怎么关闭当前 窗体 类似红叉功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javafx2 用一个按钮 怎么关闭当前 窗体 类似红叉功能相关的知识,希望对你有一定的参考价值。

如题 点击按钮 关闭窗体 我不知道用什么能关闭它!

    Button button = ButtonBuilder.create().text("Close").onAction(new EventHandler<ActionEvent>()
        @Override public void handle(ActionEvent e)
          Event.fireEvent(stage, new WindowEvent(stage, WindowEvent.WINDOW_CLOSE_REQUEST ));
        
      ).build();

参考技术A button.setOnAction(new EventHandler<ActionEvent>()
public void handle(ActionEvent ae)
primaryStage.close();

);

gtk - 用 C 中的按钮关闭窗口窗体

【中文标题】gtk - 用 C 中的按钮关闭窗口窗体【英文标题】:gtk - close window form with button in C 【发布时间】:2012-09-27 01:01:09 【问题描述】:

我有一个带有菜单的主窗口,它可以打开另一个窗口。这个辅助窗口有一个关闭按钮。该按钮已连接单击的信号。我的问题是我不知道如何关闭/销毁该父窗口。我尝试过使用 gtk_widget_destroy,但出现错误,因为窗口不是小部件....我还没有找到任何销毁父窗口的函数....

谁能给我指路,好吗? 提前致谢。

------------------------------------------ ---

好的。我贴一段代码。当我执行程序时,我单击“打开窗口”按钮。使用“关闭”按钮打开一个新窗口。如果我单击“关闭”按钮,我会在终端中收到下一个错误:(Windows:13801): Gtk-CRITICAL **: gtk_widget_destroy: assertion `GTK_IS_WIDGET (widget)' failed

代码是:

#include <stdlib.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>

void open_window(GtkWidget *widget, gpointer window);
void close_window(GtkWidget *widget, gpointer window);

int main( int argc, char *argv[])

    GtkWidget *window;
    GtkWidget *fixed;
    GtkWidget *button;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Windows");
    gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

    fixed = gtk_fixed_new();
    gtk_container_add(GTK_CONTAINER(window), fixed);

    button = gtk_button_new_with_label("Open window");

    gtk_fixed_put(GTK_FIXED(fixed), button, 50, 50);
    gtk_widget_set_size_request(button, 80, 35);

    g_signal_connect(G_OBJECT(button), "clicked",
                     G_CALLBACK(open_window), G_OBJECT(window));

    g_signal_connect_swapped(G_OBJECT(window), "destroy",
                             G_CALLBACK(gtk_main_quit), NULL);

    gtk_widget_show_all(window);

    gtk_main();

    return 0;




void open_window(GtkWidget *widget, gpointer window)

    GtkBuilder *builder;
    GtkWidget *secondWindow = NULL;

    builder = gtk_builder_new ();
    gtk_builder_add_from_file (builder, "secondWindow.glade", NULL);

    secondWindow = GTK_WIDGET (gtk_builder_get_object (builder, "secondWindow"));

    gtk_builder_connect_signals (builder, NULL);

    g_object_unref (G_OBJECT (builder));

    gtk_window_set_modal(GTK_WINDOW(secondWindow), TRUE);
    gtk_widget_show_all(secondWindow);


void close_window(GtkWidget *widget, gpointer window)

    gtk_widget_destroy(GTK_WIDGET(window));

在文件“secondWindow.glade”中定义了一个窗口、一个表格和一个放置在表格中间单元格中的按钮。此外,它还为名为“close_window”的“clicked”事件按钮定义了一个句柄。

如果有人想执行它,请链接到 glade 文件:https://sites.google.com/site/marvalsiteimages/secondWindow.glade

我希望这可以帮助您理解我的问题。 谢谢。

------------------------------------------ -----

基于响应的最终代码:

void open_window(GtkWidget *widget, gpointer window)

    GtkBuilder *builder;
    GtkWidget *secondWindow = NULL;
    GtkWidget *closeButton = NULL;

    builder = gtk_builder_new ();
    gtk_builder_add_from_file (builder, "secondWindow.glade", NULL);

    secondWindow = GTK_WIDGET (gtk_builder_get_object (builder, "secondWindow"));
    closeButton = GTK_WIDGET (gtk_builder_get_object (builder, "closeWindowButton"));

    g_signal_connect (G_OBJECT (closeButton),
                      "clicked",
                      G_CALLBACK (close_window),
                      G_OBJECT (secondWindow)); // here is the magic: the callback will get the window to close

    g_object_unref (G_OBJECT (builder));

    gtk_window_set_modal(GTK_WINDOW(secondWindow), TRUE);
    gtk_widget_show_all(secondWindow);

【问题讨论】:

GtkWindow 是一个 GtkWidget。你可以隐藏它。 从用户体验的角度来看,点击关闭第一个窗口的辅助窗口看起来有点奇怪。你想达到什么目的?可能有更好的方法来做到这一点。请同时指定您的 GTK 版本。 顺便说一下,GtkWindow 上的 gtk_widget_destroy 应该可以工作,因为 GtkWindow 是从 GtkWidget 派生的。请给我们看一些代码。 是关闭按钮的父窗口。所以我想用它的按钮关闭第二个窗口......而不是主...... 那么 gtk_widget_destroy 就是要走的路。请给我们一些代码。 【参考方案1】:

您的问题是第二个窗口的按钮的“单击”信号是从 glade 文件连接的。但是信号处理程序需要一个指向窗口的指针来销毁它。这是通过信号回调的“user_data”参数传递的。

一种方法是将第二个窗口作为 Glade 中的 user_data 参数传递(看看这个Glade tutorial),但该参数应该是一个指针,我不知道怎么做与林间空地。 编辑:只需单击glade 中与此信号关联的用户数据字段,弹出窗口将允许您选择要传递给信号处理程序的对象。只需选择您的“secondWindow”对象。

另一种方法是从 glade 文件中删除信号处理,并从代码中手动连接单击的信号,将指向第二个窗口的指针作为用户数据传递:

void open_window(GtkWidget *widget, gpointer window)

    GtkBuilder *builder;
    GtkWidget *secondWindow = NULL;
    GtkWidget *closeButton = NULL;

    builder = gtk_builder_new ();
    gtk_builder_add_from_file (builder, "secondWindow.glade", NULL);

    secondWindow = GTK_WIDGET (gtk_builder_get_object (builder, "secondWindow"));
    closeButton = GTK_WIDGET (gtk_builder_get_object (builder, "closeWindowButton"));

    g_signal_connect (G_OBJECT (closeButton),
        "clicked",
        G_CALLBACK (close_window),
        G_OBJECT (secondWindow)); // here is the magic: the callback will get the window to close

    g_object_unref (G_OBJECT (builder));

    gtk_window_set_modal(GTK_WINDOW(secondWindow), TRUE);
    gtk_widget_show_all(secondWindow);

【讨论】:

行得通!但是代码有一些小错误。最终代码在最初的问题中。谢谢! 抱歉代码质量差,匆忙写下修改:-/。我根据您的测试修复了它,因此最终答案也出现在此处。您也应该尝试仅空地的方法。只有当您有多个参数要传递时(例如在结构中),您才会受到限制,但它应该在像这样的简单情况下运行良好。

以上是关于javafx2 用一个按钮 怎么关闭当前 窗体 类似红叉功能的主要内容,如果未能解决你的问题,请参考以下文章

用js怎么来判断我已点击了窗体中“关闭”按钮?

vb如何实现只有当前窗体被关闭才能操作其他窗体

WPF中,怎样设置点击按钮关闭当前窗口

vb 释放Webbrowser控件

c# winform如何用一个图片来代替一个窗体的关闭按钮?

winform中 怎样取消关闭窗体事件