1

我有一个 jtable 保存书籍文件记录并显示它们。

我创建了一个“借用”按钮,当单击未借用的行时,该行的“借用状态”应更改为“是”。

我使用这个代码,但没有改变!

public class user_AllBooks extends AbstractTableModel{
BookInformation book_info=new BookInformation();
String[] columns=new String[]{"Book Name","Book Date", "Book ID","Borrow Status"};
ArrayList<BookInformation> bData=new ArrayList<BookInformation>();

public user_AllBooks(){
    try{
        BufferedReader br=new BufferedReader(new FileReader("AllBookRecords.txt"));
        String line;
        while((line = br.readLine()) != null){
            bData.add(initializeBookData(line));
        }
        br.close();
    }
    catch(IOException ioe){

    }
}

public BookInformation initializeBookData(String myline){
    BookInformation book_infos=new BookInformation();
    String[] celledLine=myline.split("     ");
    book_infos.setBookName(celledLine[0]);
    book_infos.setBookDate(celledLine[1]);
    book_infos.setBookID(celledLine[2]);
    book_infos.setBorrowStatus(celledLine[3]);
    return book_infos;
}

@Override
public String getColumnName(int col){
    return columns[col];
}

@Override
public int getRowCount() {
    if(bData != null){
        return bData.size();
    }
    else{
        return 0;
    }
}

@Override
public int getColumnCount() {
    return columns.length;
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    BookInformation bookInf=bData.get(rowIndex);
    Object value;

    switch(columnIndex){     
        case 0:
            value=bookInf.getBookName();
            break;
        case 1:
            value=bookInf.getBookDate();
            break;
        case 2:
            value=bookInf.getBookID();
            break;
        case 3:
            value=bookInf.getBorrowStatus();
            break;
        default :
            value="...";
    }
    return value;    
}
}

二等:

public class user_AllBooksM extends JFrame implements ActionListener{
user_AllBooks uAllBooks=new user_AllBooks();
final JTable bTable=new JTable(uAllBooks);
JButton borrowButton;
public user_AllBooksM(){
    setTitle("All Books");
    exitButton=new JButton("Exit");
    borrowButton=new JButton("Borrow");
    borrowButton.addActionListener(this);
    JPanel Bpanel=new JPanel();
    Bpanel.setLayout(new FlowLayout());
    JScrollPane sp=new JScrollPane(bTable);
    Bpanel.add(sp);
    Bpanel.add(borrowButton);
    this.add(Bpanel);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setBounds(300, 60, 550, 550);
    this.setResizable(false);
    this.setVisible(true);
}

@Override
public void actionPerformed(ActionEvent event) {
        borrowInitialize(bTable.getSelectedRow());  
}

public void  borrowInitialize(int row){
    if(uAllBooks.getValueAt(row, 3).equals("yes")) {
        JOptionPane.showMessageDialog(null, "This Book Was Borrowed");
    }
    else{
        uAllBooks.setValueAt("Yes", row, 3);
        uAllBooks.fireTableRowsUpdated(row, row);
    }
}

public static void main(String[] args){
    new user_AllBooksM();
}

}

谢谢。

4

3 回答 3

5

要覆盖setValueAt您应该使用:

@Override
public void setValueAt(Object value, int row, int col)
{
    BookInformation book_infos = bData.get(row);
    if (col==0)
    book_infos.setBookName((String)value);
    else if (col==1)
    book_infos.setBookDate((String)value);
    else if (col==2)
    book_infos.setBookID((String)value);
    else if (col==3)
    book_infos.setBorrowStatus((String)value);
    fireTableCellUpdated(row,col);
}

在类中定义此方法user_AllBooks

于 2013-02-11T18:59:50.400 回答
3

您已经覆盖了 getValueAt 方法。所以它总是从你的bData数组列表中返回值。

public Object getValueAt(int rowIndex, int columnIndex) {
    BookInformation bookInf=bData.get(rowIndex);

因此,您还需要在表模型中实现 setValueAt 方法,以便更改数组列表中的实际数据bData

另请注意,这bTable.getSelectedRow() 将为您提供视图方面的选定行。在模型中,如果表已排序,索引可能会有所不同。

于 2013-02-11T18:47:03.693 回答
3

您可以使用TableModel#setValueAt,但您也将负责更新表,这会破坏 MCV 模型。

相反,您可以向您的类添加一个setBorrowed方法。user_AllBooks

public void setBorrowed(int row, boolean borrowed) {
    BookInformation book = bData.get(row);
    book.setBorrowedState(borrowed);
    fireTableCellUpdated(row, 3);
}
于 2013-02-11T19:16:26.910 回答