更改Jtable单元格值
我有一个jtable保留书籍文件记录和sho它们。更改Jtable单元格值
我创建了一个“借用”jbutton,当点击一个不借用的行时,该行的“借入状态”应该变为“是”。
我使用此代码,但没有改变!
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();
}
}
感谢。
要覆盖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
类
应该没有必要在setValueAt中调用fireTableDataChanged,因为普通的可编辑表将为您执行此操作。可能更好地使用setBorrowed方法 – MadProgrammer 2013-02-11 19:03:54
@MadProgrammer:我添加了这个方法来确保更改的值肯定会反映在表中。是不必要的电话? – 2013-02-11 19:07:27
这种方法是否适合setBorrow或不? – Sajad 2013-02-11 19:07:30
您已重写getValueAt方法。所以它总是从你的阵列列表中返回值。
public Object getValueAt(int rowIndex, int columnIndex) {
BookInformation bookInf=bData.get(rowIndex);
所以,你需要实现setValueAt方法也是在你的表格模型,以便更改bData
ArrayList的实际数据。
另请注意,bTable.getSelectedRow()
将根据视图给出所选行。在模型中,如果对表进行排序,则索引可能会有所不同。
内定义这个方法你可以使用TableModel#setValueAt
,但你也将成为负责更新的表,它打破了MCV模型。
相反,您可以将setBorrowed
方法添加到user_AllBooks
类中。
public void setBorrowed(int row, boolean borrowed) {
BookInformation book = bData.get(row);
book.setBorrowedState(borrowed);
fireTableCellUpdated(row, 3);
}
-1,这是setValueAt()方法的工作。首先它更新包含模型数据的数据结构。然后TableModel负责在单元格内容发生变化时通知表格。 TableModel通过调用fireTableCellUpdated(...)方法来完成此操作,这与您在此处完成的操作相同。这可以被认为是一个调用setValueAt(借用,行,3)的便利方法。 – camickr 2013-02-11 23:03:55
@camickr谢谢你至少告诉我为什么我是一个冲洗袋;) - 很感激。我看了一下'DefaultTableModel',它确实使用'fireTableCellUpdated'。我关心的是(我希望你能帮助我),当使用'AbstractTableModel'时,我从来没有必要调用它,因为表似乎会自动更新它自己。发射另一个事件是否有点矫枉过正,可能导致双重打印? (当然,在大多数情况下,它是一个单元格,只是对另一个视点感兴趣) – MadProgrammer 2013-02-12 00:30:38
使用setValueAt(...)方法将编辑器中的数据保存到模型中。然后编辑器从表中删除,导致单元被重新绘制。因此,即使setValueAt(...)方法未触发更新事件,您仍然可以使用新值重绘表。但是,当数据发生变化时,通知视图肯定是模型的责任。双重重绘是由JTable实现编辑代码的方式引起的。 – camickr 2013-02-12 02:34:16
您没有重写'user_AllBooks'中的'setValueAt'。您应该 – 2013-02-11 18:49:26