簡體   English   中英

使用新數據更新BeanTableModel - Java

[英]Updating a BeanTableModel with new Data - Java

我有一個BeanTableModel是延伸的RowTableModel 以及擴展DefaultTableColumnModelXTableColumnModel 這兩個模型都來自這個站點: BeanTableModel和RowTableModel源

我可以創建表格並顯示數據。 我可以用新數據更新的表,但我不能從一個不同的類用新數據更新表。

例如,我有一個Names.class,我將一個List<Names>發送到表中進行打印,並按預期執行。 當我嘗試使用不同的List<Names>更新表時,它也會更新,但是當我嘗試使用Dogs列表更新表時它不會更新,在這種情況下,如果我發送List<Dogs>它確實不更新表,這是這里的主要問題,如何用不同的類對象更新表?!

這是一個簡短的runnable我創建復制此錯誤:

注意:由於BeanTableModel,RowTableModel和XTableColumnModel是相當大的類,因為帖子上的char限制,我似乎無法在此處發布所有代碼。 因此,我留下了一個指向我的Dropbox帳戶的鏈接,您可以在其中下載這個短的可運行jar的所有源文件。

主要課程:

import javax.swing.SwingUtilities;

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Design();                
            }
        });
    }
}

設計類:

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;

public class Design extends JFrame {

    private LeftPanel leftPanel;
    private TablePanel tablePanel;

    public Design() {
        setExtendedState(JFrame.MAXIMIZED_BOTH);
        setVisible(true);
        setMinimumSize(new Dimension(600, 400));

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setLayout(new BorderLayout());

        leftPanel = new LeftPanel();
        tablePanel = TablePanel.getInstance();

        add(leftPanel, BorderLayout.NORTH);
        add(tablePanel, BorderLayout.SOUTH);
    }
}

LeftPanel類

public class LeftPanel extends JPanel {

    private JButton startButton;
    private JButton editWithDogButtton;
    private JButton editWithPerson;
    private TablePanel tablePanel;

    public LeftPanel() {
        initComponents();
        tablePanel = TablePanel.getInstance();

    }

    public void initComponents() {
        startButton = new JButton("Create table!");
        editWithDogButtton = new JButton("Edit with dog!");
        editWithPerson = new JButton("Edit with person!");

        setLayout(new GridBagLayout());

        GridBagConstraints constraints = new GridBagConstraints();

        constraints.gridx = 0;
        constraints.gridy = 0;
        add(startButton, constraints);

        constraints.gridx = 1;
        constraints.gridy = 0;
        add(editWithDogButtton, constraints);

        constraints.gridx = 1;
        constraints.gridx = 2;
        add(editWithPerson, constraints);

        startButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                List<Person> listPerson = new ArrayList<>();
                listPerson.add(new Person("John", "Spencer"));
                listPerson.add(new Person("Mike", "Strada"));
                listPerson.add(new Person("Johan", "Anderson"));

                ArrayList<String> columnLabels = new ArrayList<>();
                columnLabels.add("First name");
                columnLabels.add("Last name");

                tablePanel.createTable(Person.class, listPerson, true, true, columnLabels);
            }
        });

        editWithDogButtton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                List<Dog> listDog = new ArrayList<>();
                listDog.add(new Dog("Bob", "German Sheppard"));
                listDog.add(new Dog("Laika", "Bulldog"));

                ArrayList<String> columnLabels = new ArrayList<>();
                columnLabels.add("Dog's Name");
                columnLabels.add("Race");

                tablePanel.updateTable(listDog, columnLabels); // It doesn't work...!
            }
        });

        editWithPerson.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                List<Person> listPerson2 = new ArrayList<>();
                listPerson2.add(new Person("Jessica", "Carlton"));
                listPerson2.add(new Person("Sthephanie", "Oujur"));
                listPerson2.add(new Person("Angela", "Parker"));

                ArrayList<String> columnLabels = new ArrayList<>();
                columnLabels.add("First Name");
                columnLabels.add("Last Name");

                tablePanel.updateTable(listPerson2, columnLabels); // It works!
            }
        });
    }

    public void createTable(Class c, List data) {
        JTable table;
        BeanTableModel beanTableModel;
        XTableColumnModel columnModel;

        beanTableModel = new BeanTableModel(c, data);
        columnModel = new XTableColumnModel();
        table = new JTable(beanTableModel);
        table.setColumnModel(columnModel);
        table.createDefaultColumnsFromModel();

    }
}

TablePanel類

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JToolBar;
import javax.swing.table.TableColumn;


public class TablePanel extends JPanel {

    private JTable table;
    private JFileChooser fileChooser;
    private BeanTableModel beanTableModel;
    private XTableColumnModel columnModel;
    private Class c;
    private Class classAncestor;
    private List dataList;
    private static TablePanel instance;

    public synchronized static TablePanel getInstance()
    {
        if(instance == null)
        {
            instance = new TablePanel();
        }

        return instance;
    }

    private TablePanel() {
//        fileChooser = new JFileChooser();
    }

    public void setTable(JTable table) {
        this.table = table;
    }

    public void setBeanTableModel(BeanTableModel beanTableModel) {
        this.beanTableModel = beanTableModel;
    }

    public void setColumnModel(XTableColumnModel columnModel) {
        this.columnModel = columnModel;
    }

    public void setC(Class c) {
        this.c = c;
    }

    public void setData(List data) {
        this.dataList = data;
    }

    public List getDataList() {
        return dataList;
    }

    public void createTable(Class c, List data, boolean toolBarUp,
            boolean toolBarBottom, ArrayList<String> labelsCheckBox) {

        beanTableModel = new BeanTableModel(c, data);
        columnModel = new XTableColumnModel();
        table = new JTable(beanTableModel);
        table.setColumnModel(columnModel);
        table.createDefaultColumnsFromModel();

        if (toolBarUp == true) {
            final JToolBar toolBarTop = new JToolBar();

            JButton reset = new JButton("Reset");

            reset.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {

                    for (Component c : toolBarTop.getComponents()) {
                        if (c instanceof JCheckBox) {
                            JCheckBox checkBox = (JCheckBox) c;
                            checkBox.setSelected(false);
                            columnModel.setAllColumnsVisible();
                        }
                    }
                    int numberOfColumn = columnModel.getColumnCount();

                    for (int aux = 0; aux < numberOfColumn; aux++) {
                        int num = columnModel.getColumnCount();
                        TableColumn column = columnModel.getColumnByModelIndex(aux);
                        columnModel.setColumnVisible(column, true);
                    }
                }
            });

            toolBarTop.add(reset);

            // Create a JCheckBox for each column
            for (int i = 0; i < labelsCheckBox.size(); i++) {
                final int index = i;
                toolBarTop.add(new JCheckBox(new AbstractAction(labelsCheckBox.get(i)) {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        TableColumn column = columnModel.getColumnByModelIndex(index);
                        boolean visible = columnModel.isColumnVisible(column);
                        columnModel.setColumnVisible(column, !visible);
                    }
                }));
            }

            setLayout(new BorderLayout());
            add(toolBarTop, BorderLayout.NORTH);
            add(new JScrollPane(table), BorderLayout.CENTER);
            revalidate();
            repaint();
        }

        if (toolBarBottom == true) {
            final JToolBar toolBarDown = new JToolBar();

            toolBarDown.add(new JButton(new AbstractAction("Save Table") {
                @Override
                public void actionPerformed(ActionEvent e) {
                    throw new UnsupportedOperationException("Not supported yet.");
                }
            }));
            add(toolBarDown, BorderLayout.SOUTH);
        }
    }

    public void fireTableDataChanged() {
        table.setModel(beanTableModel);
        table.revalidate();
        table.repaint();
    }

    public void updateTable(List l, List<String> columnNames) {
        beanTableModel.updateTable(l, columnNames);
    }
}

狗類:

public class Dog {

    private String name;
    private String race;

    public Dog(String name, String race)
    {
        this.name = name;
        this.race = race;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setRace(String race) {
        this.race = race;
    }

    public String getName() {
        return name;
    }

    public String getRace() {
        return race;
    }     
}

皮爾森班

public class Person {

    private String firstName;
    private String lastName;

    public Person(String firstName, String lastName)
    {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

然后你只需要添加你可以在上面的鏈接中找到的BeanTableModel,RowTableModel和XTableColumnModel。 或者您可以從以下保管箱鏈接下載上面的所有代碼: 所有必需的代碼 - 14KB文件大小

因此,如果您運行代碼,您將看到3個JButtons ,如果您單擊“創建表!” 按鈕它確實工作正常,表創建。 如果您點擊“與人一起編輯!” 它將使用不同的List<Person>編輯表,它將正常工作。 但是當你點擊“用狗編輯!”時 它將嘗試使用List<Dog>編輯表,而不是更新列表。 它產生了一個例外。 這是異常輸出:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: java.lang.ClassCastException@6a22778a
    at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at MainPackage.BeanTableModel.getValueAt(BeanTableModel.java:229)
    at javax.swing.JTable.getValueAt(JTable.java:2720)
    at javax.swing.JTable.prepareRenderer(JTable.java:5718)
    at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2114)
    at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:2016)
    at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1812)
    at javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
    at javax.swing.JComponent.paintComponent(JComponent.java:778)
    at javax.swing.JComponent.paint(JComponent.java:1054)
    at javax.swing.JComponent.paintChildren(JComponent.java:887)
    at javax.swing.JComponent.paint(JComponent.java:1063)
    at javax.swing.JViewport.paint(JViewport.java:731)
    at javax.swing.JComponent.paintChildren(JComponent.java:887)
    at javax.swing.JComponent.paint(JComponent.java:1063)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1482)
    at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1413)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1206)
    at javax.swing.JComponent._paintImmediately(JComponent.java:5169)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4980)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:770)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728)
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677)
    at javax.swing.RepaintManager.access$700(RepaintManager.java:59)
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:682)
    at java.awt.EventQueue$3.run(EventQueue.java:680)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

我再次為這個相當大的代碼道歉,但我真的被困在這里,我需要幫助找出問題所在。

--------------------------編輯----------------------- ----------

這是updateTable()方法代碼:

public void updateTable(List l, List<String> columnNames)
    {
        super.setDataAndColumnNames(l, columnNames);
    }

在RowTableModel類上調用它:

protected void setDataAndColumnNames(List<T> modelData, List<String> columnNames) {
        this.modelData = modelData;
        this.columnNames = columnNames;
        columnClasses = new Class[getColumnCount()];
        isColumnEditable = new Boolean[getColumnCount()];
        fireTableStructureChanged();
    }

---------------------------- EDIT 2 -------------------- ----------

這是我的“新”類LeftPanel:

public class LeftPanel extends JPanel {

    private JButton startButton;
    private JButton editWithDogButtton;
    private JButton editWithPerson;
    private TablePanel tablePanel;
    private JTable table;
    private BeanTableModel beanTableModel;
    private XTableColumnModel columnModel;

    public LeftPanel() {
        initComponents();
        tablePanel = TablePanel.getInstance();
        table = new JTable();
        columnModel = new XTableColumnModel();
    }

    public void initComponents() {
        startButton = new JButton("Create table!");
        editWithDogButtton = new JButton("Edit with dog!");
        editWithPerson = new JButton("Edit with person!");

        setLayout(new GridBagLayout());
        GridBagConstraints constraints = new GridBagConstraints();

        constraints.gridx = 0;
        constraints.gridy = 0;
        add(startButton, constraints);

        constraints.gridx = 1;
        constraints.gridy = 0;
        add(editWithDogButtton, constraints);

        constraints.gridx = 1;
        constraints.gridx = 2;
        add(editWithPerson, constraints);

        startButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                List<Person> listPerson = new ArrayList<>();
                listPerson.add(new Person("John", "Spencer"));
                listPerson.add(new Person("Mike", "Strada"));
                listPerson.add(new Person("Johan", "Anderson"));

                ArrayList<String> columnLabels = new ArrayList<>();
                columnLabels.add("First name");
                columnLabels.add("Last name");

                tablePanel.createTable(Person.class, listPerson, true, true, columnLabels);
            }
        });

        editWithDogButtton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                List<Dog> listDog = new ArrayList<>();
                listDog.add(new Dog("Bob", "German Sheppard"));
                listDog.add(new Dog("Laika", "Bulldog"));

                ArrayList<String> columnLabels = new ArrayList<>();
                columnLabels.add("Dog's Name");
                columnLabels.add("Race");

                // Note to this code below 
                BeanTableModel<Dog> dogModel = new BeanTableModel<>(Dog.class);
                dogModel.insertRows(0, listDog);
                table.setModel(dogModel);
                table.setColumnModel(columnModel);
                table.createDefaultColumnsFromModel();
            }
        });

        editWithPerson.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                List<Person> listPerson2 = new ArrayList<>();
                listPerson2.add(new Person("Jessica", "Carlton"));
                listPerson2.add(new Person("Sthephanie", "Oujur"));
                listPerson2.add(new Person("Angela", "Parker"));

                ArrayList<String> columnLabels = new ArrayList<>();
                columnLabels.add("First Name2");
                columnLabels.add("Last Name2");

                tablePanel.updateTable(listPerson2, columnLabels); // It works!
            }
        });
    }

    public void createTable(Class c, List data) {
        beanTableModel = new BeanTableModel(c, data);
        table.setModel(beanTableModel);
        table.setColumnModel(columnModel);
        table.createDefaultColumnsFromModel();
    }
}

現在按下editWithDogButtton時沒有異常,但JTable沒有任何反應。 我想這可能是由於一個新表被創建或隱藏或某些東西,但我不確定...

BeanTableModel只能包含一種類型的對象。

您創建了TableModel來保存Person對象,因此您不能只將Dog對象添加到模型中。

如果您嘗試刪除模型中的所有Person對象並將其替換為Dog對象,那么您需要為Dog類創建一個全新的BeanTableModel。

編輯:

您可以使用以下代碼創建新模型:

BeanTableModel<Dog> dogModel = new BeanTableModel<Dog>(Dog.class);
dogModel.insertRows(...);
table.setModel( dogModel );

然后在你的情況下,因為你正在使用XTableColumnModel,你可能需要做額外的工作,我不知道它是如何工作的。

另外,我不確定為什么在TablePanel類中創建了TablePanel updateTable()方法。 RowTableModel具有允許您向模型動態添加數據的方法。 沒有必要將自己的updateTable()方法添加到BeanTableModel。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM