การเพิ่มรายการและการรีเฟรช JTable

นี่คือปัญหา - ฉันต้องการเพิ่ม item if class ใน arraylist และหลังจากกรอกโพลทั้งหมดในคลาสแล้ว ฉันจำเป็นต้องรีเฟรช Jtable แต่ฉันไม่รู้ว่าต้องทำอย่างไร

นี่คือรหัสของฉัน: Main() {

    JFrame frame = new JFrame();
    frame.setSize(550, 450);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new FlowLayout());

    JButton jb1 = new JButton("Добавить");
    JButton jb2 = new JButton("Удалить");
    JButton jb3 = new JButton("Редактировать");
    JButton jb4 = new JButton("Найти мощную машину");


    frame.add(jb1);
    frame.add(jb2);
    frame.add(jb3);

    String[] tbheader = {"ID", "Машина", "Модель", "Цвет", "Мощность", "Объём бака"};
    String[][] tbdata = new String[cdb.size()][6];
    int i = 0;
    for (CarDB temp:cdb){
        tbdata[i][0] = Integer.toString(i + 1);
        tbdata[i][0] = temp.Brand;
        tbdata[i][0] = temp.Model;
        tbdata[i][0] = temp.Color;
        tbdata[i][0] = Short.toString(temp.Power);
        tbdata[i][0] = Short.toString(temp.TankVol);
        i++;
    }

    JTable jt = new JTable(tbdata, tbheader);
    frame.add(new JScrollPane(jt));

    jt.setSize(550, 320);
    jt.setPreferredScrollableViewportSize(jt.getSize());
    jt.setShowHorizontalLines(true);
    jt.setShowVerticalLines(true);

    jb1.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            AddCarInList();
            jt.repaint();
        }
    });
    jb2.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            DeleteCarFromList();
        }
    });
    jb3.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            ChooseCarId();
        }
    });
    frame.add(jb4);
    jb4.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            FindPowerfulCar();
        }
    });

    jb2.addActionListener(this);
    jb3.addActionListener(this);
    jb4.addActionListener(this);
    frame.setVisible(true);
    this.cdb = new ArrayList<>();
}

public void AddCarInList() {
    JFrame addCar = new JFrame();
    addCar.setSize(250, 300);
    addCar.setLayout(new FlowLayout());

    JLabel l_br = new JLabel("Введите марку");
    JLabel l_md = new JLabel("Введите модель");
    JLabel l_cl = new JLabel("Введите цвет");
    JLabel l_pw = new JLabel("Введите мощность");
    JLabel l_tv = new JLabel("Введите объём бака");

    JTextField t_br = new JTextField(20);
    JTextField t_md = new JTextField(20);
    JTextField t_cl = new JTextField(20);
    JTextField t_pw = new JTextField(4);
    JTextField t_tv = new JTextField(3);

    JButton conf = new JButton("Добавить");

    addCar.add(l_br);
    addCar.add(t_br);
    addCar.add(l_md);
    addCar.add(t_md);
    addCar.add(l_cl);
    addCar.add(t_cl);
    addCar.add(l_pw);
    addCar.add(t_pw);
    addCar.add(l_tv);
    addCar.add(t_tv);
    addCar.add(conf);
    conf.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (CheckStr(t_br.getText(), t_md.getText(), t_cl.getText())) {
                if (CheckShort(t_pw.getText(), t_tv.getText())) {
                    CarDB car = new CarDB(
                            t_br.getText(),
                            t_md.getText(),
                            t_cl.getText(),
                            Short.parseShort(t_pw.getText()),
                            Short.parseShort(t_tv.getText()));
                    cdb.add(car);
                    System.out.println(cdb.indexOf(car) + 1
                            + " " + cdb.get(0).Brand
                            + " " + cdb.get(0).Model
                            + " " + cdb.get(0).Color
                            + " " + cdb.get(0).Power
                            + " " + cdb.get(0).TankVol);
                    addCar.setVisible(false);
                } else Alert(1);
            } else Alert(3);
        }
    });
    addCar.setVisible(true);
}

ใครรู้วิธีการแก้ปัญหานี้?


person genesi5    schedule 25.11.2015    source แหล่งที่มา
comment
อัปเดต JTable's TableModel มันจะทริกเกอร์เหตุการณ์ที่เหมาะสมเพื่ออัปเดต JTable อย่างเหมาะสม ดูวิธีใช้ตารางสำหรับรายละเอียดเพิ่มเติม สำหรับตัวอย่าง   -  person MadProgrammer    schedule 25.11.2015


คำตอบ (2)


การเขียนโปรแกรมเชิงวัตถุเป็นเรื่องเกี่ยวกับการขยายคลาส
หนึ่งในคลาสที่คุณควรขยายคือ AbstractTableModel เป็น โมเดล ให้กับ JTable ของคุณ
ตรวจสอบ สิ่งนี้ เป็นตัวอย่าง
หลังจากนั้น คุณอัปเดต โมเดล นี้ จากนั้นรีเฟรชโดยการเรียก:
model.fireTableDataChanged() (อัปเดตแถว) หรือ
โมเดลfireTableStructureChanged() (อัปเดตแถว + คอลัมน์)

person Leet-Falcon    schedule 25.11.2015
comment
หรือใช้ DefaultTableModel ซึ่งมีฟังก์ชันส่วนใหญ่ในตัวตามค่าเริ่มต้น แต่นั่นจะต้องขึ้นอยู่กับการรู้ว่าข้อมูลอยู่ในรูปแบบใดก่อนตัดสินใจเพิ่มเติม (โดยส่วนตัวแล้วฉันชอบใช้ AbstractTableModel ในกรณีส่วนใหญ่ แต่อย่าให้ลดความเรียบง่ายเลย ของรุ่นเริ่มต้น) - person MadProgrammer; 26.11.2015

ช่อง cdb คือรายการรถยนต์ ในเมธอด AddCarInList รถยนต์จะถูกเพิ่มเข้าไปในรายการ ปัญหาคือว่ารายการนี้ใช้เพียงครั้งเดียวเพื่อเริ่มต้นตาราง ตามที่ MadProgrammer แนะนำไปแล้ว คุณสามารถแก้ไขได้ด้วยการอัปเดตโมเดลตาราง

คุณสามารถเปลี่ยนการเริ่มต้นตารางได้ดังนี้:

Vector<String> columnNames = new Vector<>(Arrays.asList(tbheader));
Vector<Vector<Object>> dataVector = new Vector<>();
tableModel = new DefaultTableModel(dataVector, columnNames);
JTable jt = new JTable(tableModel);

โค้ดด้านบนถือว่าคุณได้เพิ่มฟิลด์ tableModel ประเภท DefaultTableModel แล้ว ในเมธอด AddCarInList คุณสามารถเพิ่มแถวให้กับโมเดลตารางได้:

final Vector<String> rowVector = new Vector<>();
rowVector.add(t_br.getText());
rowVector.add(t_md.getText());
rowVector.add(t_cl.getText());
rowVector.add(t_pw.getText());
rowVector.add(t_tv.getText());
tableModel.addRow(rowVector);

การเพิ่มแถวให้กับโมเดลตารางควรรีเฟรชตารางโดยอัตโนมัติ

person Freek de Bruijn    schedule 25.11.2015