Импорт элементов XML в JTable из события "Выполнено"

Похоже, есть множество примеров и учебных пособий, где содержание JTable заполняются при первоначальном создании таблицы, но я изо всех сил пытаюсь понять, как заполнить таблицу из Action event,

Предоставлено исходный код, полученный из Mkyong, и пример учебника из Как использовать таблицы, я хотел бы заполнить JTable из JButton щелчок action event, JButton позвоню моему addDataToTable() метод из TableDemo учебный класс.

Exif.java

@XmlRootElement
public class Exif {

private int imgId;
private Date imgTimesatmp;
private String imgFilename;
private Double imgLatitude;
private Double imgLongitude;

public Exif() {
}

public int getImgId() {
    return imgId;
}

@XmlAttribute
public void setImgId(int imgId) {
    this.imgId = imgId;
}

public Double getImgLatitude() {
    return imgLatitude;
}

@XmlElement
public void setImgLatitude(Double imgLatitude) {
    this.imgLatitude = imgLatitude;
}

public Double getImgLongitude() {
    return imgLongitude;
}

@XmlElement
public void setImgLongitude(Double imgLongitude) {
    this.imgLongitude = imgLongitude;
}

public Date getImgTimesatmp() {
    return imgTimesatmp;
}

@XmlElement
public void setImgTimesatmp(Date imgTimesatmp) {
    this.imgTimesatmp = imgTimesatmp;
}

public String getImgFilename() {
    return imgFilename;
}

@XmlElement
public void setImgFilename(String imgFilename) {
    this.imgFilename = imgFilename;
}
}

ExifTableModel.java

public class ExifTableModel extends AbstractTableModel {

private String[] columnNames = {"Image Id",
    "Timestamp",
    "Filename",
    "Latitude",
    "Longitude"};

private ArrayList<ArrayList<Object>> tableData = new ArrayList<ArrayList<Object>>();

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

@Override
public int getRowCount() {
    return tableData.size();
}

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

@Override
public Object getValueAt(int row, int col) {
    if (tableData.size() > 0) {
        return tableData.get(row).get(col);
    }
    return null;
}

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

@Override
public void setValueAt(Object value, int row, int col) {
    if (tableData.size() <= row) {
        ArrayList<Object> arrayList = new ArrayList<Object>();
        for (int i = 0; i < columnNames.length; i++) {
            arrayList.add("");
        }
        tableData.add(arrayList);
    }

    ArrayList<Object> object = tableData.get(row);
    object.add(col, value);
    tableData.set(row, object);
    fireTableDataChanged();
}
}

TableDemo.java

public class TableDemo extends JPanel {
private JTable table;

public TableDemo() {
    super(new GridLayout(1, 0));

    table = new JTable(new ExifTableModel());
    table.setPreferredScrollableViewportSize(new Dimension(500, 70));
    table.setFillsViewportHeight(true);

    JScrollPane scrollPane = new JScrollPane(table);
    add(scrollPane);

    addDataToTable();
}

private static void createAndShowGUI() {
    JFrame frame = new JFrame("TableDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    TableDemo newContentPane = new TableDemo();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);

    frame.pack();
    frame.setVisible(true);
}

public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            createAndShowGUI();
        }
    });
}

private void addDataToTable() {
    try {

        File file = new File("myDoc.xml");
        JAXBContext jaxbContext = JAXBContext.newInstance(Exif.class);

        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        Exif exif = (Exif) jaxbUnmarshaller.unmarshal(file);
        System.out.println(exif.toString());

        table.setValueAt(exif, 0, 0);

    } catch (JAXBException e) {
        e.printStackTrace();
    }
}

}

1 ответ

Хорошо, вот что вы можете сделать.

Используйте JAXB или SAX или все, что вы хотите, чтобы прочитать XML и сопоставить их с объектами. Храните эти объекты в списке. JAXB сделает это для вас, пока вы в SAX, это будет дополнительным шагом.

Убедитесь, что ваши объекты имеют геттеры и сеттеры. Затем вы можете взять эти данные и использовать их для заполнения таблицы, как в примерах.

Не читайте большие файлы XML в actionPerformed. Это просто реле, чтобы сообщить вам, что кнопка была нажата. Вместо этого запустите поток, который будет читать файл. Ваш JAXB маршаллинг и демаршаллинг должны быть сделаны в этой теме.

Другие вопросы по тегам