Импорт элементов 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 маршаллинг и демаршаллинг должны быть сделаны в этой теме.