2014-01-31 56 views
0

我有ReadXMLFile獲取數據,我將數據保存到ArrayList,然後從此ArrayList打印表格,單元格可編輯,我想編輯單元格或刪除行,那麼我應該如何是否將結果保存到XML?另外我想更新表格,當xml文件將通過例子在記事本外被修改。編輯jTable並將結果保存到XML

package net.kxyz; 

    import java.awt.Dimension; 
    import java.awt.GridLayout; 
    import java.util.ArrayList; 
    import javax.swing.JScrollPane; 
    import javax.swing.JTable; 
    import javax.swing.table.AbstractTableModel; 

    /** 
    * 
     * @author kuman 
    */ 
    public class Table extends javax.swing.JPanel { 

ReadXMLFile readXMLFile = new ReadXMLFile(); 
/** 
* Creates new form Table 
*/ 
private boolean DEBUG = false; 

public Table() { 

     super(new GridLayout(1, 0)); 
     System.out.println("SIEMANKO TABLE"); 
     readXMLFile.Read(); 
     ArrayList<Book> list = readXMLFile.getBook(); 

     list.add(new Book("3", "TYT", "AYUT", "231423")); 
     list.get(0); 
     JTable table = new JTable(new MyTableModel(list)); 
     table.setPreferredScrollableViewportSize(new Dimension(500, 70)); 
     table.setFillsViewportHeight(true); 
     table.isCellEditable(0, 0); 
     JScrollPane scrollPane = new JScrollPane(table); 
     add(scrollPane); 
} 

/** 
* This method is called from within the constructor to initialize the form. 
* WARNING: Do NOT modify this code. The content of this method is always 
* regenerated by the Form Editor. 
*/ 
@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code"> 
private void initComponents() { 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); 
    this.setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 400, Short.MAX_VALUE) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 300, Short.MAX_VALUE) 
    ); 
}// </editor-fold> 
// Variables declaration - do not modify 
// End of variables declaration 
    } 


    class MyTableModel extends AbstractTableModel { 
     private String[] columnNames = { "ID", "Title", "Author", 
       "Year", "State" }; 
     ArrayList<Book> list = null; 

     MyTableModel(ArrayList<Book> list) { 
      this.list = list; 
     } 

     public int getColumnCount() { 
      return columnNames.length; 
     } 

     public int getRowCount() { 
      return list.size(); 
     } 

     public String getColumnName(int col) { 
      return columnNames[col]; 
     } 

     public Object getValueAt(int row, int col) { 

      Book object = list.get(row); 

      switch (col) { 
      case 0: 
       return object.id; 
      case 1: 
       return object.title; 
      case 2: 
       return object.author; 
      case 3: 
       return object.year; 
      case 4: 
       return object.state; 
      default: 
       return "unknown"; 
      } 
     } 

@Override 
     public Class getColumnClass(int c) { 
      return getValueAt(0, c).getClass(); 
     } 

     boolean[] canEdit = new boolean[]{ 
      false, false, true, false, true, 
    }; 

@Override 
    public boolean isCellEditable(int rowIndex, int columnIndex) { 
     return canEdit[columnIndex]; 
    } 

    public void setValueAt(Object value, int row, int col){ 



      switch (col) { 
      case 0: 
       // id not editable list.get(row).setId((int)value); 
      case 1: 
       list.get(row).setTitle((String)value); 
       break; 
      case 2: 
       list.get(row).setAuthor((String)value); 
       break; 
      case 3: 
       list.get(row).setYear((String)value); 
       break; 
      case 4: 
       list.get(row).setState(Boolean.valueOf((String)value)); 
       break; 

      } 
    fireTableCellUpdated(row, col); 
} 

} 

ReadXMLFile.class

package net.kxyz; 

    import java.io.File; 
    import java.io.IOException; 
    import java.util.ArrayList; 
    import java.util.List; 
    import javax.xml.parsers.DocumentBuilder; 
    import javax.xml.parsers.DocumentBuilderFactory; 
    import javax.xml.parsers.ParserConfigurationException; 
    import org.w3c.dom.Document; 
    import org.w3c.dom.Element; 
    import org.w3c.dom.Node; 
    import org.w3c.dom.NodeList; 
    import org.xml.sax.SAXException; 

    /** 
    * 
    * @author kuman 
    */ 
    public class ReadXMLFile { 

    File fXmlFile = new File("/baza.xml"); 

    public ArrayList<Book> getBook() { 
    return book; 
    } 
    ArrayList<Book> book = new ArrayList<>() ; 
public void Read() { 
    try { 
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
Document doc = dBuilder.parse(fXmlFile); 


doc.getDocumentElement().normalize(); 

System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); 

NodeList nList = doc.getElementsByTagName("book"); 

for (int temp = 0; temp < nList.getLength(); temp++) { 

    Node nNode = nList.item(temp); 

    System.out.println("\nReading node :" + nNode.getNodeName()); 
      Book tempBook = new Book(); 
    if (nNode.getNodeType() == Node.ELEMENT_NODE) { 

     Element eElement = (Element) nNode; 

       tempBook.setId(eElement.getAttribute("id")); 
       tempBook.setTitle(eElement.getElementsByTagName("title").item(0).getTextContent()); 
       tempBook.setAuthor(eElement.getElementsByTagName("author").item(0).getTextContent()); 
       tempBook.setYear(eElement.getElementsByTagName("year").item(0).getTextContent()); 
       tempBook.setState(Boolean.valueOf(eElement.getElementsByTagName("state").item(0).getTextContent())); 
       System.out.println("TEMP : " + temp); 
       System.out.println("id : " + tempBook.getId()); 
       System.out.println("title : " + tempBook.getTitle()); 
       System.out.println("author : " + tempBook.getAuthor()); 
       System.out.println("year : " + tempBook.getYear()); 
       System.out.println("state : " + tempBook.isState()); 

       book.add(temp, tempBook); 

    } 
} 

     } catch (ParserConfigurationException | SAXException | IOException e) { 
e.printStackTrace(); 
     } 
    } 
    } 

Book.class

package net.kxyz; 

    /** 
    * 
    * @author kuman 
    */ 
    public class Book { 
String id; 
String title; 
String author; 
String year; 
Boolean state; 

public Book() {}; 
public Book(String id, String title, String author, String year) { 
    this.id = id ; 
    this.title = title; 
    this.author = author; 
    this.year = year; 
    this.state = true; 
} 

public String getId() { 
    return id; 
} 

public void setId(String id) { 
    this.id = id; 
} 


public String getAuthor() { 
    return author; 
} 

public void setAuthor(String author) { 
    this.author = author; 
} 

public Boolean isState() { 
    return state; 
} 

public void setState(Boolean state) { 
    this.state = state; 
} 

public String getTitle() { 
    return title; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

public String getYear() { 
    return year; 
} 

public void setYear(String year) { 
    this.year = year; 
} 



    } 

回答

0

我應該怎麼做才能將結果保存到XML?

據我所見,你的TableModel中沒有實現setValueAt()方法。您的更改保存在哪裏?

事實上,在編輯之後,你應該通過MyTableModel,獲取List?並將其存儲爲xml。

0

你需要實現一個JTableListener如下:

table.getModel()addTableModelListener(新TableModelListener(){

public void tableChanged(TableModelEvent e) { 
    // your code goes here; 
    } 
}); 

時,檢測到變化的表格,你需要轉換表格中的字段返回到XML 此外,您可以實現WatchService以觀察XML文件,當檢測到文件發生任何更改時,您可以通過調用ReadFromXML來重新裝載表格