简体   繁体   English

更改Jtable单元值

[英]change Jtable Cell Value

I have a jtable that keep book file records and sho them. 我有一个jtable,用于保存书籍文件记录并进行销售。

I create a "Borrow" jbutton that when clicked to a row that not borrowed, The "Borrow Status" of that row should change to "Yes". 我创建了一个“借用” jbutton,当单击到没有借用的行时,该行的“借用状态”应更改为“是”。

I use this codes, but did not changed! 我使用此代码,但没有更改!

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

Second Class: 二等舱:

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

}

Thanks. 谢谢。

To override setValueAt You should use: 覆盖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);
}

Define this method within class user_AllBooks 在类user_AllBooks定义此方法

You have overridden the getValueAt method. 您已重写getValueAt方法。 So it always returns value from your bData arraylist. 因此,它总是从bData返回值。

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

So you need to implement the setValueAt method also in your table model so change actual data in the bData arraylist. 因此,您还需要在表模型中实现setValueAt方法,以便更改bData arraylist中的实际数据。

Also note that bTable.getSelectedRow() will give you selected row in terms of the view. 还要注意, bTable.getSelectedRow()将根据视图为您提供选定的行。 In model the index might be different if the table is sorted. 在模型中,如果表已排序,则索引可能会有所不同。

You could use TableModel#setValueAt , but you would also become responsible for updating the table, which breaks the MCV model. 您可以使用TableModel#setValueAt ,但是您还将负责更新表,这会破坏MCV模型。

Instead, you could add a setBorrowed method to your user_AllBooks class. 相反,您可以将setBorrowed方法添加到user_AllBooks类。

public void setBorrowed(int row, boolean borrowed) {
    BookInformation book = bData.get(row);
    book.setBorrowedState(borrowed);
    fireTableCellUpdated(row, 3);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM