2010-08-10 16 views
1

J'utilise ListTableModel et RowTableModel de Camick d'ici http://tips4java.wordpress.com/2009/03/12/table-from-database/En utilisant la ListTableModel de Rob Camick, mais JTable ne marche pas montrer

Cependant, la JTable n'apparaît pas. Quelqu'un sait-il pourquoi? Je ne reçois aucune erreur.

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.sql.*; 

public class AddressBook { 

    JLabel name, address, phone, email; 
    JTextField nameField, addressField, phoneField, emailField; 
    JButton addPerson, addEntry, cancelEntry; 
    JTable table; 
    ListTableModel model; 
    JDialog addEntryDialog; 
    String[] headings = {"Name", "Address", "Phone #", "Email"}; 

    AddressBook() { 
     try { 
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); 
     } catch (ClassNotFoundException e) { 
      System.out.println(e); 
     } 

     try { 
      Connection con = DriverManager.getConnection("jdbc:derby://localhost:1527/AddressBook", "addressbook", "addressbook"); 
      Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 

      ResultSet rs = stmt.executeQuery("SELECT * FROM APP.ADDRESSBOOK"); 
      ListTableModel model = ListTableModel.createModelFromResultSet(rs); 

      rs.close(); 
      //resultset.close(); 
      stmt.close(); 
      con.close(); 

     } catch(SQLException e){ 
      System.err.println(e); 
     } 

     JFrame frame = new JFrame("Address Book"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(500, 500); 
     frame.getContentPane().setLayout(new FlowLayout()); 

     ButtonListener listener = new ButtonListener(); 

     addPerson = new JButton("New Entry"); 
     addPerson.addActionListener(listener); 

     table = new JTable(model); 
     JScrollPane scroll = new JScrollPane(table); 
     scroll.setPreferredSize(new Dimension(500, 490)); 

     //Add a person Dialog 

     name = new JLabel("Name:"); 
     address = new JLabel("Address:"); 
     phone = new JLabel("Phone:"); 
     email = new JLabel("Email:"); 

     nameField = new JTextField(8); 
     addressField = new JTextField(8); 
     phoneField = new JTextField(8); 
     emailField = new JTextField(8); 

     addEntry = new JButton("Save"); 
     addEntry.addActionListener(listener); 
     cancelEntry = new JButton("Cancel"); 
     cancelEntry.addActionListener(listener); 

     addEntryDialog = new JDialog(frame, "Add a Person"); 
     addEntryDialog.setSize(190, 300); 
     addEntryDialog.getContentPane().setLayout(new FlowLayout()); 

     addEntryDialog.getContentPane().add(name); 
     addEntryDialog.getContentPane().add(nameField); 
     addEntryDialog.getContentPane().add(address); 
     addEntryDialog.getContentPane().add(addressField); 
     addEntryDialog.getContentPane().add(phone); 
     addEntryDialog.getContentPane().add(phoneField); 
     addEntryDialog.getContentPane().add(email); 
     addEntryDialog.getContentPane().add(emailField); 
     addEntryDialog.getContentPane().add(cancelEntry); 
     addEntryDialog.getContentPane().add(addEntry); 

     //end of Add a person dialog 

     frame.getContentPane().add(addPerson); 
     frame.getContentPane().add(table); 
     frame.setVisible(true); 
    } 

    class ButtonListener implements ActionListener { 

     public void actionPerformed(ActionEvent event) { 
      JButton source = (JButton) event.getSource(); 

      if (source == addPerson) { 
       addEntryDialog.setVisible(true); 
      } 
      if (source == addEntry) { 
       //add to db 
      } 
      if (source == cancelEntry) { 
       addEntryDialog.setVisible(false); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       new AddressBook(); 
      } 
     }); 
    } 
} 
+0

Si vous commentez tout le code de la base de données et que vous créez simplement un JTable() par défaut, pouvez-vous l'afficher? – I82Much

Répondre

3

Prendre un second regard sur votre code le problème est que vous avez défini la variable « modèle » comme une variable de classe et une variable d'instance. La variable d'instance contient les données du ResultSet. La variable de classe utilisée pour créer la table est null. Le code doit être:

//ListTableModel model = ListTableModel.createModelFromResultSet(rs); 
model = ListTableModel.createModelFromResultSet(rs); 
+0

yup, c'est probablement ça. J'ai vu la partie scrollpane (années de débogage de code de l'interface utilisateur), mais cela semble être le vrai problème. le problème du volet de défilement est seulement de pas d'en-têtes/etc. –

+0

Oui c'était le problème, merci. En outre, est la seule façon d'ajouter des en-têtes est d'utiliser passer un TableColumnModel à JTableHeader et utiliser setTable()? – Raptrex

1

Eh bien, vous l'ajoutez à un panneau de défilement et vous ne l'ajoutez pas au panneau de contenu. vous venez d'ajouter la table.

sans le scrollpane, vous n'aurez aucun en-tête de colonne. et sans aucune donnée, la table a-t-elle une taille préférée de 0x0?

frame.getContentPane().add(addPerson); 
    frame.getContentPane().add(**scroll**); 
    frame.setVisible(true); 
+0

J'ai ajouté le scrollpane au contentpane et il y a des données dans la base de données, cependant, rien ne s'affiche encore. – Raptrex

+0

+1, je viens de faire un test sur un ResultSet avec 0 lignes. La largeur préférée a une valeur puisque le modèle connaît les colonnes de la table. Cependant, la hauteur préférée est 0, donc la table ne s'affiche pas. Toutefois, lorsque le volet de défilement est ajouté à l'image, les en-têtes s'affichent comme prévu. – camickr