java 查询更改时刷新 JTable
java refresh JTable when query changed
我正在构建一个 SQL 数据库 GUI。我遇到的问题是,当用户双击 SHOW TABLES 中的 table 时,它不会更新显示新 tables 结果的 table。
这是我的代码:
JTabbedPane tabbedPane = new JTabbedPane();
Statement stat = Gui.getStat();
private JPanel panel;
private String query;
public static void main(String[] args) {
showTables();
}
public void showTables() throws SQLException{
ResultSet showTablesResult = null;
query = "abc";
try {
showTablesResult = stat.executeQuery("SHOW TABLES");
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "Error connecting to databse");
}
displayResultSet(showTablesResult);
}
public void displayResultSet(ResultSet rs) throws SQLException{
JTable table = new JTable(buildTableModel(rs)){
private static final long serialVersionUID = 1L;
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
panel.add(new JScrollPane(table));
table.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
if(e.getClickCount() == 2){
if(query == "abc"){
//get value in selected cell
String selectedData = null;
int[] selectedRow = table.getSelectedRows();
int[] selectedColumns = table.getSelectedColumns();
for (int i = 0; i < selectedRow.length; i++) {
for (int j = 0; j < selectedColumns.length; j++) {
selectedData = (String) table.getValueAt(selectedRow[i], selectedColumns[j]);
}
}
try {
viewTable(selectedData);
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
}
});
}
public void viewTable(String tName) throws SQLException{
ResultSet showTablesResult = null;
query = "123";
try {
showTablesResult = stat.executeQuery("SELECT * FROM " +tName);
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "Error connecting to databse");
}
displayResultSet(showTablesResult);
}
public static DefaultTableModel buildTableModel(ResultSet rs)
throws SQLException {
ResultSetMetaData metaData = rs.getMetaData();
Vector<String> columnNames = new Vector<String>();
int columnCount = metaData.getColumnCount();
for (int column = 1; column <= columnCount; column++) {
columnNames.add(metaData.getColumnName(column));
}
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
while (rs.next()) {
Vector<Object> vector = new Vector<Object>();
for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
vector.add(rs.getObject(columnIndex));
}
data.add(vector);
}
return new DefaultTableModel(data, columnNames);
}
我该如何解决这个问题才能使其正常工作?我认为可能有一个函数可以重新绘制或刷新 table 或其他东西,但我找不到那是什么。
谢谢:)
panel.add(new JScrollPane(table));
默认情况下,组件的大小为 (0, 0),因此没有可绘制的内容。
当您从可见的 GUI 添加(或删除)组件时,您需要调用布局管理器,以便组件在面板上获得 size/location。基本代码为:
panel.add(...);
panel.revalidate();
panel.repaint();
然而,当使用逻辑 "refresh" a table 时,这样做要容易得多:
table.setModel( your updated TableModel );
无需每次都重新创建 JScrollPane 和 JTable。
正如 camickr 所说,没有必要每次都重新创建 JTable 和 TableModel
我会这样做:
从您的 viewTable(...) 方法中删除 displayResultSet(...),只需将其替换为以下内容:
Vector<Vector<Object>> newDataVector = //fill with new data
defaultTableModel.setDataVector(newDataVector, columnIdentifiers);
defaultTableModel.fireTableDataChanged();
我正在构建一个 SQL 数据库 GUI。我遇到的问题是,当用户双击 SHOW TABLES 中的 table 时,它不会更新显示新 tables 结果的 table。
这是我的代码:
JTabbedPane tabbedPane = new JTabbedPane();
Statement stat = Gui.getStat();
private JPanel panel;
private String query;
public static void main(String[] args) {
showTables();
}
public void showTables() throws SQLException{
ResultSet showTablesResult = null;
query = "abc";
try {
showTablesResult = stat.executeQuery("SHOW TABLES");
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "Error connecting to databse");
}
displayResultSet(showTablesResult);
}
public void displayResultSet(ResultSet rs) throws SQLException{
JTable table = new JTable(buildTableModel(rs)){
private static final long serialVersionUID = 1L;
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
panel.add(new JScrollPane(table));
table.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
if(e.getClickCount() == 2){
if(query == "abc"){
//get value in selected cell
String selectedData = null;
int[] selectedRow = table.getSelectedRows();
int[] selectedColumns = table.getSelectedColumns();
for (int i = 0; i < selectedRow.length; i++) {
for (int j = 0; j < selectedColumns.length; j++) {
selectedData = (String) table.getValueAt(selectedRow[i], selectedColumns[j]);
}
}
try {
viewTable(selectedData);
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
}
});
}
public void viewTable(String tName) throws SQLException{
ResultSet showTablesResult = null;
query = "123";
try {
showTablesResult = stat.executeQuery("SELECT * FROM " +tName);
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "Error connecting to databse");
}
displayResultSet(showTablesResult);
}
public static DefaultTableModel buildTableModel(ResultSet rs)
throws SQLException {
ResultSetMetaData metaData = rs.getMetaData();
Vector<String> columnNames = new Vector<String>();
int columnCount = metaData.getColumnCount();
for (int column = 1; column <= columnCount; column++) {
columnNames.add(metaData.getColumnName(column));
}
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
while (rs.next()) {
Vector<Object> vector = new Vector<Object>();
for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
vector.add(rs.getObject(columnIndex));
}
data.add(vector);
}
return new DefaultTableModel(data, columnNames);
}
我该如何解决这个问题才能使其正常工作?我认为可能有一个函数可以重新绘制或刷新 table 或其他东西,但我找不到那是什么。
谢谢:)
panel.add(new JScrollPane(table));
默认情况下,组件的大小为 (0, 0),因此没有可绘制的内容。
当您从可见的 GUI 添加(或删除)组件时,您需要调用布局管理器,以便组件在面板上获得 size/location。基本代码为:
panel.add(...);
panel.revalidate();
panel.repaint();
然而,当使用逻辑 "refresh" a table 时,这样做要容易得多:
table.setModel( your updated TableModel );
无需每次都重新创建 JScrollPane 和 JTable。
正如 camickr 所说,没有必要每次都重新创建 JTable 和 TableModel
我会这样做:
从您的 viewTable(...) 方法中删除 displayResultSet(...),只需将其替换为以下内容:
Vector<Vector<Object>> newDataVector = //fill with new data
defaultTableModel.setDataVector(newDataVector, columnIdentifiers);
defaultTableModel.fireTableDataChanged();