可以从新JPanel

时间:2015-08-21 00:00:57

标签: java swing jtable jpanel

我正在开发一个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
  }

1 个答案:

答案 0 :(得分:1)

我认为您不会删除之前的JScrollPane / JTable,而您所看到的是z排序问题,即之前的所有JScrollPane / {屏幕上仍然可以看到{1}},并且互相竞争。

不是每次都创建新的JTable / JScrollPane,只需创建新的JTable并将其应用于预先存在的TableModel