利用回调获取自拟定Dialog的返回值

2023-11-17

        这里要讲的是如何利用回调获取自拟定DiaLog的返回值,首先看下问题的背景。我们经常会用到Dialog,系统提供了一些常用的Dialog,可以参考这篇博客 点击打开链接 。那其中一个常用Dialog做讲解,
<span style="font-size:14px;">String returnString = JOptionPane.showInputDialog("title");</span>
当执行到这条语句时,将弹出一个对话框,程序被阻塞,直到Dialog被关闭,返回retrunString。但很多情况下并不够用,所以我们通常会自拟定自己的Dialog。可是如何从Dialog返回值到主窗口这是问题了,有些人可能会把MyDialog设置为内部类,这样容易导致代码重复和臃肿。所以这里将MyDialog设置为单独类,利用回调返回MyDialog中填入的值。关于回调的讲解,这里有篇博客讲的很通俗,值得大家看下,xiaanming的博客点击打开链接
       以下是自己码的实例代码:
回调的接口:
public interface DialogListener {
	public void getInputString(String inputString);
}
MyDialog类:
public class MyDialog extends JDialog {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JButton comfirmBtn;
	private JButton cancelBtn;
	private JTextField inputField;
	private DialogListener dialogListener;
	
	public MyDialog(String title){
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		this.setSize(screenSize.width/4, screenSize.height/4);
		this.setLocation(3*screenSize.width/8, 3*screenSize.height/8);
		
		JPanel mainPanel = new JPanel(new GridLayout(4,1, 10,10));

		JLabel label = new JLabel(title);
		label.setFont(new Font("宋体", Font.BOLD ,30));
		inputField = new JTextField();
		inputField.setFont(new Font("宋体", Font.BOLD ,30));
		JPanel btnPanel = new JPanel(new GridLayout(1,2,20,20));
		comfirmBtn = new JButton("确认");
		cancelBtn = new JButton("取消");
		comfirmBtn.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				//调用回调函数返回Dialog输入的内容
				dialogListener.getInputString(inputField.getText());
			}
		});
		
		cancelBtn.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				dialogListener.getInputString("");
			}
		});
		btnPanel.add(comfirmBtn);
		btnPanel.add(cancelBtn);
		
		mainPanel.add(label);
		mainPanel.add(inputField);
		mainPanel.add(btnPanel);
		this.getContentPane().add(mainPanel);
		this.setVisible(true);
		this.setAlwaysOnTop(true);
	}
	
	public void setOnDialogListener(DialogListener listener){
		this.dialogListener = listener;//将Main的实例传递过来
	}
}
Main类:
public class Main extends JFrame implements DialogListener{
	private JLabel label;
	private JButton btn;
	private MyDialog dialog;
	public Main(){
		JPanel panel = new JPanel();
		btn = new JButton("对话窗口");
		btn.setFont(new Font("宋体", Font.BOLD ,30));
		label = new JLabel();
		label.setFont(new Font("宋体", Font.BOLD ,30));
		panel.add(btn);
		panel.add(label);
		
		btn.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				
				//String str = JOptionPane.showInputDialog("title");
				//label.setText(str);
				
				dialog = new MyDialog("title");
				dialog.setOnDialogListener(Main.this);
				//此时不会阻塞,将继续执行下面语句
				System.out.println("continue");
				
			}
		});
		this.getContentPane().add(panel);
		this.setSize(600,600);
		this.setVisible(true);
	}

	@Override
	public void getInputString(String returnString){
		//重载回调函数
		label.setText(returnString);
		dialog.dispose();
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Main main = new Main();
	}
}
Main这里实现接口,重载回调函数可以参考设置JButton的监听。如上是一种方式,还有通过如下方式实现Main:
public class Main extends JFrame {
	private JLabel label;
	private JButton btn;
	private MyDialog dialog;
	public Main(){
		JPanel panel = new JPanel();
		btn = new JButton("对话窗口");
		btn.setFont(new Font("宋体", Font.BOLD ,30));
		label = new JLabel();
		label.setFont(new Font("宋体", Font.BOLD ,30));
		panel.add(btn);
		panel.add(label);
		
		btn.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				
				//String str = JOptionPane.showInputDialog("title");
				//label.setText(str);
				
				dialog = new MyDialog("title");
				dialog.setOnDialogListener(new DialogListener(){
					@Override
					public void getInputString(String returnString){
						//重载回调函数
						label.setText(returnString);
						dialog.dispose();
					}
				});
				//此时不会阻塞,将继续执行下面语句
				System.out.println("continue");
				
			}
		});
		this.getContentPane().add(panel);
		this.setSize(600,600);
		this.setVisible(true);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Main main = new Main();
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用回调获取自拟定Dialog的返回值 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的

随机推荐

  • 面试逻辑题

    逻辑题目 逻辑题目现在也是面试中常考的题目 也不清楚面试出这种题目的意义 可能就是考察面试人员是否逻辑清晰 这种题目没有什么好的方法 除非你见过原题 否则 只能根据所给出的条件慢慢分析 尽量不要用常规思路 希望大家要跳跃思维 如果实在不行就
  • 二进制安装kubernetes三主三从高可用集群

    本文基于Kubernetes1 19版本 以二进制文件方式对如何配置 部署一个启用了安全机制 3节点高可用的Kubernetes集群进行说明 对于测试环境 可以适当进行简化 将某些组件部署为单点 一 k8s高可用集群架构 在正式的环境中应确
  • 数据库的数据备份和数据恢复MySQL

    一 数据的备份 在未登录MySQL的状态下输入下列代码 格式如下 mysqldump uusername p gt d db sql 例如 我的用户名为root 我将备份文件放到d盘目录下 将文件取名为db sql 需要注意两个地方 1 p
  • TIME_WAIT机理

    注 本文系转载 尊重原作者原文链接 TIME WAIT状态原理 通信双方建立TCP连接后 主动关闭连接的一方就会进入TIME WAIT状态 客户端主动关闭连接时 会发送最后一个ack后 然后会进入TIME WAIT状态 再停留2个MSL时间
  • H5+css+js的商品放大镜效果

  • vCenter Server安装报错:内存或cpu不足

    vCenter Server安装报错 内存或cpu不足 前言 在安装vCenter Server7 0时报错 Not enough memory in target host EXSI7 0安装在VMware workstation里面 配
  • 解决用steam客户端购买游戏验证登录信息失败的方法

    用steam客户端购买游戏或者订阅Mod的时候会弹出 正在验证登录信息 的界面 然后登陆失败 尽管你已经登陆了steam 但是好像没有登陆到steam服务器上 你就算是重新登录 翻墙 使用steamcommunity插件 使用加速器 电脑杀
  • HJ28 素数伴侣【python3】

    题目描述 若两个正整数的和为素数 则这两个正整数称之为 素数伴侣 如2和5 6和13 它们能应用于通信加密 现在密码学会请你设计一个程序 从已有的 N N 为偶数 个正整数中挑选出若干对组成 素数伴侣 挑选方案多种多样 例如有4个正整数 2
  • 重启kibana的脚本

    2019独角兽企业重金招聘Python工程师标准 gt gt gt bin bash echo e 033 31m stop kibana by 5601 Now 033 0m ps ef netstat anp grep 5601 awk
  • 【Java笔记】Java8中数组(引用类型)、String、List、Set之间的相互转换问题

    数组 String List Set之间的相互转换问题 如果觉得对你有帮助 能否点个赞或关个注 以示鼓励笔者呢 博客目录 先点这里 本博主要是相理清楚一些转换的逻辑 顺便总结一下贴出来 这里是把一些可以JDK自带的使用方法写出了 不代表没有
  • 解析js面试题(上)

    注 本篇博客的题目出自于博主 小平果118博客 题目地址 http blog csdn net i10630226 article details 49765737 由于该博客并没有抛出来来答案和解析 我在这里以自己的理解来做一下这些题目
  • MicroBlaze系列教程(3):AXI_TIMER的使用

    文章目录 toc AXI TIMER简介 常用函数 使用示例 参考资料 工程下载 本文是Xilinx MicroBlaze系列教程的第3篇文章 AXI TIMER简介 AXI TIMER支持两路可编程32位计数器 可以配置为中断 捕获 PW
  • LoadRunner下载和安装

    文章目录 一 下载地址 二 安装步骤 三 安装过程中遇到的问题 一 下载地址 官方下载地址 https my microfocus com myproducts 网盘下载地址 https pan baidu com s 1hiGC9FjfK
  • cudnn下载与安装

    cudnn的安装 cudnn的安装非常简单 1 下载安装文件 按需求下载cudnn的安装文件 https developer nvidia com rdp cudnn archive 需要注册账号 2 安装cudnn 解压下载的文件 可以看
  • 搭建完整的arm-linux-gcc等交叉编译环境

    搭建完整的arm linux gcc等交叉编译环境 链接 https www cnblogs com uestc mm p 6656325 html 安装环境 Linux版本 Ubuntu 12 04 内核版本 Linux 3 5 0 交叉
  • Android AutoLayout集成使用

    转载自楊帥简书 https www jianshu com p da5d5d4d0901 由于Android屏幕尺寸众多的情况 Android适配一直是个问题 谷歌推出了百分比布局 本人有使用 但是百分比布局在部分时候适配并不是那么完美 偶
  • docker(六)数据挂载之数据卷

    docker容器运行时 是有一个可写入层的 如果我们把容器运行时的数据写在可写入层 会有以下问题 当容器停止运行时 写入的数据会丢失 你也很难将这些数据从容器中取出来给另外的应用程序使用 容器的可写入层与宿主机是紧密耦合的 这些写入的数据在
  • 指针的进阶【下篇】

    文章目录 8 指向函数指针数组的指针 9 回调函数 8 指向函数指针数组的指针 请看代码与注释 int Add int x int y return x y int Sub int x int y return x y int main i
  • Ubuntu22.04.1 Server版本 配置C++开发环境----笔记

    远程ssh 没记错在安装 server版的时候是可以选的 如果没有就执行安装命令 sudo install openssh server y 下载完成后配置端口22 vim etc ssh ssh config 重启ssh sudo ser
  • 利用回调获取自拟定Dialog的返回值

    这里要讲的是如何利用回调获取自拟定DiaLog的返回值 首先看下问题的背景 我们经常会用到Dialog 系统提供了一些常用的Dialog 可以参考这篇博客 点击打开链接 那其中一个常用Dialog做讲解 span style font si