Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Mein Problem ist folgendes: Ich habe eine Datenbank, logischerweise sind da Tabellen drin. Nun ist die Aufgabe, eine dieser Tabellen auszugeben in einem neuen Fenster, und zwar mit Swing oder AWT.
Ich verwende NetBeans.
Muss ich eine komplett neue main-funktion anlegen, wo das neue Fenster aufgerufen wird?
Ich hab auch versucht, in den vorhandenen Quellcode das Fenster manuell zu erstellen, aber dort komme ich dann nicht weiter, wie ich das Fenster mit der Tabelle bzw. den Datenbankdaten füllen könnte.
Ich muss also auf einen Button klicken und mit Klick soll sich das neue Fenster öffnen. Wie geh ichs an?
Mein aktueller Stand der Dinge:
Java:
private void DBAnzeigenActionPerformed (java.awt.event.ActionEvent evt)
{
zeigeTabelle();
}
public void zeigeTabelle()
{
JFrame frame = new JFrame();
frame.setVisible(true);
}
So, damit wird das neue Fenster aufgerufen. Wie krieg ich dort die Tabelle rein?
wenn du ein neues Fenster haben willst dann erstelle eine neue Klasse mit JFrame ohne main Methode, die du dann aus dem Hauptprogramm mit new MeineTabelle(); aufrufst.
Für die Daten aus der Datenbank kannst du dann ein JTable nehmen.
Das hab ich jetzt selbst auch so hinbekommen, irgendwie hab ich ganz vergessen, dass ich hier gefragt habe ;-)
Jedenfalls öffnet das Fenster und die Tabelle ist auch drin. Nun steh ich vorm größten Problem: die Daten in die Tabelle zu kriegen.
Ich hab was von einem TableModel gelesen...und übrigens das Tutorial von Sun über Tabellen hab ich auch bestimmt schon 30x gelesen aber ich werd daraus nicht schlau.
Soweit ich weiss MUSS ich ein TableModel anlegen, okay das verstehe ich noch. Und was mach ich dann damit? Wie krieg ich die Daten in die Tabelle?
Ich hab jetzt für das TableModel auch eine neue Klasse angelegt, ohne main-Funktion.
Du brauchst kein TableModel. Einfach ein String Array (wie im Beispiel) mit den Überschriften erstellen, dann ein Zwei-dimensionales Object-Array mit den Daten pro Reihe.
die NullpointerExceptions sind jetzt irgendwie weg, dennoch bekomme ich einen Fehler wegen einer fehlenden Variablen, die aber vorher da war. Könntet ihr bitte mal drüber schaun? Es ist alles ein wenig verworren, aber ich denke mal es ist so wie immer, dass es irgendwo ein Mini-Fehler ist den ich net finde.
Hauptklasse wo alles abläuft:
Java:
private void VerbindenActionPerformed (java.awt.event.ActionEvent evt)
{
System.out.println("Verbinden");
statusMessageLabel.setText ( "Verbinden...");
verbinden();
}
public void verbinden()
{
try
{
Class.forName("org.postgresql.Driver" );
}
catch (ClassNotFoundException ex)
{
System.out.println(ex.getMessage());
statusMessageLabel.setText ("Treiber nicht gefunden!");
}
try
{
conn = DriverManager.getConnection("...");
}
catch (Exception e)
{
System.out.println(e.getMessage ());
statusMessageLabel.setText("Verbindung fehlgeschlagen!");
}
}
private void TrennenActionPerformed (java.awt.event.ActionEvent evt)
{
trennen();
System.out.println("Getrennt");
statusMessageLabel.setText("Verbindung trennen...");
}
public void trennen()
{
try
{
conn.close();
}
catch (Exception exs)
{
exs.printStackTrace();
System.out.println("Verbindung kann nicht getrennt werden!");
}
}
private void DBAnzeigenActionPerformed (java.awt.event.ActionEvent evt)
{
zeigeTabelle();
}
public void zeigeTabelle()
{
LinkedList bla = new LinkedList();
Object[] dbdata;
try
{
Statement stmt = conn.createStatement (ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT * FROM st_user");
ResultSetMetaData rsmd = rs.getMetaData();
while (rs.next())
{
// System.out.println ("Column Count" +rsmd.getColumnCount());
dbdata = new Object[rsmd.getColumnCount()+1];
for (int i = 1; i <= rsmd.getColumnCount(); i++)
{
dbdata [i-1] = rs.getObject ( i );
}
bla.add ( dbdata);
// String name = rs.getString("bezeichnung");
// System.out.println("Name: " +name);
}
rs.close();
stmt.close();
}
catch (Exception exce)
{
System.out.println(exce.toString());
}
MyTable table = new MyTable();
showTableFrame tableframe = new showTableFrame(bla);
tableframe.setVisible ( true);
new showTableFrame(bla).setVisible(true);
}
Hauptprogramm:
Java:
public class showTableFrame extends JFrame
{
private DefaultTableModel model = new DefaultTableModel();
public showTableFrame(LinkedList rowData)
{
MyTable table = new MyTable(rowData);
table.setModel ( model );
jScrollPane1.getViewport ().add ( table);
for (int c = 0; c < ((Object[]) rowData.get ( 0 )).length; ++c)
{
model.addColumn("Column " +Integer.toString(c));
}
for (int r = 0; r < rowData.size (); ++r)
{
model.addRow ( (Object[]) rowData.get ( r ));
}
table.setVisible(true);
//.....
In diese Klasse soll die Tabelle rein, daher hab ich sie schon reinkopiert. Allerdings findet er die Variable rowData nicht.
Java:
public class MyTable extends JTable
{
private DefaultTableModel model = new DefaultTableModel();
private JScrollPane jScrollPane1;
public MyTable () //LinkedList rowData
{
MyTable table = new MyTable();
table.setModel ( model );
jScrollPane1.getViewport ().add ( table);
for (int c = 0; c < ((Object[]) rowData.get ( 0 )).length; ++c)
{
model.addColumn("Column " +Integer.toString(c));
}
for (int r = 0; r < rowData.size (); ++r)
{
model.addRow ( (Object[]) rowData.get ( r ));
}
table.setModel ( model );
jScrollPane1.getViewport ().add ( table);
table.setVisible(true);
}
}
/////////////////////
//DATENBANK-TABELLE//
/////////////////////
package idics_db_access_v1;
import javax.swing.table.*;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.*;
import java.sql.*;
public class MyTable extends JTable
{
private DefaultTableModel model = new DefaultTableModel();
private JTable table = new JTable(model);
public MyTable(LinkedList rowData)
{
for (int c = 0; c < ((Object[]) rowData.get ( 0 )).length; ++c)
{
model.addColumn("Column " +Integer.toString(c));
}
for (int r = 0; r < rowData.size (); ++r)
{
model.addRow ( (Object[]) rowData.get ( r ));
}
table.setModel ( model );
}
}
GUI für die Tabelle (showTableFrame.java)
Java:
package idics_db_access_v1;
import javax.swing.*;
import javax.swing.table.*;
import java.util.*;
public class showTableFrame extends JFrame
{
//private int rows = 3;
//private int cols = 5;
//private Object[] rowData = new Object[cols];
private DefaultTableModel model = new DefaultTableModel();
private JTable table = new JTable(model);
public showTableFrame(LinkedList rowData)
{
initComponents();
for (int c = 0; c < ((Object[]) rowData.get ( 0 )).length; ++c)
{
model.addColumn("Column " +Integer.toString(c));
}
for (int r = 0; r < rowData.size (); ++r)
{
model.addRow ( (Object[]) rowData.get ( r ));
}
table.setModel ( model );
jScrollPane1.getViewport ().add ( table);
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
jTable1 = new javax.swing.JTable();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setName("Form"); // NOI18N
jScrollPane1.setName("jScrollPane1"); // NOI18N
jTable1.setAutoCreateColumnsFromModel(false);
jTable1.setModel(model);
jTable1.setName("jTable1"); // NOI18N
jScrollPane1.setViewportView(jTable1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 539, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 210, javax.swing.GroupLayout.PREFERRED_SIZE)
);
pack();
}// </editor-fold>
public static void main(String args[])
{
/* JFrame tableframe = new showTableFrame();
tableframe.setVisible ( true);*/
}
// Variables declaration - do not modify
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable jTable1;
// End of variables declaration
}
Haupt-GUI
Java:
package idics_db_access_v1;
import java.sql.*;
import org.jdesktop.application.Action;
import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.FrameView;
import org.jdesktop.application.TaskMonitor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;
import javax.swing.*;
public class Idics_db_access_v1View extends FrameView {
public Idics_db_access_v1View(SingleFrameApplication app) {
super(app);
initComponents();
// status bar initialization - message timeout, idle icon and busy animation, etc
ResourceMap resourceMap = getResourceMap();
int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");
messageTimer = new Timer(messageTimeout, new ActionListener() {
public void actionPerformed(ActionEvent e) {
statusMessageLabel.setText("");
}
});
messageTimer.setRepeats(false);
int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate");
for (int i = 0; i < busyIcons.length; i++) {
busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");
}
busyIconTimer = new Timer(busyAnimationRate, new ActionListener() {
public void actionPerformed(ActionEvent e) {
busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);
}
});
idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
statusAnimationLabel.setIcon(idleIcon);
progressBar.setVisible(false);
// connecting action tasks to status bar via TaskMonitor
TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
public void propertyChange(java.beans.PropertyChangeEvent evt) {
String propertyName = evt.getPropertyName();
if ("started".equals(propertyName)) {
if (!busyIconTimer.isRunning()) {
statusAnimationLabel.setIcon(busyIcons[0]);
busyIconIndex = 0;
busyIconTimer.start();
}
progressBar.setVisible(true);
progressBar.setIndeterminate(true);
} else if ("done".equals(propertyName)) {
busyIconTimer.stop();
statusAnimationLabel.setIcon(idleIcon);
progressBar.setVisible(false);
progressBar.setValue(0);
} else if ("message".equals(propertyName)) {
String text = (String)(evt.getNewValue());
statusMessageLabel.setText((text == null) ? "" : text);
messageTimer.restart();
} else if ("progress".equals(propertyName)) {
int value = (Integer)(evt.getNewValue());
progressBar.setVisible(true);
progressBar.setIndeterminate(false);
progressBar.setValue(value);
}
}
});
}
@Action
public void showAboutBox() {
if (aboutBox == null) {
JFrame mainFrame = Idics_db_access_v1App.getApplication().getMainFrame();
aboutBox = new Idics_db_access_v1AboutBox(mainFrame);
aboutBox.setLocationRelativeTo(mainFrame);
}
Idics_db_access_v1App.getApplication().show(aboutBox);
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
mainPanel = new javax.swing.JPanel();
Verbinden = new javax.swing.JButton();
Trennen = new javax.swing.JButton();
DBAnzeigen = new javax.swing.JButton();
menuBar = new javax.swing.JMenuBar();
javax.swing.JMenu fileMenu = new javax.swing.JMenu();
javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem();
javax.swing.JMenu helpMenu = new javax.swing.JMenu();
javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem();
statusPanel = new javax.swing.JPanel();
javax.swing.JSeparator statusPanelSeparator = new javax.swing.JSeparator();
statusMessageLabel = new javax.swing.JLabel();
statusAnimationLabel = new javax.swing.JLabel();
progressBar = new javax.swing.JProgressBar();
mainPanel.setName("mainPanel"); // NOI18N
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(idics_db_access_v1.Idics_db_access_v1App.class).getContext().getResourceMap(Idics_db_access_v1View.class);
Verbinden.setText(resourceMap.getString("Verbinden.text")); // NOI18N
Verbinden.setName("Verbinden"); // NOI18N
Verbinden.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
VerbindenActionPerformed(evt);
}
});
Trennen.setText(resourceMap.getString("Trennen.text")); // NOI18N
Trennen.setName("Trennen"); // NOI18N
Trennen.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
TrennenActionPerformed(evt);
}
});
DBAnzeigen.setText(resourceMap.getString("DBAnzeigen.text")); // NOI18N
DBAnzeigen.setName("DBAnzeigen"); // NOI18N
DBAnzeigen.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
DBAnzeigenActionPerformed(evt);
}
});
javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
mainPanel.setLayout(mainPanelLayout);
mainPanelLayout.setHorizontalGroup(
mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(mainPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(mainPanelLayout.createSequentialGroup()
.addComponent(Verbinden, javax.swing.GroupLayout.PREFERRED_SIZE, 172, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(41, 41, 41)
.addComponent(Trennen, javax.swing.GroupLayout.DEFAULT_SIZE, 167, Short.MAX_VALUE)
.addContainerGap())
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup()
.addComponent(DBAnzeigen)
.addGap(130, 130, 130))))
);
mainPanelLayout.setVerticalGroup(
mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup()
.addContainerGap(184, Short.MAX_VALUE)
.addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(Verbinden)
.addComponent(Trennen))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(DBAnzeigen)
.addContainerGap())
);
menuBar.setName("menuBar"); // NOI18N
fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N
fileMenu.setName("fileMenu"); // NOI18N
javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(idics_db_access_v1.Idics_db_access_v1App.class).getContext().getActionMap(Idics_db_access_v1View.class, this);
exitMenuItem.setAction(actionMap.get("quit")); // NOI18N
exitMenuItem.setName("exitMenuItem"); // NOI18N
fileMenu.add(exitMenuItem);
menuBar.add(fileMenu);
helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N
helpMenu.setName("helpMenu"); // NOI18N
aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N
aboutMenuItem.setName("aboutMenuItem"); // NOI18N
helpMenu.add(aboutMenuItem);
menuBar.add(helpMenu);
statusPanel.setName("statusPanel"); // NOI18N
statusPanelSeparator.setName("statusPanelSeparator"); // NOI18N
statusMessageLabel.setName("statusMessageLabel"); // NOI18N
statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N
progressBar.setName("progressBar"); // NOI18N
javax.swing.GroupLayout statusPanelLayout = new javax.swing.GroupLayout(statusPanel);
statusPanel.setLayout(statusPanelLayout);
statusPanelLayout.setHorizontalGroup(
statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(statusPanelSeparator, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
.addGroup(statusPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(statusMessageLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 380, Short.MAX_VALUE)
.addComponent(statusAnimationLabel)
.addContainerGap())
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, statusPanelLayout.createSequentialGroup()
.addContainerGap(223, Short.MAX_VALUE)
.addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 167, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
statusPanelLayout.setVerticalGroup(
statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(statusPanelLayout.createSequentialGroup()
.addComponent(statusPanelSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(statusMessageLabel)
.addComponent(statusAnimationLabel)
.addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(3, 3, 3))
);
setComponent(mainPanel);
setMenuBar(menuBar);
setStatusBar(statusPanel);
}// </editor-fold>
Connection conn;
private void VerbindenActionPerformed (java.awt.event.ActionEvent evt)
{
System.out.println("Verbinden");
statusMessageLabel.setText ( "Verbinden...");
verbinden();
}
public void verbinden()
{
try
{
Class.forName("org.postgresql.Driver" );
}
catch (ClassNotFoundException ex)
{
System.out.println("Treiber nicht gefunden!");
statusMessageLabel.setText ("Treiber nicht gefunden!");
}
try
{
conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/idics","","");
}
catch (Exception e)
{
System.out.println(e.getMessage ());
statusMessageLabel.setText("Verbindung fehlgeschlagen!");
}
}
private void TrennenActionPerformed (java.awt.event.ActionEvent evt)
{
trennen();
System.out.println("Getrennt");
statusMessageLabel.setText("Verbindung trennen...");
}
public void trennen()
{
try
{
conn.close();
}
catch (Exception exs)
{
exs.printStackTrace();
System.out.println("Verbindung kann nicht getrennt werden!");
}
}
private void DBAnzeigenActionPerformed (java.awt.event.ActionEvent evt)
{
zeigeTabelle();
}
public void zeigeTabelle()
{
LinkedList bla = new LinkedList();
Object[] dbdata;
try
{
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT * FROM st_user");
ResultSetMetaData rsmd = rs.getMetaData();
while (rs.next())
{
System.out.println ("Column Count" +rsmd.getColumnCount());
dbdata = new Object[rsmd.getColumnCount()];
for (int i = 1; i <= rsmd.getColumnCount(); i++)
{
dbdata [i-1] = rs.getObject ( i );
}
bla.add ( dbdata);
String name = rs.getString("bezeichnung");
System.out.println("Name: " +name);
}
rs.close();
stmt.close();
}
catch (Exception exce)
{
System.out.println(exce.toString());
}
JFrame tableframe = new showTableFrame(bla);
tableframe.setVisible ( true);
//new showTableFrame(bla).setVisible(true);
}
// Variables declaration - do not modify
private javax.swing.JButton DBAnzeigen;
private javax.swing.JButton Trennen;
private javax.swing.JButton Verbinden;
private javax.swing.JPanel mainPanel;
private javax.swing.JMenuBar menuBar;
private javax.swing.JProgressBar progressBar;
private javax.swing.JLabel statusAnimationLabel;
private javax.swing.JLabel statusMessageLabel;
private javax.swing.JPanel statusPanel;
// End of variables declaration
private final Timer messageTimer;
private final Timer busyIconTimer;
private final Icon idleIcon;
private final Icon[] busyIcons = new Icon[15];
private int busyIconIndex = 0;
private JDialog aboutBox;
}
mein Anliegen: die Tabellenstruktur soll in die Klasse MyTable.java
Frage: Wie verknüpfe ich die Abfragen mit Tabellenstruktur und GUI? Ist der Aufbau so okay oder sollte ich lieber nochmal umstrukturieren?
Es wäre echt nett wenn ihr mir ein paar Tipps geben könntet, ich bin eigentlich absoluter Java-Neuling und muss mich möglichst schnell in die Thematik reinarbeiten, leider ist der Java-Guru in meiner Firma zur Zeit nicht da und irgendwie muss ich mich da durchquälen
so, ich bin jetzt schon ein ganzes Stückchen weiter gekommen (und mittlerweile weiss ich auch, was ich da gemacht habe ;-))
Ich hoffe es liest noch jemand mit?
Jedenfalls kommen jetz NullPointerExceptions und so richtig weiß ich jetzt wirklich nicht weiter.
Ich habe mein Programm in mehrere Klassen aufgeteilt:
ein Hauptprogramm (Aufruf des GUI)
eine GUI-Klasse (GUI-Befehle und Aufruf von Methoden durch ActionPerformed etc.)
eine Datenbank-Klasse (Die DB auslesen)
eine Tabellenklasse (Verbindung zur DB herstellen und die Tabellenstruktur festlegen)
Java:
////////////////////
//TABELLENKLASSE////
//TABELLENSTRUKTUR//
////////////////////
package idics_db_viewv3;
//Imports
public class MyTable extends JFrame
{
MyDB meineDB = new MyDB();
JFrame tableFrame = new JFrame();
JPanel tablePanel = new JPanel();
JScrollPane tableScrollPane = new JScrollPane();
DefaultTableModel model = new DefaultTableModel();
JTable MyTable = new JTable(model);
LinkedList list = new LinkedList();
Vector columnNames = new Vector();
Vector data = new Vector();
Object[] dbdata;
public MyTable()
{
try
{
while (meineDB.rs.next ())
{
dbdata = new Object[MyDB.rsmd.getColumnCount()];
for (int i = 1; i <= MyDB.rsmd.getColumnCount(); i++)
{
dbdata [i-1] = MyDB.rs.getObject ( i );
}
list.add ( dbdata);
String name = MyDB.rs.getString("bezeichnung");
System.out.println("Name: " +name);
}
//Anzahl Spalten
int columns = MyDB.rsmd.getColumnCount();
System.out.println ("Anzahl Spalten: " +columns);
//Spaltennamen
for (int i = 1; i <= columns; i++)
{
columnNames.addElement ( MyDB.rsmd.getColumnName ( i));
}
//Daten
while (MyDB.rs.next ())
{
Vector row = new Vector (columns);
for (int i = 1; i <= columns; i++)
{
row.addElement ( row);
}
}
MyDB.rs.close();
MyDB.stmt.close();
}
catch (SQLException sqle)
{
System.out.println(sqle);
}
//*******DAS NEUE FENSTER FÜR DIE TABELLE*******//
JTable meineTabelle = new JTable(data, columnNames);
JScrollPane meinScrollPane = new JScrollPane(meineTabelle);
Container contentPane = getContentPane();
contentPane.add ( meinScrollPane);
JPanel meinPanel = new JPanel ();
contentPane.add (meinPanel, BorderLayout.SOUTH);
}
//*******MIT DB VERBINDEN*******//
public boolean verbinden()
{
//*******TREIBER LADEN*******//
try
{
Class.forName("org.postgresql.Driver" );
System.out.println("Treiber geladen");
}
catch (ClassNotFoundException ex)
{
System.out.println("Treiber nicht gefunden!");
//statusMessageLabel.setText ("Treiber nicht gefunden!");
}
//*******MIT DB VERBINDEN*******//
try
{
meineDB.conn = DriverManager.getConnection ( "","","");
}
catch (SQLException sqlex)
{
System.out.println(sqlex.getMessage ());
//statusMessageLabel.setText("Verbindung fehlgeschlagen!");
System.out.println("DB nicht verfügbar");
}
return true;
}
//*******VON DB TRENNEN*******//
public boolean trennen()
{
try
{
meineDB.conn.close();
}
catch (Exception exs)
{
exs.printStackTrace();
System.out.println("Keine Verbindung!");
}
return true;
}
};
Die Exception tritt in der MyTable.java genau hier auf:
Java:
while (meineDB.rs.next ())
nämlich wenn ich das ResultSet durchlaufen will.
Ich muss logischerweise erst ein MyDB-Objekt erzeugen, ehe ich das ResultSet durchlaufen kann. Das hab ich auch versucht, hat allerdings nicht funktioniert. Es kam nach wie vor die NullPointerException. Mir kommt es so vor, dass das ResultSet leer ist und er deswegen die Exception bringt.
Liegt es an der Reihenfolge? Hab ich hier wieder einen dummen Denkfehler? Ich denke mal was großes kann es nicht sein.
Der Code ist ja nicht gerade einfach zu lesen. Soweit ich das sehe ist das ResultSet nicht leer (das würde nichts ausmachen) sondern es ist null, deswegen auch die Exception. ich sehe nirgends den Aufruf der Methode readDB() in dem der ResultSet initialisiert wird.
Wieso erzeugst Du eigentlich ein Objekt von MyDB, wenn Du sowie so nur statische Variablen und Methoden hast bzw. warum machst Du da alles statisch?
Der Code ist ja nicht gerade einfach zu lesen. Soweit ich das sehe ist das ResultSet nicht leer (das würde nichts ausmachen) sondern es ist null, deswegen auch die Exception. ich sehe nirgends den Aufruf der Methode readDB() in dem der ResultSet initialisiert wird.
Aufruf der Methode readDB() hab ich jetzt hier eingefügt (hab nochmal ne neue Methode showTable() geschrieben in der Hoffnung es liegt daran, also nicht wundern.
Java:
public void showTable()
{
MyDB.readDB ();
try
{
while (MyDB.rs.next ())
{
dbdata = new Object[MyDB.rsmd.getColumnCount()];
for (int i = 1; i <= MyDB.rsmd.getColumnCount(); i++)
{
dbdata [i-1] = MyDB.rs.getObject ( i );
}
list.add ( dbdata);
String name = MyDB.rs.getString("bezeichnung");
System.out.println("Name: " +name);
}
Statisch deshalb, weil ein Schlaumeier hier (im Büro) gesagt hat ich solle das besser machen, damit das ResultSet im Speicher bleibt. Ich dachte aber unter static versteht man etwas anderes.
Weil du meintest mein code wäre schwer zu lesen: ist er unübersichtlich? Kann man in der Hinsicht was verbessern? So bewandert bin ich doch in der Materie nun auch noch nicht..was die ganze Softwareentwicklung angeht.
Man könnte die graphischen Umfänge von den Datenbank Themen trennen.
Die Datenbank-Klasse kümmert sich um den Verbindungsaufbau/abbau und die Aufbereitung der Daten
Der Frame enthält die Table und deren Model und sagt der Datenbank-Klasse verbinde Dich zur Datenbank, gibt mir die Spaltennamen, gibt mir den Datensatz, beende die Verbindung
Man könnte die graphischen Umfänge von den Datenbank Themen trennen.
Die Datenbank-Klasse kümmert sich um den Verbindungsaufbau/abbau und die Aufbereitung der Daten
Der Frame enthält die Table und deren Model und sagt der Datenbank-Klasse verbinde Dich zur Datenbank, gibt mir die Spaltennamen, gibt mir den Datensatz, beende die Verbindung
public void showTable()
{
MyDB.readDB ();
try
{
while (MyDB.rs.next ()) //*****NULLPOINTEREXCEPTION*****
{
dbdata = new Object[MyDB.rsmd.getColumnCount()];
for (int i = 1; i <= MyDB.rsmd.getColumnCount(); i++)
{
dbdata [i-1] = MyDB.rs.getObject ( i );
}
list.add ( dbdata);
String name = MyDB.rs.getString("bezeichnung");
System.out.println("Name: " +name);
}
//Anzahl Spalten
int columns = MyDB.rsmd.getColumnCount();
System.out.println ("Anzahl Spalten: " +columns);
//Spaltennamen
for (int i = 1; i <= columns; i++)
{
columnNames.addElement ( MyDB.rsmd.getColumnName ( i));
}
//Daten
while (MyDB.rs.next ())
{
Vector row = new Vector (columns);
for (int i = 1; i <= columns; i++)
{
row.addElement ( row);
}
}
MyDB.rs.close();
MyDB.stmt.close();
}
catch (SQLException sqle)
{
System.out.println(sqle);
}
//*******DAS NEUE FENSTER FÜR DIE TABELLE*******//
JTable meineTabelle = new JTable(data, columnNames);
JScrollPane meinScrollPane = new JScrollPane(meineTabelle);
Container contentPane = getContentPane();
contentPane.add ( meinScrollPane);
JPanel meinPanel = new JPanel ();
contentPane.add (meinPanel, BorderLayout.SOUTH);
MyTable frame = new MyTable();
frame.setDefaultCloseOperation (0);
frame.pack ();
frame.setVisible(true);
}
//*******MIT DB VERBINDEN*******//
public boolean verbinden()
{
//*******TREIBER LADEN*******//
try
{
Class.forName("org.postgresql.Driver" );
System.out.println("Treiber geladen");
}
catch (ClassNotFoundException ex)
{
System.out.println("Treiber nicht gefunden!");
//statusMessageLabel.setText ("Treiber nicht gefunden!");
}
//*******MIT DB VERBINDEN*******//
try
{
MyDB.conn = DriverManager.getConnection ( "jdbc:postgresql://localhost:5432/idics","idics_server","idicskannalles");
}
catch (SQLException sqlex)
{
System.out.println(sqlex.getMessage ());
//statusMessageLabel.setText("Verbindung fehlgeschlagen!");
System.out.println("DB nicht verfügbar");
}
return true;
}
//*******VON DB TRENNEN*******//
public boolean trennen()
{
try
{
MyDB.conn.close();
}
catch (Exception exs)
{
exs.printStackTrace();
System.out.println("Keine Verbindung!");
}
return true;
}
};
Die Exception:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
java.lang.NullPointerException
at idics_db_viewv3.MyTable.showTable(MyTable.java:32)
at idics_db_viewv3.Idics_db_viewV3View.jButton3ActionPerformed(Idics_db_viewV3View.java:236)
at idics_db_viewv3.Idics_db_viewV3View.access$1000(Idics_db_viewV3View.java:22)
at idics_db_viewv3.Idics_db_viewV3View$6.actionPerformed(Idics_db_viewV3View.java:141)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6134)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at java.awt.Component.processEvent(Component.java:5899)
at java.awt.Container.processEvent(Container.java:2023)
at java.awt.Component.dispatchEventImpl(Component.java:4501)
at java.awt.Container.dispatchEventImpl(Container.java:2081)
at java.awt.Component.dispatchEvent(Component.java:4331)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4301)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3965)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3895)
at java.awt.Container.dispatchEventImpl(Container.java:2067)
at java.awt.Window.dispatchEventImpl(Window.java:2458)
at java.awt.Component.dispatchEvent(Component.java:4331)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
also ich hab jetzt mal spassenshabler nicht auf verbinden geklickt sondern gleich auf "Datenbank anzeigen", da kam bei beiden true raus
Das versteh ich nicht, vorher hat es auch funktioniert! Kann es irgendwas damit zu tun haben, wie ich die Tabelle lade? Als ich es in der Konsole ausgegeben habe, ging es!
Ehrlich gesagt steigt ich bei Deinem Code nicht so ganz durch ;-)
Probier mal folgendes bei Dir aus. Kann es mangels Treiber und Datenbankanbindung bei mir nicht testen. Vielleicht kannst Du ja darauf aufbauen.
Java:
import java.awt.*;
import java.sql.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class DataBaseDemo extends JFrame {
private JTable table;
private DefaultTableModel model;
public DataBaseDemo() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setBounds(0, 0, 300, 500);
this.setLocationRelativeTo(null);
DataManager dm = new DataManager();
model = new DefaultTableModel();
if (dm.connect("jdbc:postgresql://localhost:5432/idics","idics_server","idicskannalles")) {
Vector[] tableData = dm.loadData();
model = new DefaultTableModel(tableData[0], tableData[1]);
dm.disconnect();
}
table = new JTable(model);
this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
}
public static void main(String[] args) {
new DataBaseDemo().setVisible(true);
}
}
class DataManager {
private Connection con;
private ResultSet rs;
private ResultSetMetaData rsmd;
public DataManager() {}
public boolean connect(String url, String user, String pwd) {
try {
Class.forName("org.postgresql.Driver" );
System.out.println("Treiber geladen");
con = DriverManager.getConnection (url, user, pwd);
return true;
}
catch (Exception exc) {exc.printStackTrace();}
return false;
}
public void disconnect() {
try {
con.close();
}
catch (Exception exc) {exc.printStackTrace();}
}
public Vector[] loadData() {
Vector names = new Vector();
Vector data = new Vector();
Vector[] resultVector = new Vector[]{data, names};
try {
Statement stmt = con.createStatement();
rs = stmt.executeQuery("SELECT * FROM st_user");
rsmd = rs.getMetaData();
int columns = rsmd.getColumnCount();
for (int i=1; i<=columns; i++)
names.addElement(rsmd.getColumnName(i));
Vector row;
while(rs.next()) {
row = new Vector();
for (int i=1; i<=columns; i++) {
row.addElement(rs.getObject(i));
}
data.addElement(row);
}
}
catch (Exception exc) {exc.printStackTrace();}
return resultVector;
}
}
okay, also er bringt keine Fehler, was schonmal gut ist.
Allerdings zeigt er die Tabelle noch nicht an, aber ich denke mal, da muss ich das dann in einen neuen Frame laden.
Hab jetzt einen neuen Frame erzeugt und dort die Klasse reingetan. Werd nochmal alles in eine Datei tun, dann gucken was passiert, und wenn es funktioniert, werd ich das auf meine DB-Anwendung anwenden.
Zeile 9 muss ganz unten hin, nicht ganz oben....da lag erstmal der Fehler. Also die DB-Verbindung funktioniert, jetzt bin ich wieder beim alten Thema, das ich diese verdammte Tabelle in den neuen Frame kriegen muss.
Aber ich danke dir erstmal für deine Hilfe, und ich werd auf jeden Fall deinen Vorschlag auch nochmal ausprobieren, das war ja ein bisschen anders als ich es hatte.
So, an alle Mitleser, ich habe es immerhin geschafft die Spaltennamen anzuzeigen und die Tabelle im neuen Frame zu öffnen:
EDIT: Ich habs hinbekommen! Die Daten werden ausgelesen und in einem neuen Fenster ausgegeben. Der Rest ist nur noch Feinarbeit, d.h. Klassen ordnen, übersichtlich machen, Spaltengröße, Frameposition....
So, jetzt wollte ich alles noch ein bisschen ordnen, und sobald ich die methoden verbinden() und trennen() in meine Datenbankklasse schiebe, bekomme ich eine NullpointerException. Ich denke es liegt an meiner Tabellenklasse, aber nach einer Stunde debuggen mit wachsamem Auge konnte ich nichts finden
Tabellenklasse:
Java:
public class MyTable extends JTable
{
Object[] dbdata;
MyDB meineDB = new MyDB();
//Achtung hier Übungscode
public JTable autoResizeColWidth (JTable meineTabelle, DefaultTableModel model)
{
int margin = 5;
try
{
for (int i = 0; i < meineDB.rsmd.getColumnCount (); i++)
{
int vColIndex = i;
DefaultTableColumnModel colModel = (DefaultTableColumnModel) meineTabelle.getColumnModel ();
TableColumn col = colModel.getColumn(vColIndex);
int width = 0;
//Breite des Headers
TableCellRenderer renderer = col.getHeaderRenderer ();
if (renderer == null)
{
renderer = meineTabelle.getTableHeader ().getDefaultRenderer ();
}
Component comp = renderer.getTableCellRendererComponent (meineTabelle, col.getHeaderValue (), false, false, 0,0 );
width = comp.getPreferredSize ().width;
//max. Breite der Datensätze
for (int r = 0; r < meineTabelle.getRowCount (); r++)
{
renderer = meineTabelle.getCellRenderer ( r, vColIndex);
comp = renderer.getTableCellRendererComponent ( meineTabelle,
meineTabelle.getValueAt ( r, vColIndex ), false, false, r, vColIndex);
width = Math.max ( width, comp.getPreferredSize ().width);
}
//Rand hinzufügen
width += 2 * margin;
//Breite festlegen
col.setPreferredWidth ( width);
}
((DefaultTableCellRenderer) meineTabelle.getTableHeader ().getDefaultRenderer ()).setHorizontalAlignment ( SwingConstants.LEFT );
//meineTabelle.setAutoCreateRowSorter(true)
meineTabelle.getTableHeader ().setReorderingAllowed (
false);
for (int i = 0; i < meineDB.rsmd.getColumnCount (); i++)
{
TableColumn column = meineTabelle.getColumnModel ().getColumn (
i);
}
}
catch (Exception e)
{
System.out.println("Fehler");
}
return meineTabelle;
public void showTable()
{
Vector columnNames = new Vector();
Vector data = new Vector();
DefaultTableModel model = new DefaultTableModel();
try
{
//Anzahl Spalten
int columns = meineDB.rsmd.getColumnCount();
System.out.println ("Anzahl Spalten: " +columns);
//Spaltennamen auslesen
for (int i = 1; i <= columns; i++)
{
columnNames.addElement ( meineDB.rsmd.getColumnName ( i));
}
System.out.println("Spaltennamen:" +columnNames);
//*******DAS NEUE FENSTER FÜR DIE TABELLE*******//
JTable meineTabelle = new JTable(data,columnNames);
meineTabelle = autoResizeColWidth(meineTabelle, model);
meineTabelle.setAutoResizeMode ( JTable.AUTO_RESIZE_OFF);
meineTabelle.setAutoCreateRowSorter ( true);
// meineTabelle.setModel ( model);
JFrame frame = new JFrame();
frame.setSize ( 800, 500);
frame.setLocation (200,300);
Container content = frame.getContentPane ();
content.setSize ( 800, 500);
content.setLocation ( 200, 300);
content.add ( new JScrollPane(meineTabelle));
frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
//*******Auslesen der Datenbank*******//
//Daten
while (meineDB.rs.next ())
{
Vector row = new Vector (columns);
for (int i = 1; i <= columns; i++)
{
row.addElement ( meineDB.rs.getObject ( i ));
}
data.addElement ( row );
}
meineDB.rs.close();
meineDB.stmt.close();
}
catch (Exception e)
{
System.out.println(e.toString ());
}
}
}
Also die Daten werden ausgelesen, das funktioniert. Ich denke das Problem liegt irgendwo in der Tabellenklasse. Kann es sein, dass die Tabellenklasse noch irgendein Parameter haben will, aber nichts übergeben bekommt von der Datenbankklasse?