如何点击按钮弹出新窗口,输入数据后返回并刷新页面?(2)

本文展示了一个使用 ASP.NET WebForm 创建的基本页面示例,其中包括一个表单,用于收集用户输入并进行简单的响应处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WebForm3.aspx

  1. <%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm3.aspx.vb"
  2.  Inherits="ShowModalDialog.WebForm3" %>
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  4. <HTML>
  5.   <HEAD>
  6.    <title>WebForm3</title>
  7.    <meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.0">
  8.    <meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
  9.    <meta name="vs_defaultClientScript" content="JavaScript">
  10.    <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">        
  11.   </HEAD>
  12.   <body MS_POSITIONING="GridLayout" id="MyBody" runat="server">
  13.   <form id="Form1" method="post" runat="server">
  14.    <asp:Label id="Label1" runat="server">请输入您的大名:</asp:Label><br>
  15.    <br>
  16.    <asp:TextBox id="TextBox1" runat="server" Width="558"></asp:TextBox><br>
  17.    <br>
  18.    <asp:Button id="Button1" runat="server" Text=" 提  交 "></asp:Button>
  19.   </form>
  20.   </body>
  21. </HTML>

 WebForm2.aspx.vb

 

  1. Public Class WebForm2
  2.     Inherits System.Web.UI.Page
  3. #Region " Web 窗体设计器生成的代码 "
  4.   '该调用是 Web 窗体设计器所必需的。
  5.   <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
  6.   End Sub
  7.   Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
  8.     'CODEGEN: 此方法调用是 Web 窗体设计器所必需的
  9.     '不要使用代码编辑器修改它。
  10.     InitializeComponent()
  11.   End Sub
  12. #End Region
  13.   Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  14.     '在此处放置初始化页的用户代码
  15.   End Sub
  16. End Class

 

WebForm3.aspx.vb

 

  1. Public Class WebForm3
  2.   Inherits System.Web.UI.Page
  3.   Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox
  4.   Protected WithEvents Label1 As System.Web.UI.WebControls.Label
  5.   Protected WithEvents Button1 As System.Web.UI.WebControls.Button
  6.   Protected MyBody As System.Web.UI.HtmlControls.HtmlControl
  7. #Region " Web 窗体设计器生成的代码 "
  8.   '该调用是 Web 窗体设计器所必需的。
  9.   <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
  10.   End Sub
  11.   Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
  12.     'CODEGEN: 此方法调用是 Web 窗体设计器所必需的
  13.     '不要使用代码编辑器修改它。
  14.     InitializeComponent()
  15.   End Sub
  16. #End Region
  17.   Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  18.     '在此处放置初始化页的用户代码
  19.     If IsPostBack Then
  20.       Dim strScript As String = "<script>" + vbCrLf
  21.       strScript += "window.parent.returnValue='" + TextBox1.Text.Replace("'""/'") + "'" + vbCrLf
  22.       strScript += "window.parent.close()" + vbCrLf
  23.       strScript += "</script>" + vbCrLf
  24.       If (Not IsClientScriptBlockRegistered("clientScript")) Then
  25.         RegisterClientScriptBlock("clientScript", strScript)
  26.       End If
  27.     End If
  28.     If Not IsPostBack Then
  29.       MyBody.Attributes.Add("onload""document.Form1.TextBox1.value=window.parent.dialogArguments")
  30.     End If
  31.   End Sub
  32. End Class

 

 

<think>好的,我现在需要帮用户解决在JavaFX中点击按钮弹出页面,存储数据数据库,关闭子页面刷新主界面的问题。首先,我得理清楚整个流程。 用户的需求分几个步骤:点击按钮打开弹出页面输入数据保存到数据库,关闭弹出页面后,主界面自动查询数据刷新显示。我需要考虑如何实现弹窗、数据存储、以及关闭弹窗后的刷新机制。 首先,弹窗页面通常可以用Stage来实现,作为模态窗口,这样主窗口在弹窗关闭前无法操作。然后,数据存储部分需要数据库操作,比如使用JDBC或者ORM框架,比如Hibernate。不过用户可能希望一个简单的示例,所以先用JDBC示范。 接下来,关闭子页面刷新主界面,这里涉及到窗口间通信。可能的方法包括在子窗口关闭时触发主窗口的刷新方法,或者使用事件监听机制。比如,主窗口监听子窗口的关闭事件,一旦关闭,就执行查询和刷新操作。 另外,JavaFX中的控件布局和事件处理需要正确设置。按钮的事件处理器里创建新的Stage,设置Scene,显示。子窗口可能需要传递主窗口的引用,以便在关闭时调用主窗口的方法。 数据库操作部分需要确保在后台线程执行,避免阻塞UI线程,否则界面会卡顿。JavaFX的Service和Task类可以用来处理后台任务,更新UI则通过Platform.runLater()方法。 现在,我需要把这些步骤整合成一个连贯的示例代码。可能的结构是: 1. 主界面有一个按钮一个TableView用于显示数据2. 点击按钮打开子窗口,输入数据点击保存,将数据插入数据库。 3. 子窗口关闭后,主窗口自动刷新表格数据。 在代码中,主窗口的控制器需要有一个刷新数据的方法,比如refreshTable(),该方法从数据库读取最新数据更新TableView。子窗口的控制器在保存数据后关闭窗口,通知主窗口刷新。 关于窗口间的通信,可以使用回调函数或者传递主控制器实例到子控制器中。例如,当创建子窗口时,将主控制器的引用传递给子控制器,这样在保存数据后,子控制器可以调用主控制器的refreshTable()方法。 还需要处理异常情况,比如数据库连接失败,或者输入数据验证。但用户可能首先需要一个基础实现,后续再考虑优化。 最后,确保代码符合JavaFX的最佳实践,比如使用FXML加载界面,分离逻辑和视图。不过用户可能希望一个简洁的示例,所以可能会用纯代码的方式,或者混合FXML。 总结步骤: 1. 主界面布局,包含按钮和表格。 2. 按钮点击事件打开子窗口。 3. 子窗口输入数据,保存到数据库。 4. 子窗口关闭时触发主界面刷新。 5. 主界面查询数据更新表格。 现在需要将这些写成代码示例,解释每一步的关键点,比如Stage的模态设置,数据库操作,线程处理,以及刷新机制。</think>在JavaFX中实现点击按钮弹出页面存储数据在关闭后刷新主界面,可以按照以下步骤进行: ### 一、实现步骤 1. **主界面搭建** 使用`TableView`展示数据,`Button`触发弹窗操作 2. **弹窗页面创建** 新建`Stage`设置为模态窗口,包含数据输入控件和提交按钮 3. **数据库交互** 使用JDBC实现数据存储功能,建议在独立线程中执行 4. **刷新机制** 通过窗口关闭监听事件触发主界面数据刷新 ### 二、核心代码示例 ```java // 主界面控制器 public class MainController { @FXML private TableView<DataModel> dataTable; // 初始化时加载数据 public void initialize() { refreshTable(); } // 打开弹窗事件 @FXML private void openPopup() throws IOException { FXMLLoader loader = new FXMLLoader(getClass().getResource("popup.fxml")); Parent root = loader.load(); // 获取子控制器设置回调 PopupController popupController = loader.getController(); popupController.setRefreshCallback(this::refreshTable); Stage stage = new Stage(); stage.initModality(Modality.APPLICATION_MODAL); stage.setScene(new Scene(root)); stage.showAndWait(); } // 刷新表格数据 public void refreshTable() { Task<List<DataModel>> task = new Task<>() { @Override protected List<DataModel> call() throws Exception { return DatabaseUtil.queryData(); // 数据库查询方法 } }; task.setOnSucceeded(e -> { dataTable.getItems().setAll(task.getValue()); }); new Thread(task).start(); } } // 弹窗控制器 public class PopupController { private Runnable refreshCallback; public void setRefreshCallback(Runnable callback) { this.refreshCallback = callback; } @FXML private void saveData() { // 创建后台任务 Task<Void> task = new Task<>() { @Override protected Void call() throws Exception { DatabaseUtil.saveData(...); // 数据库存储方法 return null; } }; // 设置成功回调 task.setOnSucceeded(e -> { ((Stage) submitButton.getScene().getWindow()).close(); if(refreshCallback != null) { Platform.runLater(refreshCallback); } }); new Thread(task).start(); } } ``` ### 三、关键技术点 1. **模态窗口** 使用`stage.initModality(Modality.APPLICATION_MODAL)`确保弹窗获得焦点[^2] 2. **线程安全** 数据库操作在`Task`中执行,UI更新通过`Platform.runLater()`实现 3. **回调机制** 通过函数式接口实现子窗口到主窗口的通信 4. **数据绑定** TableView应使用`ObservableList`实现自动刷新 ### 四、数据库工具类示例 ```java public class DatabaseUtil { public static void saveData(DataModel data) throws SQLException { String sql = "INSERT INTO table_name (...) VALUES (...)"; try (Connection conn = DriverManager.getConnection(DB_URL); PreparedStatement pstmt = conn.prepareStatement(sql)) { // 设置参数... pstmt.executeUpdate(); } } public static List<DataModel> queryData() { // 实现查询逻辑... } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值