L'affichage de JTable dans JFrame
Ce que je veux faire:
Je veux faire la liste des enregistrements d'une base de données. Cette liste doit être affichée dans une JFrame popup.
Description:
J'ai 3 classes:
- Main.java (exécution du programme)
- PeopleTableModel.java (contient des données extends AbstractTableModel)
- PeopleTable.java (contient la logique, s'étend JTable)
Pourquoi j'obtiens une exception ArrayIndexOutOfBoundsException lors de la configuration de ma JFrame visible?
Mise à jour:
Il semble que cette erreur ne s'affiche, lorsque j'utilise mon propre PeopleTable classe. Quand j'assigne la table pour un JTable, il fonctionne.
Voici ma trace de la pile que j'obtiens:
java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
at java.util.Vector.elementAt(Vector.java:470)
at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:294)
at javax.swing.JTable.getCellRect(JTable.java:2969)
at javax.swing.plaf.basic.BasicTableUI.createTableSize(BasicTableUI.java:1694)
at javax.swing.plaf.basic.BasicTableUI.getPreferredSize(BasicTableUI.java:1733)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1660)
at javax.swing.ScrollPaneLayout.preferredLayoutSize(ScrollPaneLayout.java:495)
at java.awt.Container.preferredSize(Container.java:1788)
at java.awt.Container.getPreferredSize(Container.java:1773)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
at java.awt.BorderLayout.preferredLayoutSize(BorderLayout.java:719)
at java.awt.Container.preferredSize(Container.java:1788)
at java.awt.Container.getPreferredSize(Container.java:1773)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
at javax.swing.JRootPane$RootLayout.preferredLayoutSize(JRootPane.java:917)
at java.awt.Container.preferredSize(Container.java:1788)
at java.awt.Container.getPreferredSize(Container.java:1773)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
at java.awt.BorderLayout.preferredLayoutSize(BorderLayout.java:719)
at java.awt.Container.preferredSize(Container.java:1788)
at java.awt.Container.getPreferredSize(Container.java:1773)
at java.awt.Window.pack(Window.java:809)
at ch.bs.jsd.personen.Main.main(Main.java:67)
Et c'est tout mon code:
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
public class Main {
public static void main(String[] args) {
ArrayList<String[]> result = new ArrayList<String[]>();
SQLConnection sql = new SQLConnection();
String OBNr = "";
String firstName = "";
String lastName = "";
String qry = "SELECT loginid,ctitle as Grad,"
+ "name+' '+firstname as SachB,"
+ "cposition as Tour,Ressort,"
+ "left(location,2) as FNr "
+ "FROM dbo.abf_muPostenAdressen "
+ "WHERE loginid LIKE '%" + OBNr + "%'"
+ "AND name LIKE '%" + lastName + "%'"
+ "AND firstname LIKE '%" + firstName + "%'";
try {
ResultSet rs = sql.getConnection().prepareStatement(qry).executeQuery();
while (rs.next()) {
result.add(new String[]{
Integer.toString(rs.getRow()),
rs.getString("loginid"),
rs.getString("Grad"),
rs.getString("SachB"),
rs.getString("Tour"),
rs.getString("Ressort"),
rs.getString("FNr")
});
}
if (result.size() != 0) {
String[] selectedData = null;
if (result.size() > 1) {
String[] title = {"#", "loginid", "Grad", "SachB", "Tour",
"Ressort", "FNr"};
TableModel model = new PeopleTableModel(title, parse_2d_array(result));
JTable table = new PeopleTable(model);
JFrame frame = new JFrame();
frame.getContentPane().add(new JScrollPane(table));
frame.setVisible(true);
while (table.getSelectedRow() != -1) {
}
selectedData = result.get(table.getSelectedRow());
frame.dispose();
} else {
selectedData = result.get(0);
}
System.out.println(join(selectedData, ", "));
}
} catch (Exception e) {
e.printStackTrace();
}
sql.closeConnection();
}
private static String join(String[] s, String delimiter) {
if (s.length == 0) {
return null;
}
StringBuilder out = new StringBuilder();
out.append(s[0]);
for (int i = 1; i < s.length; ++i) {
out.append(delimiter).append(s[i]);
}
return out.toString();
}
private static String[][] parse_2d_array(ArrayList<String[]> al) {
String[][] data = new String[al.size()][6];
for (int i = 0; i < al.size(); i++) {
data[i] = al.get(i);
}
return data;
}
}
class PeopleTableModel extends AbstractTableModel {
private static final long serialVersionUID = -1080095595481949205L;
private String[] title;
private Object[][] data;
public PeopleTableModel(String[] title, Object[][] data) {
this.title = title;
this.data = data;
}
@Override
public int getColumnCount() {
return title.length;
}
@Override
public int getRowCount() {
return data.length;
}
@Override
public Object getValueAt(int row, int col) {
return data[row][col];
}
@Override
public String getColumnName(int column) {
return title[column];
}
}
class PeopleTable extends JTable {
private static final long serialVersionUID = -1080095595481949205L;
private JTable table;
private int selectedRow = -1;
private StringBuilder pressedKeys = new StringBuilder();
private long now = 0;
private long last = 0;
public PeopleTable(TableModel model) {
table = new JTable(model);
table.addMouseListener(new java.awt.event.MouseAdapter() {
@Override
public void mouseClicked(java.awt.event.MouseEvent e) {
if (e.getClickCount() == 2) {
setSelectedRow(table.rowAtPoint(e.getPoint()));
}
}
});
table.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent evt) {
}
@Override
public void keyReleased(KeyEvent evt) {
}
@Override
public void keyPressed(KeyEvent evt) {
int key = evt.getKeyCode();
//add only numbers
if ((key > 47 && key < 58) || (key > 95 && key < 106)) {
last = now == 0 ? 0 : now;
now = evt.getWhen();
if (now - last > 700) {
pressedKeys = new StringBuilder();
}
pressedKeys.append(evt.getKeyChar());
int row = Integer.parseInt(pressedKeys.toString()) - 1;
table.setRowSelectionInterval(row, row);
table.scrollRectToVisible(table.getCellRect(row, 0, true));
} else if (key == KeyEvent.VK_ENTER) {
if (pressedKeys.length() == 0) {
pressedKeys.append(1);
}
setSelectedRow(Integer.parseInt(pressedKeys.toString()) - 1);
}
}
});
}
public JTable getTable() {
return table;
}
private void setSelectedRow(int i) {
selectedRow = i;
}
@Override
public int getSelectedRow() {
return selectedRow;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
@Override
public int getColumnCount() {
return table.getColumnCount();
}
@Override
public int getRowCount() {
return table.getRowCount();
}
@Override
public Object getValueAt(int row, int col) {
return table.getValueAt(row, col);
}
}
Question supplémentaire: Est-il un meilleur moyen d'atteindre mon but, ou cela pourrait-il être déclaré en tant que meilleure pratique?
Il est impossible de dire quoi que ce soit sans le code complet de
Pouvez-vous nous montrer la trace de la pile? J'ai peur que ce soit
(pas de fonctionnement en vous code) au début de déplacer toutes les méthodes commençant par isCellEditable pour le modèle, dans le cas des exceptions pourront être portées éditer votre message avec le code exécutable (contient les principales méthodes) , btw, vous pouvez mettre toutes les classes de l'un
pour le pourquoi, la raison est KeyListener, supprimer et mettre à jour ce fil à la prochaine question à propos de getColumnClass
Et qu'est-ce que la variable d'instance
PeopleTableModel
et PeopleTable
. S'il vous plaît essayer de fournir une SSCCE.Pouvez-vous nous montrer la trace de la pile? J'ai peur que ce soit
PeopleTableModel
ou PeopleTable
est à blâmer.(pas de fonctionnement en vous code) au début de déplacer toutes les méthodes commençant par isCellEditable pour le modèle, dans le cas des exceptions pourront être portées éditer votre message avec le code exécutable (contient les principales méthodes) , btw, vous pouvez mettre toutes les classes de l'un
pour le pourquoi, la raison est KeyListener, supprimer et mettre à jour ce fil à la prochaine question à propos de getColumnClass
Et qu'est-ce que la variable d'instance
table
à l'intérieur de votre classe PeopleTable
? Vraiment, vous devez le supprimer.
OriginalL'auteur bamboocha | 2012-11-09
Vous devez vous connecter pour publier un commentaire.
voir JTable tutoriel, tout ce qui y sont décrits
Je ne vois pas là de raison d'utiliser
AbstractTableModel
, aucune idée pourquoi s'embêter pourJTable
contient un nombre réel de lignes & colonnes (jusqu'à500
/1000
&20
/50
), démarrer avecDefaultTableModel
au lieuou modifier
DefaultTableModel
avec cette AbstractTableModelpouvez commencer avec
désolé, ne pas continuer à developt votre code, sera en route pour la throubles
pourquoi êtes-vous en train de dire cela? est-ce code si mauvais/sale?
très mal, vraiment naturelle contre le rulles 🙂 1. ne pas, ne jamais créer des interfaces graphiques à l'intérieur de la connexion JDBC, 2. Jeu de résultats.close() dans le bloc finally, sinon l'augmentation de la mémoire JVM 3. ajouter des éléments directement dans l'Objet[], recréer cet objet dans la boucle avant de prendre de la valeur à partir de la prochaine fow à partir de la Base de données, et le reste décrit tout dans mes commentaires, remplacer Keylistener avec filtrage dans la JTable (qui ne seront jamais des œuvres, ni stable) changement ColumnClass, alors là, vous pouvez mettre de l'Icône, le Double, String, Boolean directement (voir le lien dans ma réponse sur abstractTable ...) et un autre 🙂 désolé
pouah.. on dirait qu'il ya un long chemin à parcourir.. 🙂 je suis assez nouveau (juste fini mon apprentissage en tant que développeur de logiciels), il y a beaucoup à découvrir. J'espère que je ne dérange pas les autres ici. peut le codereview site de stackoverflow un meilleur endroit pour moi pour l'instant?
OriginalL'auteur mKorbel
Vous n'avez pas besoin d'écrire beaucoup de lignes de code pour afficher un fichier. Il suffit de télécharger le fichier jar rs2xml et l'ajouter à votre bibliothèque de projet.
Remarque: Cette fonction sera utile si vous êtes à l'aide de netbeans
Comment l'utiliser?
Écrivez votre requête:
OriginalL'auteur javababy