Ich bereite mich zurzeit auf eine Klassenarbeit in Programmiertechnik mit den Schwerpunkten JTable, Dialogfenster und IO vor. Ich habe mir deshalb vorgenommen einen kleinen Datenbank Manager (MySQL Datenbank) zu schreiben, der mir den Inhalt einer Tabelle ausgeben kann und mir diesen Inhalt auch in eine CSV Datei schreibt.
Anfangs habe ich erstmal Klassen geschrieben zur Erleichterung des Umgangs mit dem JDBC Treiber. Dann habe ich eine Klasse geschrieben über die die Anzahl der Spalten, die Anzahl der Reihen und der Inhalt als Array einer bestimmten Tabelle zurückgegeben werden. Das Ganze hat auch geklappt. Die JTable wurde befüllt und ich war erstmal glücklich.
Jetzt wollte ich das Ganze etwas umschreiben, damit man zwischen den einzelnen Datenbanken/Tables mittels JComboBox wählen kann. Leider hat das nicht funktioniert. Ich bin letzt endlich zu dem Schluss gekommen, dass durch table.repaint() bzw repaint die Anzahl der Spalten/Reihen nicht aktualisiert wird.
Die Daten werden ohne Probleme neu in das Array geladen.
Wie bekomme ich es hin, dass die JTable sich komplett neu aufbaut?
Hier meine Hauptklasse:
Bitte entschuldigt, wenn es teilweise etwas unübersichtlich ist. Ich habe schon so viel rumprobiert dass die ganze Ordnung verloren gegangen ist
Anfangs habe ich erstmal Klassen geschrieben zur Erleichterung des Umgangs mit dem JDBC Treiber. Dann habe ich eine Klasse geschrieben über die die Anzahl der Spalten, die Anzahl der Reihen und der Inhalt als Array einer bestimmten Tabelle zurückgegeben werden. Das Ganze hat auch geklappt. Die JTable wurde befüllt und ich war erstmal glücklich.
Jetzt wollte ich das Ganze etwas umschreiben, damit man zwischen den einzelnen Datenbanken/Tables mittels JComboBox wählen kann. Leider hat das nicht funktioniert. Ich bin letzt endlich zu dem Schluss gekommen, dass durch table.repaint() bzw repaint die Anzahl der Spalten/Reihen nicht aktualisiert wird.
Die Daten werden ohne Probleme neu in das Array geladen.
Wie bekomme ich es hin, dass die JTable sich komplett neu aufbaut?
Hier meine Hauptklasse:
Java:
import javax.swing.*;
import javax.swing.table.*;
import java.awt.event.*;
public class PatDatabaseManager extends JFrame
{
JButton b1;
JPanel panel;
LoadTable loadtable;
JComboBox showDatabases, showTables;
JTable tab;
String[] databases;
String table = "";
static String[][] data;
static int cols;
static int rows;
static String[] field;
public PatDatabaseManager()
{
setSize(800,600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(null);
databases = loadtable.GetDatabases();
showDatabases = new JComboBox();
showTables = new JComboBox();
for (int itr = 0; itr < databases.length; itr++)
{
showDatabases.addItem(databases[itr]);
}
showDatabases.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
showTables.removeAllItems();
String cbDB = showDatabases.getItemAt(showDatabases.getSelectedIndex()).toString();
System.out.println(cbDB);
String[] tables = loadtable.GetTables(cbDB);
for (int itr = 0; itr < tables.length; itr++)
{
System.out.println(tables[itr]);
showTables.addItem(tables[itr]);
}
}
});
showTables.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
table = showTables.getItemAt(showTables.getSelectedIndex()).toString();
data = new String[cols][rows];
field = loadtable.GetFields(table);
cols = loadtable.GetFields(table).length;
rows = loadtable.GetRowCount(table);
data = new String[cols][rows];
for (int colItr = 0; colItr < cols; colItr++)
{
String[] temp = loadtable.GetData(table, colItr);
for (int rowItr = 0; rowItr < rows; rowItr++)
{
data[colItr][rowItr] = temp[rowItr];
System.out.println(data[colItr][rowItr]);
}
}
}
});
showDatabases.setBounds(10, 30, 150, 20);
add(showDatabases);
showTables.setBounds(10, 60, 150, 20);
add(showTables);
b1 = new JButton("Refresh");
b1.setBounds(10, 100, 150, 25);
add(b1);
b1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
repaint();
tab.repaint();
}
});
loadtable = new LoadTable();
panel = new JPanel();
panel.setBounds(60, 25, 800, 800);
field = loadtable.GetFields(table);
cols = loadtable.GetFields(table).length;
rows = loadtable.GetRowCount(table);
data = new String[cols][rows];
for (int colItr = 0; colItr < cols; colItr++)
{
String[] temp = loadtable.GetData(table, colItr);
for (int rowItr = 0; rowItr < rows; rowItr++)
{
data[colItr][rowItr] = temp[rowItr];
}
}
tab = new JTable(new AbstractTableModel()
{
public int getColumnCount()
{
return GetColumns();
}
public int getRowCount()
{
return GetRows();
}
public boolean isCellEditable(int z, int s)
{
return true;
}
public Object getValueAt(int z, int s)
{
return GetData()[s][z];
}
public void setValueAt(Object v, int z, int s)
{
}
public String getColumnName(int index)
{
return GetField()[index];
}
});
tab.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
JScrollPane sp = new JScrollPane(tab);
sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
panel.add(sp);
add(panel);
setVisible(true);
}
static String[][] GetData()
{
return data;
}
static String[] GetField()
{
return field;
}
static int GetRows()
{
return rows;
}
static int GetColumns()
{
return cols;
}
public static void main(String[] args)
{
new PatDatabaseManager();
}
}
Bitte entschuldigt, wenn es teilweise etwas unübersichtlich ist. Ich habe schon so viel rumprobiert dass die ganze Ordnung verloren gegangen ist