Comment faire pour remplir un jTable à partir d'une liste de tableaux?
Le programme est destiné à prendre de l'entrée de l'utilisateur et de les stocker dans une liste de tableaux. Ensuite, l'utilisateur peut imprimer les détails sur la jtable. Après, il est possible de supprimer un élément à partir de la jtable par la sélection d'une ligne.
J'ai 2 problèmes.
Premier problème est que j'ai des erreurs tout en parcourant la liste de tableaux.
Deuxième problème, c'est lorsque l'utilisateur supprime une ligne, l'élément est supprimé de la table, mais je veux aussi supprimer cet élément en particulier à partir de la matrice de trop. De sorte que si l'utilisateur clique sur le bouton imprimer de nouveau, l'élément n'apparaît pas encore.
Problème ici, une Boucle dans arraylist:
model = (DefaultTableModel) table.getModel();
for (int i=0; i<lib.data.size(); i++){
book = lib.data.get(i);
}
model.addRow(book);
J'ai 3 classes, de Test, de la Bibliothèque et du Livre
De La Classe De Test
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.table.*;
import javax.swing.border.*;
public class Test extends JFrame{
static Library lib = new Library();
static Book book = new Book();
private JFrame frame = new JFrame("Book");
private JPanel panel = new JPanel();
private JLabel label2, label3;
private JTextField textfield1, textfield2;
private JButton button1, button2, button3;
private DefaultTableModel model;
private JTable table;
private JScrollPane pane;
void form(){
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel.setLayout(null);
model = new DefaultTableModel();
table = new JTable(model);
pane = new JScrollPane(table);
model.addColumn("Title");
model.addColumn("Author");
pane.setBounds(11, 221, 125, 21);
panel.add(pane);
pane.setSize(200, 100);
pane.setVisible(true);
setVisible(false);
setSize(60, 60);
label2 = new JLabel("title:");
label2.setBounds(9, 61, 123, 13);
panel.add(label2);
label3 = new JLabel("author:");
label3.setBounds(9, 91, 123, 13);
panel.add(label3);
textfield1 = new JTextField(10);
textfield1.setBounds(121, 63, 125, 21);
panel.add(textfield1);
textfield2 = new JTextField(10);
textfield2.setBounds(121, 93, 125, 21);
panel.add(textfield2);
button1 = new JButton("Store");
button1.setBounds(351, 226, 125, 21);
panel.add(button1);
button2= new JButton("View");
button2.setBounds(351, 256, 125, 21);
panel.add(button2);
button3= new JButton("Delete");
button3.setBounds(351, 286, 125, 21);
panel.add(button3);
frame.add(panel);
frame.setSize(545,540);
frame.setVisible(true);
//Store
button1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String title = textfield1.getText();
String author = textfield2.getText();
book = new Book(title, author);
lib.addBook(book);
System.out.println(book);
}
});
//View
button2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
model = (DefaultTableModel) table.getModel();
String title = textfield1.getText();
String author = textfield2.getText();
book = new Book(title, author);
lib.addBook(book);
book = new Book();
book.setTitle(title);
book.setAuthor(author);
lib.addBook(book);
lib.fireTableDataChanged();
}
});
//Delete
button3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
model = (DefaultTableModel) table.getModel();
int numRows = table.getSelectedRows().length;
for(int i=0; i<numRows ; i++ )
model.removeRow(table.getSelectedRow());
}
});
}
public static void main(String [] args){
Test a = new Test();
a.form();
}
}
Bibliothèque De Classe
import java.util.*;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
class Library extends AbstractTableModel {
List<Book> data;
String[] columnNames = {"Title", "Author"};
public Library() {
data = new ArrayList<Book>();
//data.add(new Book("Java", "William"));
}
@Override
public String getColumnName(int column) {
return columnNames[column];
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Book book = data.get(rowIndex);
switch (columnIndex) {
case 0:
return book.getTitle();
case 1:
return book.getAuthor();
default:
return null;
}
}
public void addBook(Book book){
int firstRow = data.size() - 1;
int lastRow = firstRow;
fireTableRowsInserted(firstRow, lastRow);
data.add(book);
}
public void fireTableDataChanged() {
}
public void removeBook(Book book){
data.remove(book);
}
}
Livre De Classe
public class Book{
private String title;
private String author;
public Book(){
title = "";
author = "";
}
public Book(String title, String author){
this.title = title;
this.author = author;
}
public String getTitle(){
return title;
}
public void setTitle(String title){
title = title;
}
public String getAuthor(){
return author;
}
public void setAuthor(String author){
author = author;
}
public String toString(){
return "Title: " + getTitle() + "\n" +
"Author: " + getAuthor() + "\n";
}
}
MODIFIER
C'est ce que j'ai ajouté à ma bibliothèque de classe:
public void addBook(Book book){
int firstRow = data.size() - 1;
int lastRow = firstRow;
fireTableRowsInserted(firstRow, lastRow);
data.add(book);
}
public void fireTableDataChanged() {
}
C'est ce que j'ai ajouté à ma classe principale (bouton):
book = new Book();
book.setTitle(title);
book.setAuthor(author);
lib.addBook(book);
lib.fireTableDataChanged();
- Désolé. J'ai édité le code et posté les erreurs
- Vous avez oublié d'ajouter les lignes des erreurs.
- Vous n'êtes toujours pas l'affichage du code d'erreur complet. C'est vous dire plus. Notez que le
addRow(...)
méthode existe pour DefaultTableModel, mais pas avec un paramètre Bibliothèque. Vous devez soit utiliser un paramètre approprié (consultez l'API de la classe) ou créer votre propre modèle de classe de la classe AbstractTableModel que le tutoriel vous montre. - Vous n'avez pas les méthodes définies comme
size()
etget()
dansLibrary
classe. Comme ils ne sont pas disponibles, de sorte que vous ne pouvez pas compiler votre programme. Reportez-vous à répondre par@ Hovercraft Full Of Eels
- Je l'ai fait. J'ai édité mon code. Pourriez-vous s'il vous plaît dites ce que je dois ajouter dans ma classe principale pour ajouter les valeurs des objets textfield dans ma jtable.
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez utiliser votre Bibliothèque de classe comme le noyau d'un TableModel, vous pouvez, mais vous aurez besoin de:
getRowCount()
,getColumnCount()
,getColumnClass(...)
,getValueAt(...)
,setValueAt(...)
et, en fait, toutes les méthodes abstraites de la classe AbstractTableModel.addBook(Book book)
méthode aurait besoin d'appeler l'un de l'fireXXX(...)
méthodes de AbstractTableModel à informer les auditeurs de la plus.removeBook(Book book)
méthode que même les feux d'une méthode de notification après la suppression.La JTable tutoriel peut vous aider avec ce que les nombreux exemples affichés sur ce site qui peut être trouvé avec un peu de recherche.
Modifier
Concernant votre dernier code, vous n'êtes toujours pas l'appel à la fireXXX méthodes lorsque le modèle de données de changements, ce qui suggère que vous n'avez pas étudié le tutoriel que j'ai suggéré. Pour ce faire, d'abord comme il peut expliquer les choses loin mieux que nous le pouvons.
Voici le lien: Tutoriel: Comment utiliser des Tableaux
Et voici quelques stackoverflow réponses:
Vous pouvez facilement rechercher StackOverflow pour plus d'exemples. Chance.
Essayer ce code
Pour remplir JTable à partir de votre liste de tableaux, de Livres, vous devez créer DefaultTableModel avec Object[] qui contient les noms de colonnes comme un paramètre, et aussi le nombre de lignes (0) en tant que paramètre. Boucle à travers votre liste de tableaux, d'obtenir le Titre et l'Auteur des champs, les placer dans l'Objet[], ajouter une ligne à un modèle de table à l'aide de cet Objet[] comme paramètre et ensuite définir un modèle de table à l'aide de DefaultTableModel que vous avez créé au début de cette méthode en tant que paramètre. Méthode permettant d'ajouter des données à partir de ArrayList pour JTable:
Maintenant, si vous voulez supprimer un Livre de JTable et également à partir de la liste de tableaux vous pouvez utiliser un Itérateur. Instancier itération de la boucle grâce à l'aide de hasNext() méthode comme condition dans la boucle while. Instancier un nouveau Livre objet à l'aide d'itérateurs méthode next (). Si l'énoncé de vérifier si le titre et l'auteur de ce Livre correspond avec le Titre et l'Auteur de la ligne sélectionnée dans votre JTable. Si vous avez une correspondance itérateur retiré du Livre de ArrayList boucle va s'arrêter à cause de la coupure de la commande. Appelez ensuite la première méthode que j'ai écrit et il montrera tous les Livres de ArrayList, sans que le livre que vous avez supprimé.