有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用条件处理模式对话框

我有一个模态jDialog,在使用JOptionPane在另一个对话框中显示错误消息后,当满足特定条件时,我希望处理该模态jDialog。我尝试在JOptionPane对话框之后使用dispose()方法,但我的模式对话框仍然打开。 我的代码的相关部分如下:

    import java.awt.Component;
    import java.sql.*;
    import java.text.SimpleDateFormat;
    import javax.swing.JOptionPane;
    import javax.swing.table.DefaultTableModel;

    public class ReviewPatients extends javax.swing.JDialog {

    public ReviewPatients(java.awt.Frame parent, boolean modal) {
    super(parent, modal);

    jScrollPane1 = new javax.swing.JScrollPane();
    jTable1 = new javax.swing.JTable();

    setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

    jTable1.setModel(new javax.swing.table.DefaultTableModel(
        new Object [][] {

        },
        new String [] {
            "Name", "Address", "Number"
        }
    ) {
        Class[] types = new Class [] {
java.lang.String.class, java.lang.String.class, java.lang.Integer.class
        };
        boolean[] canEdit = new boolean [] {
            false, false, false
        };

        public Class getColumnClass(int columnIndex) {
            return types [columnIndex];
        }

        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return canEdit [columnIndex];
        }
    });
    jScrollPane1.setViewportView(jTable1);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 1012, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(0, 0, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 526, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(0, 0, Short.MAX_VALUE))
    );

    pack();


    jScrollPane1.setVisible(false);

e: 
{    
           try
            {
            Class.forName("com.mysql.jdbc.Driver");
            Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3307/doctor","root","Pranav123");
            String query="SELECT * FROM records_table WHERE Name LIKE 'some_name';";
            Statement st = con.createStatement();
            ResultSet rs= st.executeQuery(query);



            DefaultTableModel tmodel = (DefaultTableModel) jTable1.getModel();

                //Clearing the table
                int rows=tmodel.getRowCount();
                while(rows>0)
                {
                    tmodel.removeRow(0);
                    rows--;
                }
                jTable1.setModel(tmodel);

            while(rs.next())
            {

                //Putting data into table
                tmodel.addRow(new Object[] {rs.getString(1),rs.getString(2),rs.getInt(4)});
                jTable1.setModel(tmodel);
            }

            }
            catch(Exception e)
            {
                System.out.println("Error: "+e);
            }

        if(jTable1.getRowCount()==0)
            {
                JOptionPane.showMessageDialog(this, "No records exist!");
                dispose();
                break e;
            }



         //Showing data   
        jScrollPane1.setVisible(true);


}    

public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            ReviewPatients dialog = new ReviewPatients(new javax.swing.JFrame(), true);
            dialog.setVisible(true);
        }
    });
}

e是每当发生错误时我用来退出块的标签。 任何帮助都将不胜感激


共 (2) 个答案

  1. # 1 楼答案

    JOptionPane中的所有静态方法都会创建模式对话框,即代码的执行会停止,直到用户解除对话框。如果要创建非模态对话框,请直接使用JDialog。有关更多信息,请参阅Java Swing Tutorial

    更新:

    如果我没有错的话,您试图做的就是在没有记录的情况下,不显示ReviewPatients对话框。如果是这种情况,最简单的解决方案就是用System.exit(1)替换dispose()

    更好的解决方案是检查数据库中是否有记录,以及:

    • 如果有记录,创建ReviewPatients对话框并用数据填充表
    • 如果没有记录,则显示JOptionPane通知用户没有记录,并终止程序

    另请注意:尽管允许,但尽量不要将AWT组件与Swing组件混合使用(请参阅another Stack Overflow answer for the reasons

  2. # 2 楼答案

    我发现了一些问题,其中一些可能与此相关:

    • setModel()的重复调用是不必要的,可能会意外地通知侦听表

    • 清除DefaultTableModel的更简单方法是通过setRowCount(0)

    • 与其检查视图是否成功,不如检查模型;更好的是,只需在异常处理程序中显示JOptionPane

    • 对话框的父级可能应该是JFrame

    • 还考虑使用^{}更新表的模型。

    经测试:

    import java.sql.*;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableModel;
    
    /**
     * @see http://stackoverflow.com/a/24220593/230513
     */
    public class ReviewPatients extends javax.swing.JDialog {
    
        public ReviewPatients(JFrame parent, boolean modal) {
            super(parent, modal);
            this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            JTable table = new JTable();
            table.setModel(new DefaultTableModel(
                new Object[][]{},
                new String[]{
                    "Name", "Address", "Number"
                }
            ) {
                Class[] types = new Class[]{
                    java.lang.String.class, java.lang.String.class, java.lang.Integer.class
                };
                boolean[] canEdit = new boolean[]{
                    false, false, false
                };
    
                @Override
                public Class getColumnClass(int columnIndex) {
                    return types[columnIndex];
                }
    
                @Override
                public boolean isCellEditable(int rowIndex, int columnIndex) {
                    return canEdit[columnIndex];
                }
            });
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addComponent(table, javax.swing.GroupLayout.PREFERRED_SIZE, 800, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGap(0, 0, Short.MAX_VALUE))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addComponent(table, javax.swing.GroupLayout.PREFERRED_SIZE, 400, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGap(0, 0, Short.MAX_VALUE))
            );
    
            pack();
            this.setLocationRelativeTo(null);
    
            try {
                Class.forName("org.h2.Driver");
                Connection con = DriverManager.getConnection("jdbc:h2:file:~/src/java/jdbc/test;IFEXISTS=TRUE", "sa", "");
                String query = "SELECT * FROM CUSTOMER;";
                Statement st = con.createStatement();
                ResultSet rs = st.executeQuery(query);
                DefaultTableModel model = (DefaultTableModel) table.getModel();
                model.setRowCount(0);
                while (rs.next()) {
                    model.addRow(new Object[]{rs.getInt(1), rs.getString(2), rs.getString(3)});
                }
    
            } catch (Exception e) {
                System.out.println("Error: " + e);
                JOptionPane.showMessageDialog(null, "No records exist!");
            }
            this.setVisible(true);
        }
    
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    JFrame f = new JFrame();
                    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    f.pack();
                    f.setVisible(true);
                    ReviewPatients dialog = new ReviewPatients(f, true);
                }
            });
        }
    }