英文:
Is there a way to open multiple instances of modeless JDialog in java swing without disabling its components?
问题
我有一个GUI,其中包含一个名为“View”的JLabel:
与其相连的是一个mouseClickEvent。在单击“View”JLabel时,我可以打开多个模式less JDialog实例。
JDialog本身包含几个禁用的JTextFields和一个带有mouseClickEvent的JLabel,充当“Close”按钮:
然而,在打开多个JDialog时,“close”JLabel被禁用,mouseClickEvent不再起作用。
这是我的代码:
private void viewDoctorClickedEvent(java.awt.event.MouseEvent evt)
{
javax.swing.JFrame topFrame = (javax.swing.JFrame)
javax.swing.SwingUtilities.getWindowAncestor(this);
viewDoctorDialog = new javax.swing.JDialog(topFrame, "View Doctor Details", false);
viewDoctorDialog.setMinimumSize(new java.awt.Dimension(580, 350));
viewDoctorDialog.setResizable(false);
viewDoctorDialog.setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);
viewDoctorDialog.setLocationRelativeTo(topFrame);
// This part is used to collect the values from the selected row of a Jtable and set the
// values to the disabled JTextFields in the JDialog
try
{
int selectedTableRow = doctorListTB.getSelectedRow();
String doctorName = doctorListTB.getValueAt(selectedTableRow, 0).toString();
String doctorEmail = doctorListTB.getValueAt(selectedTableRow, 1).toString();
String doctorPassword = doctorListTB.getValueAt(selectedTableRow, 2).toString();
String doctorAddress = doctorListTB.getValueAt(selectedTableRow, 3).toString();
String doctorPhone = doctorListTB.getValueAt(selectedTableRow, 4).toString();
String doctorDepartment = doctorListTB.getValueAt(selectedTableRow, 5).toString();
viewDoctorNameTF.setText(doctorName);
viewDoctorEmailTF.setText(doctorEmail);
viewDoctorPasswordTF.setText(doctorPassword);
viewDoctorAddressTF.setText(doctorAddress);
viewDoctorPhoneTF.setText(doctorPhone);
viewDoctorDepartmentTF.setText(doctorDepartment);
viewDoctorDialog.add(viewDoctorDialogPanel);
viewDoctorDialog.setVisible(true);
}
catch(Exception e)
{
javax.swing.JOptionPane.showMessageDialog(viewDoctorDialogPanel, "Please select a row to view.", "No data to view.", javax.swing.JOptionPane.ERROR_MESSAGE);
}
}
// Mouse Click Event to close the JDialog upon clicking on the "close" JLabel
private void closeViewButtonClickedEvent(java.awt.event.MouseEvent evt)
{
viewDoctorDialog.dispose();
}
有办法在仍保留每个打开的JDialog实例中“close”JLabel的mouseClickEvent的情况下打开多个实例吗?
英文:
I have a GUI which consist of a JLabel named "View":
with a mouseClickEvent attached to it. Upon clicking on the "View" JLabel, i can open multiple instances of a modeless JDialog.
The JDialog itself consist of several disabled JTextFields and a JLabel with a mouseClickEvent attached to it which act as a "Close" button:
However upon opening more than one JDialog, the "close" JLabel is disabled and the mouseClickEvent does not work anymore.
Here is my code:
private void viewDoctorClickedEvent(java.awt.event.MouseEvent evt)
{
javax.swing.JFrame topFrame = (javax.swing.JFrame)
javax.swing.SwingUtilities.getWindowAncestor(this);
viewDoctorDialog = new javax.swing.JDialog(topFrame, "View Doctor Details", false);
viewDoctorDialog.setMinimumSize(new java.awt.Dimension(580, 350));
viewDoctorDialog.setResizable(false);
viewDoctorDialog.setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);
viewDoctorDialog.setLocationRelativeTo(topFrame);
// This part is used to collect the values from the selected row of a Jtable and set the
// values to the disabled JTextFields in the JDialog
try
{
int selectedTableRow = doctorListTB.getSelectedRow();
String doctorName = doctorListTB.getValueAt(selectedTableRow, 0).toString();
String doctorEmail = doctorListTB.getValueAt(selectedTableRow, 1).toString();
String doctorPassword = doctorListTB.getValueAt(selectedTableRow, 2).toString();
String doctorAddress = doctorListTB.getValueAt(selectedTableRow, 3).toString();
String doctorPhone = doctorListTB.getValueAt(selectedTableRow, 4).toString();
String doctorDepartment = doctorListTB.getValueAt(selectedTableRow, 5).toString();
viewDoctorNameTF.setText(doctorName);
viewDoctorEmailTF.setText(doctorEmail);
viewDoctorPasswordTF.setText(doctorPassword);
viewDoctorAddressTF.setText(doctorAddress);
viewDoctorPhoneTF.setText(doctorPhone);
viewDoctorDepartmentTF.setText(doctorDepartment);
viewDoctorDialog.add(viewDoctorDialogPanel);
viewDoctorDialog.setVisible(true);
}
catch(Exception e)
{
javax.swing.JOptionPane.showMessageDialog(viewDoctorDialogPanel, "Please select a row to view.", "No data to view.", javax.swing.JOptionPane.ERROR_MESSAGE);
}
}
// Mouse Click Event to close the JDialog upon clicking on the "close" JLabel
private void closeViewButtonClickedEvent(java.awt.event.MouseEvent evt)
{
viewDoctorDialog.dispose();
}
Is there a way to open multiple instances while still retaining the mouseClickEvent of the "close" JLabel in each opened instance of the JDialog?
答案1
得分: 2
> JDialog本身包含几个禁用的JTextFields和一个附加有mouseClickEvent的JLabel,充当"关闭"按钮。
为什么要使用带有MouseListener的JLabel来关闭对话框?JLabel并不是设计用来进行此类处理的。
对于"关闭"功能,使用带有"ActionListener"的JButton
。
如果您想要按钮看起来像一个标签,可以使用:
button.setBorderPainted(false);
> mouseClickEvent不再起作用。
viewDoctorDialog = new javax.swing.JDialog(topFrame,"查看医生详细信息",false);
在我看来,您有一个实例变量用于跟踪打开的对话框。当您创建第二个对话框时,您更改变量的引用,使其指向第二个对话框,因此您不再有原始对话框的引用。
因此,如上所述,当使用JButton
时,用于"关闭"按钮的ActionListener
中的代码将类似于:
Jbutton button = (JButton)event.getSource();
Window window = SwingUtilities.windowForComponent(button);
window.dispose();
因此,您甚至不需要一个特殊的变量来跟踪对话框。
您的"查看医生详细信息"对话框应该在一个单独的类中定义。该类所需的所有变量都应在该类中定义,而不是显示对话框的主类中。因此,当您创建类的实例时,您将传入JTable。
这将使您更轻松地构造代码,使每个类仅包含与该类相关的ActionListeners。主类将包含显示子对话框的监听器。子对话框将具有用于"关闭"对话框的监听器。
英文:
> The JDialog itself consist of several disabled JTextFields and a JLabel with a mouseClickEvent attached to it which act as a "close" button.
Why would use use a JLabel with a MouseListener to close the dialog? A JLabel was not designed to do processing like this.
Use a JButton
with an ActionListener
for the "Close" functionality.
If you want the button to look like a label then you can use:
button.setBorderPainted( false );
> the mouseClickEvent does not work anymore.
viewDoctorDialog = new javax.swing.JDialog(topFrame, "View Doctor Details", false);
It looks to me like you have an instance variable to track the open dialog. When you create the second dialog, you change the reference of the variable to point to the second dialog so you no longer have a reference to the original dialog.
So when using JButton
, as suggested above, the code in your ActionListener
for the "Close" button would then be something like:
Jbutton button = (JButton)event.getSource();
Window window = SwingUtilities.windowForComponent( button );
window.dispose();
So you don't even need a special variable to track the dialog.
Your "View Doctor Detials" dialog should be defined in a separate class. All the variables needed for that class should be defined in that class, not your main class that displays the dialog. So when you create an instance of the class you would pass in the JTable.
This will make it easier to structure your code so that each class only contains ActionListeners that are relevant to the class. So the main class will contain listeners to display the child dialogs. The child dialogs will have listener to "Close" the dialogs.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论