ฉันจะเพิ่ม ArrayList ลงใน jtable ได้อย่างไร

ฉันกำลังทำงานกับบริการเว็บที่ส่งคืนรายการอาร์เรย์ ฉันจะเพิ่มรายการอาร์เรย์ที่ส่งคืนไปยัง jtable และจอแสดงผลได้อย่างไร

    ArrayList customerDetails = new ArrayList();
    try {
        String sqlQuery = "SELECT * FROM customer WHERE AccountNumber="+accountNumber;
        PreparedStatement stmt = DatabaseConnection.dBconn().prepareStatement(sqlQuery);
        ResultSet rs = stmt.executeQuery();

        while (rs.next()) {

            customerDetails.add(rs.getString("Name"));
            customerDetails.add(rs.getString("DoB"));
            customerDetails.add(rs.getString("Address"));
            customerDetails.add(rs.getString("Mobile"));
            customerDetails.add(rs.getString("Email"));
            customerDetails.add(rs.getString("AccountType"));
            customerDetails.add(rs.getString("AccountNumber"));
            customerDetails.add(rs.getString("SortCode"));
            customerDetails.add(rs.getString("Balance"));
            customerDetails.add(rs.getString("Card"));

        }
        return customerDetails;

    } catch (SQLException err) {
        System.out.println(err.getMessage());
    }
    return customerDetails;

person Lakshan    schedule 22.04.2017    source แหล่งที่มา
comment
เริ่มจากข้อเท็จจริงที่ว่า ArrayList ของคุณไม่มีโครงสร้างเป็นการจัดกลุ่มแถว/คอลัมน์ คุณจะต้องมี List ภายใน List โดยที่รายการด้านนอกคือแถวและรายการภายในคือค่าคอลัมน์   -  person MadProgrammer    schedule 22.04.2017
comment
ปัญหาของคุณคือเพิ่ม ArrayList ลงใน JTable ดังนั้นลองวิธีแก้ปัญหานี้   -  person TuyenNTA    schedule 22.04.2017
comment
I've been working on a web-service that returns an arraylist. - เหตุใดจึงส่งคืน ArrayList หากคุณได้รับข้อมูลทั้งหมดจากฐานข้อมูล ทำไมไม่ส่งคืน DefaultTableModel ที่มีข้อมูลทั้งหมด จากนั้นคุณเพียงแค่สร้าง JTable ของคุณโดยใช้โมเดลตาราง   -  person camickr    schedule 22.04.2017


คำตอบ (1)


เริ่มจากข้อเท็จจริงที่ว่า ArrayList ของคุณไม่มีโครงสร้างเป็นการจัดกลุ่มแถว/คอลัมน์ คุณจะต้องมี List ภายใน List โดยที่รายการด้านนอกคือแถวและรายการภายในคือค่าคอลัมน์

ขณะที่เราดำเนินการนี้ เรามาใช้ประโยชน์จาก PreparedStatement อย่างเหมาะสมและจัดการทรัพยากรเพื่อให้ปิดอย่างถูกต้องในขณะที่เราดำเนินการอยู่

ArrayList<List<String>> customerDetails = new ArrayList<>(25);
String sqlQuery = "SELECT * FROM customer WHERE AccountNumber=?";
try (PreparedStatement stmt = DatabaseConnection.dBconn().prepareStatement(sqlQuery)) {
    stmt.setString(1, accountNumber);
    try (ResultSet rs = stmt.executeQuery()) {

        while (rs.next()) {
            List<String> rowDetails = new ArrayList<>(10);
            rowDetails.add(rs.getString("Name"));
            rowDetails.add(rs.getString("DoB"));
            rowDetails.add(rs.getString("Address"));
            rowDetails.add(rs.getString("Mobile"));
            rowDetails.add(rs.getString("Email"));
            rowDetails.add(rs.getString("AccountType"));
            rowDetails.add(rs.getString("AccountNumber"));
            rowDetails.add(rs.getString("SortCode"));
            rowDetails.add(rs.getString("Balance"));
            rowDetails.add(rs.getString("Card"));

            customerDetails.add(rowDetails);
        }
    }

} catch (SQLException err) {
    System.out.println(err.getMessage());
}
return customerDetails;

ดูที่ การใช้คำสั่งที่เตรียมไว้ และ คำสั่ง try-with-resources สำหรับรายละเอียดเพิ่มเติม

ตอนนี้ เราต้องการ TableModel ซึ่งสามารถรองรับได้ ในระดับพื้นฐานมาก...

public class ListTableModel extends AbstractTableModel {

    private List<List<String>> rows;
    private List<String> columnNames;

    public ListTableModel(List<String> columnNames, List<List<String>> rows) {
        this.rows = new ArrayList<>(rows);
        this.columnNames = columnNames;
    }

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

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

    @Override
    public String getColumnName(int column) {
        return columnNames.get(column);
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        Class type = String.class;
        return type;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        List<String> rowData = rows.get(rowIndex);
        return rowData.get(columnIndex);
    }
}

ซึ่งใช้ List สำหรับชื่อคอลัมน์และ List<List> สำหรับข้อมูลแถว

โดยส่วนตัวแล้ว ฉันอยากจะรวมข้อมูลไว้ใน Plain Old Java Object (POJO) บางประเภท เนื่องจากมันห่อหุ้มข้อมูลและให้ความยืดหยุ่นที่มากกว่าเมื่อแสดงข้อมูล (เช่น ฉันต้องแสดงคุณสมบัติทั้งหมดของวัตถุหากฉันไม่ทำ ไม่ต้องการ)

ดู วิธีใช้ตารางเพื่อดูรายละเอียดเพิ่มเติม

person MadProgrammer    schedule 22.04.2017