2013-11-15 3 views
1

Программа предназначена для ввода пользователя и сохранения его в arraylist. Затем пользователь может распечатать детали на jtable. После этого он может удалить элемент из jtable, выбрав строку.Как заполнить jTable из ArrayList?

У меня есть 2 проблемы.

Первая проблема заключается в том, что я получаю ошибки при прохождении через arraylist.

Вторая проблема заключается в том, что пользователь удаляет строку, элемент удаляется из таблицы, но я также хочу удалить этот конкретный элемент из массива. Чтобы пользователь снова нажимал кнопку печати, элемент снова не отображается.

Проблема здесь, Перебор ArrayList:

model = (DefaultTableModel) table.getModel(); 
    for (int i=0; i<lib.data.size(); i++){ 
      book = lib.data.get(i); 

    } 

    model.addRow(book); 

У меня есть 3-х классов, тестирования, библиотека и бронирование

испытаний Класс

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(); 
     } 


    } 

Library Class

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); 
} 
    } 

Книга Класс

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"; 

    } 

    } 

EDIT

Это то, что я добавил в мой класс библиотеки:

 public void addBook(Book book){ 

    int firstRow = data.size() - 1; 
    int lastRow = firstRow; 
    fireTableRowsInserted(firstRow, lastRow); 
    data.add(book); 

} 

public void fireTableDataChanged() { 

} 

Это то, что я добавил к моему основному классу (кнопка):

  book = new Book(); 
    book.setTitle(title); 
    book.setAuthor(author); 
    lib.addBook(book); 
    lib.fireTableDataChanged(); 
+0

Извините. Я отредактировал код и разместил ошибки – user2994263

+0

Вы забыли добавить строки ошибок. – m0skit0

+0

Вы по-прежнему не публикуете полное сообщение об ошибке. Это говорит вам больше. Обратите внимание, что метод 'addRow (...)' существует для DefaultTableModel, но не с параметром Library. Вам нужно либо использовать правильный параметр (проверить API для класса), либо создать собственный класс модели из класса AbstractTableModel, как показывает вам учебник. –

ответ

3

Если вы хотите использовать свой класс библиотеки как ядро ​​TableModel, лет у можете, но вам нужно:

  • имеют класс Библиотека расширить AbstractTableModel
  • Библиотека потребуется больше методов, таких как getRowCount(), getColumnCount(), getColumnClass(...), getValueAt(...), setValueAt(...) и в самом деле все абстрактные методы из AbstractTableModel класс.
  • Метод addBook(Book book) должен был бы вызвать один из методов AbstractTableModel fireXXX(...), чтобы уведомить слушателей о добавлении.
  • Рассмотрите возможность использования метода removeBook(Book book), который также вызывает способ уведомления после удаления.

Учебник JTable может помочь вам в дальнейшем, так же как и множество примеров, размещенных на этом сайте, которые можно найти с небольшим поиском.


Редактировать
Что касается вашего последнего кода, вы все еще не вызывая каких-либо методов fireXXX, когда данные изменения модели, что говорит о том, что вы не изучали учебник, как я предложил.Пожалуйста, сделайте это первым, так как он может объяснить вещи далеко лучше, чем мы можем.

Вот ссылка: Tutorial: How to use Tables
А вот некоторые полезные StackOverflow ответы:

Вы можете легко найти StackOverflow для получения дополнительных примеров. Удача.

+0

Я сделал это. Я редактировал свой код. Не могли бы вы рассказать, что мне нужно добавить в мой основной класс, чтобы добавить значения текстовых полей в мою jtable. – user2994263

+0

@ user2994263: см. Править для ответа. –

+0

См. Мои правки, пожалуйста. Кроме того, должен ли я добавить этот код к моему методу getvalueat? fireTableDataChanged (rowIndex, columnIndex); – user2994263

1

Попробуйте этот код

JTable booktable = new JTable(); 


      String[] colName = { "Call No", "Name", "Category", "Author ", 
        "Publisher", "From", "Price", "Remarks" ,"Edit/Delete"}; 
      booktable.getTableHeader().setBackground(Color.WHITE); 
      booktable.getTableHeader().setForeground(Color.BLUE); 
      Font Tablefont = new Font("Book Details", Font.BOLD, 12); 
      booktable.getTableHeader().setFont(Tablefont); 

      List<Book> books = new ArrayList<Book>(); 
      books = ServiceFactory.getBookService().findAllBook(); 

      Object[][] object = new Object[100][100]; 
      int i = 0; 
      if (books.size() != 0) { 
       for (Book book : books) { 
        object[i][0] = book.getCallNo(); 
        object[i][1] = book.getName(); 
        object[i][2] = book.getCategory_id().getName(); 
        object[i][3] = book.getAuthor(); 
        object[i][4] = book.getPublisher(); 
        object[i][5] = book.getFrom(); 
        object[i][6] = book.getPrice(); 
        object[i][7] = book.getRemark(); 
        object[i][8] = getEditDeleteButton(); 
        i++; 
        booktable = new JTable(object, colName); 
       } 
      } 
1

заселить JTable из вашего ArrayList книг, вам нужно создать DefaultTableModel с Object [], который содержит имена столбцов в качестве параметра, а также количества строк (начиная с 0) как параметр. Прокрутите свой ArrayList, получите поля Title и Author, поместите их в Object [], добавьте модель строки в таблицу, используя этот Object [] в качестве параметра, а затем установите модель таблицы, используя DefaultTableModel, которую вы создали в начале этого метода в качестве параметра. Метод добавления данных из ArrayList в JTable:

public void showDataInTable(ArrayList<Book> listOfBooks, JTable table){ 
    DefaultTableModel model = new DefaultTableModel(new Object[]{"Title", "Author"}, 0); 
    for(Book book:listOfBooks){ 
      model.addRow(new Object[]{book.getTitle(), book.getAuthor()}); 
    } 
    table.setModel(model); 
} 

Теперь, если вы хотите удалить выбранную книгу из JTable, а также из ArrayList можно использовать итератор. Игнорируйте итератор, пропустите его, используя метод hasNext() как условие во время цикла. Создайте новый объект Book с помощью метода next() iterators. В инструкции if проверьте, совпадает ли название и автор из этой Книги с заголовком и автором из выбранной строки в JTable. Если у вас есть итератор совпадений, этот цикл из цикла ArrayList будет остановлен из-за команды break. Затем вызовите первый метод, который я написал, и он отобразит все книги из ArrayList без этой книги, которую вы удалили.

public void deleteRecord(JTable table, ArrayList<Book> listOfBooks){ 
     Iterator<Book> it = listOfBooks.iterator(); 
     while(it.hasNext()){ 
       Book book = it.next(); 
       if(book.getTitle.equals(String.valueOf(table.getValueAt(table.getSelectedRow(), 0))) && book.getAuthor.equals(String.valueOf(table.getValueAt(table.getSelectedRow(), 1)))){ 
       it.remove(); 
       break; 
       } 
     } 
     showDataInTable(listOfBooks, table); 
    } 
Смежные вопросы