有没有办法在 java swing 中打开多个无模式 JDialog 实例而不禁用其组件?
Is there a way to open multiple instances of modeless JDialog in java swing without disabling its components?
我有一个 GUI,它由一个名为“View”的 JLabel 组成:
附加了 mouseClickEvent。单击“查看”JLabel 后,我可以打开无模式 JDialog 的多个实例。
JDialog 本身由几个禁用的 JTextField 和一个附加了 mouseClickEvent 的 JLabel 组成,充当“关闭”按钮:
但是在打开多个 JDialog 时,“关闭”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 实例中保留“关闭”JLabel 的 mouseClickEvent?
The JDialog itself consist of several disabled JTextFields and a JLabel with a mouseClickEvent attached to it which act as a "close" button.
为什么要使用带有 MouseListener 的 JLabel 来关闭对话框? JLabel 并非设计用于进行这样的处理。
使用 JButton
和 ActionListener
来实现“关闭”功能。
如果你想让按钮看起来像一个标签,那么你可以使用:
button.setBorderPainted( false );
the mouseClickEvent does not work anymore.
viewDoctorDialog = new javax.swing.JDialog(topFrame, "View Doctor Details", false);
在我看来你有一个实例变量来跟踪打开的对话框。当您创建第二个对话框时,您将变量的引用更改为指向第二个对话框,因此您不再具有对原始对话框的引用。
因此,当使用 JButton
时,如上所述,您 ActionListener
中“关闭”按钮的代码将类似于:
Jbutton button = (JButton)event.getSource();
Window window = SwingUtilities.windowForComponent( button );
window.dispose();
因此您甚至不需要特殊变量来跟踪对话。
您的“查看医生详细信息”对话框应在单独的 class 中定义。 class 所需的所有变量都应在 class 中定义,而不是显示对话框的主要 class。因此,当您创建 class 的实例时,您将传入 JTable。
这样可以更轻松地构建代码,使每个 class 仅包含与 class 相关的 ActionListener。所以主要 class 将包含监听器来显示子对话框。子对话框将有监听器以“关闭”对话框。
我有一个 GUI,它由一个名为“View”的 JLabel 组成:
附加了 mouseClickEvent。单击“查看”JLabel 后,我可以打开无模式 JDialog 的多个实例。
JDialog 本身由几个禁用的 JTextField 和一个附加了 mouseClickEvent 的 JLabel 组成,充当“关闭”按钮:
但是在打开多个 JDialog 时,“关闭”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 实例中保留“关闭”JLabel 的 mouseClickEvent?
The JDialog itself consist of several disabled JTextFields and a JLabel with a mouseClickEvent attached to it which act as a "close" button.
为什么要使用带有 MouseListener 的 JLabel 来关闭对话框? JLabel 并非设计用于进行这样的处理。
使用 JButton
和 ActionListener
来实现“关闭”功能。
如果你想让按钮看起来像一个标签,那么你可以使用:
button.setBorderPainted( false );
the mouseClickEvent does not work anymore.
viewDoctorDialog = new javax.swing.JDialog(topFrame, "View Doctor Details", false);
在我看来你有一个实例变量来跟踪打开的对话框。当您创建第二个对话框时,您将变量的引用更改为指向第二个对话框,因此您不再具有对原始对话框的引用。
因此,当使用 JButton
时,如上所述,您 ActionListener
中“关闭”按钮的代码将类似于:
Jbutton button = (JButton)event.getSource();
Window window = SwingUtilities.windowForComponent( button );
window.dispose();
因此您甚至不需要特殊变量来跟踪对话。
您的“查看医生详细信息”对话框应在单独的 class 中定义。 class 所需的所有变量都应在 class 中定义,而不是显示对话框的主要 class。因此,当您创建 class 的实例时,您将传入 JTable。
这样可以更轻松地构建代码,使每个 class 仅包含与 class 相关的 ActionListener。所以主要 class 将包含监听器来显示子对话框。子对话框将有监听器以“关闭”对话框。