我正在开发一个Java Swing GUI应用程序,它由以下高级组件层次结构组成 - JFrame
包含Main JPanel
,其中包含Filter JPanel
和DB Query Results JPanel
。用户输入特定过滤器值并从过滤器面板中选择“提交”按钮后,将执行相应的数据库查询,并将结果(如果有)传递给生成“过滤器面板”下方显示的“数据库查询结果”面板的方法。
我遇到的问题是,如果执行连续数据库查询,返回的数据/行数少于先前数据库查询数据库查询结果面板,其中包含从JScrollPane
构建的JTable
处理结果看起来是正确的,但是如果我单击/拖动最新返回/显示结果行下方的鼠标,则会显示先前的数据行,如果显示了足够的旧数据行,则会显示右侧滚动列表栏。以下是与数据库查询方法关联的代码或代码段,该方法将ResultSet
传递给构建结果面板的方法。希望它足以表明问题。到目前为止,我已尝试在互联网上找到的所有内容(调用各种方法repaint()
,remove()
,revalidate()
,...)都没有成功。
非常感谢您提供的任何帮助。
public void submitQuery(){
//...Establish database connection
//...Generate database query based on provided filters
try{
Statement stmt = db_connection.createStatement();
ResultSet rs = stmt.executeQuery( generated query );
buildDataResultPanel(rs):
frame.validate();
}
//... handle exceptions
}
public void buildDataResultPanel(ResultSet rs){
final JLabel resultsHeader = new JLabel("Database Query Results");
Vector<Vector<String>> resultRows = null;
JTable resultsTable = null;
try{
if ( (rs != null) && (rs.isBeforeFirst() ){
resultRows = new Vector<Vector<String>> ();
while (rs.next){
Vector<String> resultRow = new Vector<String>();
resultRow.add(rs.getString(1));
//....
//....
resultRows.add(resultRow);
}
}
DefaultTableModel resultTableModel =
new DefaultTableModel(resultRows, columnNames);
resultsTable = new JTable(resultTableModel);
resultsTable.setForeground(Color.BLUE);
resultsTable.setPreferredScrollableViewportSize(
new Dimension(1100,500));
resultsTable.getColumnModel.getColumn(1).setMaxWidth(100);
//....
//....
JPanel resultsPanel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.CENTER;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.gridx = 0;
gbc.gridy = 0;
resultsPanel.add(resultsHeader, gbc);
gbc.gridx = 0;
gbc.gridy++;
JScrollPane resultsScrollPane = new JScrollPane(resultsTable);
resultsPanel.add(resultsScrollPane, gbc);
mainPanel.add(resultsPanel, BorderLayout.CENTER);
mainPanel.validate();
}
//.... handle exceptions
}
答案 0 :(得分:1)
我认为您不会删除之前的JScrollPane
/ JTable
,而您所看到的是z排序问题,即之前的所有JScrollPane
/ {屏幕上仍然可以看到{1}},并且互相竞争。
不是每次都创建新的JTable
/ JScrollPane
,只需创建新的JTable
并将其应用于预先存在的TableModel