Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 打开一帧的多个实例,并跟踪打开该实例的源_Java_Swing_Jframe_Multiple Instances - Fatal编程技术网

Java 打开一帧的多个实例,并跟踪打开该实例的源

Java 打开一帧的多个实例,并跟踪打开该实例的源,java,swing,jframe,multiple-instances,Java,Swing,Jframe,Multiple Instances,我有一个主窗口JFrame,它包含许多组件,包括一个按钮。当按下按钮时,会打开另一个窗口JFrame,我们称之为客户窗口,用户可以搜索详细信息并在主窗口中显示这些详细信息 有许多窗口类似于主窗口,所有这些主窗口都有自己的客户窗口,用于搜索和显示详细信息 现在,我的问题是,我希望所有主窗口都只有一类customers窗口,而不是每个主窗口都有一类customers窗口。这是因为客户窗口内的所有内容对于所有主窗口都是相同的,除了每个客户窗口打开特定主窗口的详细信息,即为字段设置文本和将数据插入表中等

我有一个主窗口JFrame,它包含许多组件,包括一个按钮。当按下按钮时,会打开另一个窗口JFrame,我们称之为客户窗口,用户可以搜索详细信息并在主窗口中显示这些详细信息

有许多窗口类似于主窗口,所有这些主窗口都有自己的客户窗口,用于搜索和显示详细信息

现在,我的问题是,我希望所有主窗口都只有一类customers窗口,而不是每个主窗口都有一类customers窗口。这是因为客户窗口内的所有内容对于所有主窗口都是相同的,除了每个客户窗口打开特定主窗口的详细信息,即为字段设置文本和将数据插入表中等等。。 这里的问题是当我必须修改某些内容时。。。我还必须对客户窗口的其余部分进行编码,这既浪费时间,也增加了应用程序/重复代码的大小

因此,我想知道一些方法,我可以有一个客户窗口的所有主窗口类,并保持主窗口打开客户窗口的跟踪,以便我可以打开该主窗口中的详细信息。请注意,用户将同时打开多个主窗口,因此需要打开多个客户窗口实例

下面是一些代码,让我现在如何做的想法

现金\销售\客户\窗口:

..... get all the data from database.....

CashSaleInvoice.customerNumberTextField.setText(rs.getString(1));
CashSaleInvoice.customerNameTextField.setText(rs.getString(2));
....and so on....
.....get all the data from database.....

CreditSaleInvoice.customerNumberTextField.setText(rs.getString(1));
CreditSaleInvoice.customerNameTextField.setText(rs.getString(2));
....and so on....
信贷\销售\客户\窗口:

..... get all the data from database.....

CashSaleInvoice.customerNumberTextField.setText(rs.getString(1));
CashSaleInvoice.customerNameTextField.setText(rs.getString(2));
....and so on....
.....get all the data from database.....

CreditSaleInvoice.customerNumberTextField.setText(rs.getString(1));
CreditSaleInvoice.customerNameTextField.setText(rs.getString(2));
....and so on....
节目截图:

主窗口:

现销发票:


任何帮助都将不胜感激

首先,看一看

第二,考虑使用模态对话框,因为这将允许在对话框可见时暂停代码的执行,并在关闭后继续执行。 这允许您提示用户提供详细信息、收集结果并进行处理,而无需设置引用链或回调

请查看以了解更多详细信息

更新


如果不能使用模态对话框,则需要将主框架的引用传递给子框架。就我个人而言,我会首先定义一个接口,描述子框架可以对主窗口执行的允许操作,这样可以解耦实现并防止子框架对主窗口执行它们不应该执行的操作,就像移除所有组件一样…

我可能误解了这个问题,但我过去做过类似的事情。这是我写的代码。这是一个单一的、可复制的JFrame,我扩展了一个JPanel,其原因与我的设计有关

工作原理: 如果您试图打开一个新窗口,而它已经打开,它将接收焦点。如果不是,则会打开一个新窗口。它使用一个标识符变量,可以是任何可以跟踪的东西

如何使用它: 使用静态showPanel方法,以便类确定您是否需要新面板,如下所示:

SingletonDuplicatableFramePanel.showPanel(new SingletonDuplicatableFramePanel(identifier));
请记住,SingletonReplicatableFramePanel是抽象的,所以您需要创建另一个类来扩展它

将类的新实例传递给showPanel

如果它需要新实例,它就会使用它。 如果它不需要新实例,它会将其丢弃注意:新实例的构造函数实际上不应该做任何事情,因为它们可能不需要。 只有在实际创建了新实例时,才会执行抽象方法init。在这里,您可以初始化新窗口所需的任何内容。在init方法的末尾,调用setVisible

如前所述,为了使其可复制,它会跟踪一个唯一标识符,用于确定是否已打开实例。当您运行演示时,应该很清楚

以下是SingletonReplicatableFramePanel的代码:

在Customer字段中键入一个数字,然后单击按钮。您会注意到,无法打开同一客户编号的两个实例。如果您尝试,它只会重新聚焦您试图重新打开的帧,但无法,因为它已打开


谢谢你的意见。我已经看过你提供的链接了。。这就是问题所在。。如果某个对话框被打开,我不想保留整个应用程序,除非它是信息性/警告性或询问性的,在这种情况下,我使用了JDialogs和JOptionPanes。。请查看我现在添加的程序截图的链接。对不起,我想你误解了我的问题。我要寻找的是@ryvantage答案,但我似乎不知道如何打开我已经拥有的框架。你能看一下吗?哇。。我需要一些时间来消化所有这些,检查它是否对我有效,并尽快让你知道。。谢谢你的努力!你能再解释一下我如何打开我自己的Jframes吗 E