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是每当发生错误时我用来退出块的标签。 任何帮助都将不胜感激
# 1 楼答案
JOptionPane中的所有静态方法都会创建模式对话框,即代码的执行会停止,直到用户解除对话框。如果要创建非模态对话框,请直接使用JDialog。有关更多信息,请参阅Java Swing Tutorial
更新:
如果我没有错的话,您试图做的就是在没有记录的情况下,不显示
ReviewPatients
对话框。如果是这种情况,最简单的解决方案就是用System.exit(1)
替换dispose()
更好的解决方案是检查数据库中是否有记录,以及:
ReviewPatients
对话框并用数据填充表李>JOptionPane
通知用户没有记录,并终止程序李>另请注意:尽管允许,但尽量不要将AWT组件与Swing组件混合使用(请参阅another Stack Overflow answer for the reasons)
# 2 楼答案
我发现了一些问题,其中一些可能与此相关:
对
setModel()
的重复调用是不必要的,可能会意外地通知侦听表清除
DefaultTableModel
的更简单方法是通过setRowCount(0)
与其检查视图是否成功,不如检查模型;更好的是,只需在异常处理程序中显示
JOptionPane
对话框的父级可能应该是
JFrame
还考虑使用^{} 更新表的模型。
经测试: