Попытка взять данные XML и отобразить их на JTable, указав c элементы - PullRequest
0 голосов
/ 01 мая 2020

это мой первый вопрос по стеку, и я также начинающий программист. Я пытаюсь создать программу, которая импортирует данные из файла XML и отображает их на основе java .swing и java .awt GUI. По большей части, я считаю, что JAXB Unmarshaller работает так, как задумано, и JTable, хотя он может использовать много работы, сейчас не является главной проблемой.

Пока что я могу получить свои XML данные для печати после их отмены в консоли. Но если я использую тот же подход и использую .toString в JTable. Все, что я получаю, это пустой массив. Я полагаю, что с моим кодом много чего не так, но любая полезная помощь будет полезна.

Я пытался сэкономить время и здравый смысл, создавая множество списков <UID_1505_1_1_0_0> в отличие от различных root элементов. Этот подход позволил мне получить превосходный вывод XML, но если это проблема, то все же укажите на это.

Также следует отметить, что XML автоматически генерируется другой программой. Vectorworks, если название приложения вообще помогает

А вот мой код. Предупреждение Несколько классов

Основной класс и метод

package app;

import javax.swing.*;
import javax.xml.bind.*;

// Project specific classes
import java.io.*;
import xml_Import.SLData;
import gui.*;

public class Main {

    public static void main(String[] args) {
        SLData sl = new SLData();       
//      
        //Start JAXB  UnMarshaller
        try {
            JAXBContext jaxbContextU = JAXBContext.newInstance(SLData.class);
            Unmarshaller jaxbUnmarshaller = jaxbContextU.createUnmarshaller();      

            File file = new File("/Users/ *MacOS username* /Desktop/LIHN 1.11.18 v2020.xml");
            sl = (SLData) jaxbUnmarshaller.unmarshal(file);
            System.out.println(sl.toString());

        } catch (JAXBException e1) {
            e1.printStackTrace();
        }
        //End JAXB UnMarshaller

        // GUI Display
        BaseFrame baseFrame = new BaseFrame();
        ButtonPanel bp = new ButtonPanel();
        LabelPanel lp = new LabelPanel();
        TablePanel tp = new TablePanel();

        JSplitPane jsp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, bp, tp);
        jsp.setDividerSize(20);

        baseFrame.add(jsp);
        baseFrame.setVisible(true);
        // End GUI Display


        //JAXB Marshaller
        JAXBContext jaxbContext;
        try {
            jaxbContext = JAXBContext.newInstance(SLData.class);
            Marshaller jaxbMarshaller   = jaxbContext.createMarshaller();

            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            jaxbMarshaller.marshal(sl, new File("/Users/*MacOS username* /Desktop/ME_Output.xml"));

        } catch (JAXBException e1) {
            e1.printStackTrace();
        }
        // End JAXB Marshaller


    } // End of Main

} // End of class

Панель Таблицы GUI

package gui;

import java.awt.BorderLayout;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

import xml_Import.*;


public class TablePanel extends JPanel{

    private static final long serialVersionUID = 1L;

    private JTable table = null;
    private DefaultTableModel model = new DefaultTableModel();
    private List<UniqueIds> dataIn = new ArrayList<UniqueIds>();
    private List<SLData> info = new ArrayList<SLData>();

    public TablePanel() {
          setLayout(new BorderLayout());
          intitTableModel();
          JScrollPane jsp = new JScrollPane(table);
          add(jsp, BorderLayout.CENTER);
          setVisible(true);
    }

    public void addRowData(List<InstData> rowData) {
        model.addRow(new Object[] {rowData});
    }


    public void intTable() {
        String[] dataTypes= {
                "Channel",
                "Dimmer",
                "DMX Address",
                "Unit #",
                "Position",
                "Instrument Type",
                "Load",
                "Purpose",
                "Color",
                "Gobo 1",
                "Gobo 2",
                "Universe",
                "DMX Footprint"
        };

        Object data[][]= {
                {dataIn.toString()}
        };

        table = new JTable(data, dataTypes);
    }

    private void intitTableModel() {
        model.addColumn("Channel");
        model.addColumn("Dimmer");
        model.addColumn("DMX Addres");
        model.addColumn("Unit #");
        model.addColumn("Position");
        model.addColumn("Instrument Type");
        model.addColumn("Load");
        model.addColumn("Purpose");
        model.addColumn("Color");
        model.addColumn("Gobo 1");
        model.addColumn("Gobo 2");
        model.addColumn("Universe");
        model.addColumn("DMX Footprint");

    for(SLData data : info) {
        System.out.println("hello");

        model.addRow(new Object[] {
                data.toString()
                ,"test"
        }); 

        System.out.println("hello");
    };

        model.addRow(new Object[] {
        info.toString()
        });


        table = new JTable(model);
    }   
}

Первый уровень XML import

package xml_Import;
// Purpose: Top of XML Hierarchy, encompasses the following


import javax.xml.bind.annotation.*;
import java.util.*;
@XmlRootElement(name="SLData")
@XmlAccessorType (XmlAccessType.FIELD)
public class SLData {


    @XmlElement(name= "UniverseSettings")
    private List<UniverseSettings> universeSettings = new ArrayList<UniverseSettings>();

    @XmlElement(name= "ExportFieldList")
    private List<Fields> field = new ArrayList<Fields>();

    @XmlElement(name= "InstrumentData")
    private List<InstData> instList = new ArrayList<InstData>();


    @Override
    public String toString() {
        return "SLData [inv=" + 
                universeSettings + 
                ", field=" + field + 
                ", instData" + instList + 
                "]";

    }
}

Один из 3 классов на втором уровне XML Импорт

package xml_Import;
//Purpose: Bulk of the information. Multiple types of "Instruments" will be listed here. Currently only one for simplicity
//Take the uid lists here and out put them on the TablePanel, by specific elements, under the specified columns.

import javax.xml.bind.annotation.*;
import java.util.*;

@XmlRootElement(name= "InstrumentData")
@XmlAccessorType (XmlAccessType.FIELD)
public class InstData {

    @XmlElement(name= "Action")
    private String projScope;

    @XmlElement(name= "AppStamp")
    private String appStamp;

    @XmlElement(name= "VWVersion")
    private int vWorksVersion;

    @XmlElement(name= "VWBuild")
    private int vWorksBuild;

    @XmlElement(name= "AutoRot2D")
    private boolean autoRot2D;

    @XmlElement(name= "UID_1505_1_1_0_0")
    private List<UniqueIds> uid39 = new ArrayList<UniqueIds>();

    @Override
    public String toString() {
        return "InstData [projScope=" + projScope + 
                ", appStamp=" + appStamp + 
                ", vWorksVersion=" + vWorksVersion+ 
                ", vWorksBuild=" + vWorksBuild + 
                ", autoRot2D=" + autoRot2D + 
                ", uid39= " + uid39 +
                "]";
    }
}

Последний уровень XML Импорт

package xml_Import;
//Purpose: Data for each instrument attempting to assign Array Elements to them for latter retrival

import javax.xml.bind.annotation.*;
import java.sql.Timestamp;

@XmlRootElement(name= "UID_1624_1_1_0_0")
@XmlAccessorType (XmlAccessType.FIELD)
public class UniqueIds {


    @XmlElement(name= "Action")
    private String projScope;

    @XmlElement(name= "TimeStamp")
    private long timeStamp;
    private Timestamp timeStp = new Timestamp(timeStamp);

    @XmlElement(name= "AppStamp")
    private String appStamp;

    @XmlElement(name= "UID")
    private String uid;

    @XmlElement(name= "Lightwright_ID")
    private String lightWrightID;

    @XmlElement(name= "Use_Legend")
    private String useLegend;

    @XmlElement(name= "Device_Type")
    private String deviceType;

    @XmlElement(name= "Symbol_Name")
    private String symbolName;

    @XmlElement(name= "Focus")
    private String focus;

    @XmlElement(name= "Class")
    private String clss;

    @XmlElement(name= "Layer")
    private String layer;

    @XmlElement(name= "Accessories")
    private String accessories;

    @XmlElement(name= "Frame_Size")
    private float frameSize;

    @XmlElement(name= "Num_Channels")
    private long numChannels;

    @XmlElement(name= "Absolute_Address")
    private long absAddress;

    @XmlElement(name= "Inst_Type")
    private String instType;

    @XmlElement(name= "Unit_Number")
    private int unitNum;

    @XmlElement(name= "Template2")
    private String gobo2;

    @XmlElement(name= "Template1")
    private String gobo1;

    @XmlElement(name= "Color")
    private String color;

    @XmlElement(name= "Circuit_Name")
    private String cirName;

    @XmlElement(name= "Circuit_Num")
    private String cirNum;

    @XmlElement(name= "Dimmer")
    private int dimmer;

    @XmlElement(name= "Channel")
    private long channel;

    @XmlElement(name= "Position")
    private String position;

    @XmlElement(name= "Purpose")
    private String purpose;

    @XmlElement(name= "User_Field_1")
    private String userField1;

    @XmlElement(name= "User_Field_2")
    private String userField2;

    @XmlElement(name= "User_Field_3")
    private String userField3;

    @XmlElement(name= "User_Field_4")
    private String userField4;

    @XmlElement(name= "User_Field_5")
    private String userField5;

    @XmlElement(name= "User_Field_6")
    private String userField6;

    @XmlElement(name= "System")
    private String syst;

    @XmlElement(name= "Mark")
    private String mark;


// Getters and Setters were here it would just make this obscenely long
    @Override
    public String toString() {
        return "UniqueIds [projScope=" + projScope + ", timeStamp=" + timeStamp + ", timeStp=" + timeStp + ", appStamp="
                + appStamp + ", uid=" + uid + ", lightWrightID=" + lightWrightID + ", useLegend=" + useLegend
                + ", deviceType=" + deviceType + ", symbolName=" + symbolName + ", focus=" + focus + ", clss=" + clss
                + ", layer=" + layer + ", accessories=" + accessories + ", frameSize=" + frameSize + ", numChannels="
                + numChannels + ", absAddress=" + absAddress + ", instType=" + instType + ", unitNum=" + unitNum
                + ", gobo2=" + gobo2 + ", gobo1=" + gobo1 + ", color=" + color + ", cirName=" + cirName + ", cirNum="
                + cirNum + ", dimmer=" + dimmer + ", channel=" + channel + ", position=" + position + ", purpose="
                + purpose + ", userField1=" + userField1 + ", userField2=" + userField2 + ", userField3=" + userField3
                + ", userField4=" + userField4 + ", userField5=" + userField5 + ", userField6=" + userField6 + ", syst="
                + syst + ", mark=" + mark + "]";
    }
}

И небольшая часть XML Файл

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<SLData>

  <ExportFieldList>
    <AppStamp>Vectorworks</AppStamp>
    <TimeStamp>20200427192323</TimeStamp>
    <Frame_Size>Frame Size</Frame_Size>
    <Num_Channels>DMX Footprint</Num_Channels>
    <Absolute_Address>Absolute Address</Absolute_Address>
    <Inst_Type>Instrument Type</Inst_Type>
    <Unit_Number>Unit Number</Unit_Number>
    <Template2>Gobo 2</Template2>
    <Template>Gobo 1</Template>
    <Color>Color</Color>
    <Circuit_Name>Circuit Name</Circuit_Name>
    <Circuit_Number>Circuit Number</Circuit_Number>
    <Dimmer>Dimmer</Dimmer>
    <Channel>Channel</Channel>
    <Position>Position</Position>
    <Wattage>Wattage</Wattage>
    <Purpose>Purpose</Purpose>
    <User_Field_1>User Field 1</User_Field_1>
    <User_Field_2>User Field 2</User_Field_2>
    <User_Field_3>User Field 3</User_Field_3>
    <User_Field_4>User Field 4</User_Field_4>
    <User_Field_5>User Field 5</User_Field_5>
    <User_Field_6>User Field 6</User_Field_6>
    <System>System</System>
    <Mark>Mark</Mark>
  </ExportFieldList>

  <InstrumentData>
    <Action>Entire Plot</Action>
    <AppStamp>Vectorworks</AppStamp>
    <VWVersion>2502</VWVersion>
    <VWBuild>523565</VWBuild>
    <AutoRot2D>false</AutoRot2D>
    <UID_1505_1_1_0_0>
      <Action>Update</Action>
      <TimeStamp>20200427192323</TimeStamp>
      <AppStamp>Vectorworks</AppStamp>
      <UID>1505.1.1.0.0</UID>
      <Lightwright_ID>87DA78:252B:29:1A:Vecto</Lightwright_ID>
      <Use_Legend>US</Use_Legend>
      <Device_Type>Fogger</Device_Type>
      <Symbol_Name>Light SFX ADJ Haze Generator</Symbol_Name>
      <Focus/>
      <Class>LX Fixtures floor</Class>
      <Layer>Lighting</Layer>
      <Accessories/>
      <Frame_Size>N/A</Frame_Size>
      <Num_Channels>1</Num_Channels>
      <Absolute_Address>9799</Absolute_Address>
      <Inst_Type>Unique 2.1 Hazer</Inst_Type>
      <Unit_Number>17</Unit_Number>
      <Template2/>
      <Template/>
      <Color>N/C</Color>
      <Circuit_Name/>
      <Circuit_Number/>
      <Dimmer/>
      <Channel>321</Channel>
      <Position>Floor</Position>
      <Wattage>360W</Wattage>
      <Purpose>Atmospherics</Purpose>
      <User_Field_1/>
      <User_Field_2/>
      <User_Field_3/>
      <User_Field_4/>
      <User_Field_5/>
      <User_Field_6/>
      <System>A</System>
      <Mark/>
      <X_Location_mm>19926.186197</X_Location_mm>
      <Y_Location_mm>-1954.849057</Y_Location_mm>
      <Z_Location_mm>0.000000</Z_Location_mm>
      <Rotation>180.000000</Rotation>
    </UID_1505_1_1_0_0>
Continues on for much longer

Вывод на консоль

SLData [inv=[UniverseSettings [appStamp=Vectorworks, uniEnabled=false, timeStamp=20200427192324, timeSt=1969-12-31 19:00:00.0, vWorksVersion=2502, vWorksBuild=523565]], field=[Fields [appStamp=Vectorworks, timeStamp=20200427192323, timeSt=1969-12-31 19:00:00.0, frameSize=0.0, numChannels=0, absAddress=0, instType=Instrument Type, unitNum=0, gobo2=Gobo 2, gobo1=null, color=Color, cirName=Circuit Name, cirNum=null, dimmer=0, channel=0, position=Position, purpose=Purpose, userField1=User Field 1, userField2=User Field 2, userField3=User Field 3, userField4=User Field 4, userField5=User Field 5, userField6=User Field 6, syst=System, mark=Mark]], instData[InstData [projScope=Entire Plot, appStamp=Vectorworks, vWorksVersion=2502, vWorksBuild=523565, autoRot2D=false, uid39= [UniqueIds [projScope=Update, timeStamp=20200427192323, timeStp=1969-12-31 19:00:00.0, appStamp=Vectorworks, uid=1505.1.1.0.0, lightWrightID=87DA78:252B:29:1A:Vecto, useLegend=US, deviceType=Fogger, symbolName=Light SFX ADJ Haze Generator, focus=, clss=LX Fixtures floor, layer=Lighting, accessories=, frameSize=0.0, numChannels=1, absAddress=9799, instType=Unique 2.1 Hazer, unitNum=17, gobo2=, gobo1=null, color=N/C, cirName=, cirNum=null, dimmer=0, channel=321, position=Floor, purpose=Atmospherics, userField1=, userField2=, userField3=, userField4=, userField5=, userField6=, syst=A, mark=]]]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...