有没有一种方法可以在javaswing中打开多个无模式jdialog示例而不禁用其组件?

fv2wmkja  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(307)

我有一个gui,它由一个名为“view”的jlabel组成:

上面有一个鼠标点击器。单击“视图”jlabel后,我可以打开无模式jdialog的多个示例。
jdialog本身由几个禁用的jtextfields和一个jlabel组成,jlabel附带一个mouseclickevent,充当“关闭”按钮:

但是,在打开多个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?

tzcvj98z

tzcvj98z1#

jdialog本身由几个禁用的jtextfields和一个jlabel组成,jlabel附带一个mouseclickevent,充当“关闭”按钮。
为什么要使用带有鼠标侦听器的jlabel来关闭对话框?jlabel不是设计用来做这样的处理的。
使用 JButton 带着一个 ActionListener “关闭”功能。
如果希望按钮看起来像标签,则可以使用:

button.setBorderPainted( false );

mouseclickevent不再工作了。

viewDoctorDialog = new javax.swing.JDialog(topFrame, "View Doctor Details", false);

在我看来,您有一个示例变量来跟踪打开的对话框。创建第二个对话框时,将变量的引用更改为指向第二个对话框,这样就不再有对原始对话框的引用。
所以当使用 JButton ,如上所述 ActionListener 因为“关闭”按钮类似于:

Jbutton button = (JButton)event.getSource();
Window window = SwingUtilities.windowForComponent( button );
window.dispose();

所以你甚至不需要一个特殊的变量来跟踪对话框。
“查看医生详细信息”对话框应该在单独的类中定义。该类所需的所有变量都应该在该类中定义,而不是在显示对话框的主类中定义。因此,当您创建类的示例时,您将传入jtable。
这样可以更容易地构造代码,使每个类只包含与该类相关的ActionListener。因此,主类将包含侦听器以显示子对话框。子对话框将有侦听器“关闭”对话框。

相关问题