Gewusst wie: füllen einer jTable aus einer ArrayList?
Das Programm ist gedacht, um die Benutzer-Eingabe und speichern Sie in einer arraylist. Der Benutzer kann dann drucken Sie die details auf der jtable. Nach, er kann Sie entfernen ein Element aus der jtable, indem Sie die entsprechende Zeile auswählen.
Habe ich 2 Probleme.
Erste problem ist, dass ich den Fehler beim Durchlaufen der arraylist.
Zweite problem ist, wenn der Benutzer löscht eine Zeile, wird der Eintrag aus der Tabelle entfernt, aber ich will auch löschen, bestimmte Element aus dem array zu. So dass, wenn der Benutzer klickt auf die Schaltfläche "drucken" erneut, wird das Element nicht mehr angezeigt.
Problem hier, beim Durchlaufen der arraylist:
model = (DefaultTableModel) table.getModel();
for (int i=0; i<lib.data.size(); i++){
book = lib.data.get(i);
}
model.addRow(book);
Ich habe 3 Klassen -, Test -, Library und Book -
Test-Klasse
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();
}
}
Bibliothek-Klasse
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);
}
}
Buch Klasse
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";
}
}
BEARBEITEN
Dies ist, was ich Hinzugefügt, um meine Bibliothek-Klasse:
public void addBook(Book book){
int firstRow = data.size() - 1;
int lastRow = firstRow;
fireTableRowsInserted(firstRow, lastRow);
data.add(book);
}
public void fireTableDataChanged() {
}
Dies ist, was ich Hinzugefügt, um meine main Klasse (Schaltfläche):
book = new Book();
book.setTitle(title);
book.setAuthor(author);
lib.addBook(book);
lib.fireTableDataChanged();
Sie vergessen haben, fügen Sie die Zeilen der Fehler.
Du bist immer noch nicht posten Sie die komplette Fehlermeldung. Es sagt Ihnen mehr. Beachten Sie, dass die
addRow(...)
Methode existiert für DefaultTableModel, aber nicht mit einer Bibliothek parameter. Sie müssen entweder mit einem richtigen parameter (check-out die API für die Klasse) oder erstellen Sie Ihre eigene model-Klasse von der Klasse AbstractTableModel als das tutorial zeigt Ihnen.Sie haben nicht definierten Methoden, wie
size()
und get()
im Library
Klasse. Da Sie nicht verfügbar sind, so können Sie nicht kompilieren Sie Ihr Programm. Siehe Antwort von @ Hovercraft Full Of Eels
Das habe ich getan. Ich bearbeitete meinen code. Könnten Sie mir bitte sagen, was ich brauche, um in meiner main-Klasse um die Werte von Textfeldern in meiner jtable.
InformationsquelleAutor |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie verwenden möchten Ihre-Bibliothek-Klasse als Kern für ein TableModel, das können Sie, aber müssen Sie:
getRowCount()
,getColumnCount()
,getColumnClass(...)
,getValueAt(...)
,setValueAt(...)
und in der Tat alle abstrakten Methoden der Klasse AbstractTableModel.addBook(Book book)
Methode nennen müsste einer derfireXXX(...)
Methoden von AbstractTableModel zu Benachrichtigen, die die Zuhörer von den Zusatz.removeBook(Book book)
Methode, die ebenfalls feuert eine Benachrichtigung-Methode nach Entfernung.Dem JTable tutorial kann Ihnen helfen, weiter mit diesem können die vielen Beispiele, die auf dieser Website veröffentlicht, die gefunden werden können, mit ein wenig suchen.
Bearbeiten
Über Ihre neuesten code, du bist immer noch nicht beim aufrufen einer fireXXX Methoden auf, wenn das Modell die Daten verändert, was darauf schließen lässt, dass Sie noch nicht studiert, das tutorial, wie ich vorgeschlagen habe. Bitte tun Sie dies zunächst als kann Sie die Dinge erklären weit besser als wir können.
Hier ist der link: Tutorial: How to use Tables
Und hier sind einige nützliche stackoverflow Antworten:
Können Sie ganz einfach suchen StackOverflow für weitere Beispiele. Glück.
siehe edit zu beantworten.
Siehe mein edit bitte. Auch, muss ich fügen Sie diesen code in meine getvalueat-Methode? fireTableDataChanged(rowIndex, columnIndex);
InformationsquelleAutor Hovercraft Full Of Eels
Versuchen, diesen code
InformationsquelleAutor
Auffüllen JTable aus deiner ArrayList Bücher, die Sie benötigen, zu erstellen DefaultTableModel mit Object [], die die Spaltennamen enthält als parameter, und auch die Anzahl der Zeilen (beginnen mit 0) als parameter. Schleife über die ArrayList, bekommen Titel und Autor-Felder, legen Sie Sie in " Object []", Sie Zeile hinzufügen, um der Tabelle Modell verwenden, Object[] als parameter, und legen Sie dann die Tabelle Modell mit DefaultTableModel, die Sie erstellt haben zu Beginn dieser Methode als parameter. Methode für das hinzufügen von Daten aus der ArrayList zu JTable:
Nun, wenn Sie wollen, löschen Sie ein ausgewähltes Buch aus JTable und auch von ArrayList, die Sie nutzen könnten Iterator. Iterator instanziieren, Durchlaufen Sie mit hasNext () - Methode als Bedingung in der while-Schleife. Instanziieren neues Buch-Objekt mithilfe von Iteratoren next () - Methode. In der if-Anweisung prüfen, ob der Titel und der Verfasser von diesem Buch passt mit Titel und Autor, der aus der ausgewählten Zeile in der JTable. Wenn Sie ein match-iterator wird, entfernen Sie das Buch aus der ArrayList-Schleife wird beendet, da der break-Befehl. Dann rufen Sie zuerst die Methode, die ich schrieb, und es wird sich zeigen, alle Bücher aus der ArrayList-ohne, dass das Buch, das Sie gelöscht.
InformationsquelleAutor