Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java,如何重新定义JTable_Java_Swing_Jtable_Actionlistener_Repaint - Fatal编程技术网

Java,如何重新定义JTable

Java,如何重新定义JTable,java,swing,jtable,actionlistener,repaint,Java,Swing,Jtable,Actionlistener,Repaint,我有两张桌子。一个用于发票列表,另一个用于发票中的产品列表。我创建了一个监听器,这样我就可以通过鼠标单击从第一个JTable获取发票的id值,然后使用另一种方法为另一个表生成一个新的表内容(该方法工作正常)。然而,在更新表之后,我试图找到刷新它的方法,但没有成功。。。我只是在寻找一种在触发鼠标事件时刷新第二个表的方法 以下是部分代码: 带两个JTables的面板 public JPanel tabInvoices() { final JPanel panel = new JPanel(

我有两张桌子。一个用于发票列表,另一个用于发票中的产品列表。我创建了一个监听器,这样我就可以通过鼠标单击从第一个JTable获取发票的id值,然后使用另一种方法为另一个表生成一个新的表内容(该方法工作正常)。然而,在更新表之后,我试图找到刷新它的方法,但没有成功。。。我只是在寻找一种在触发鼠标事件时刷新第二个表的方法

以下是部分代码:

带两个JTables的面板

public JPanel tabInvoices() {

    final JPanel panel = new JPanel(new MigLayout("", "20 [grow, fill] 10 [grow, fill] 20", "20 [] 10 [] 20"));

    final DefaultTableModel model1;
    final JTable table1, table2;

    String data[][] = {};
    String col1[] = {"ID", "Date"};
    String col2[] = {"ID", "Name", "Type", "Price", "Quantity"};
    Object[][] selrowData = {};   

    /** Labels and buttons **/
    JLabel labelInv = new JLabel("List of all invoices");
    JLabel labelPro = new JLabel("List of all products in this invoice");

    /** TABLE: Invoices **/
    model1 = new DefaultTableModel(data, col1);
    invoiceInfo = new DefaultTableModel(selrowData,col2);

    /** Load the invoices from DB **/
    List<Invoice> listInv = is.getAllInvoices();
    for (int i = 0; i < listInv.size(); i++) {
        model1.insertRow(i, new Object[] {
                listInv.get(i).getID(),
                listInv.get(i).getDate()
        });
    }

    /** TABLE: Invoices **/
    table1 = new JTable(model1){
        public boolean isCellEditable(int r, int c) {
            return false;
        }
    };

    /** TABLE: Invoice Info **/
    table2 = new JTable(invoiceInfo){
        public boolean isCellEditable(int r, int c) {
            return false;
        }
    };


    /** Cell and Row selection listener **/
    ListSelectionModel cellSelectionModel = table1.getSelectionModel();
    cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    cellSelectionModel.addListSelectionListener(new ListSelectionListener() {
        @Override
        public void valueChanged(ListSelectionEvent arg0) {
            int id = (int)table1.getValueAt(row, 0);            // Get ID from first table
            invoiceInfo.getDataVector().removeAllElements();    // Remove everything from second table
            invoiceInfo = getInvoiceInfo(id, invoiceInfo);      // replace with new values

            /**
             * HERE'S WHERE I NEED TO REFRESH THE TABLE2. HOW?
             */
        }
    });


    /** Load the products from DB belonging to this invoice **/
    List<Product> listPro = is.getInvoiceInfo(row); // TODO Listener!
    for (int i = 0; i < listPro.size(); i++) {
        invoiceInfo.insertRow(i, new Object[] {
                listPro.get(i).getID(),
                listPro.get(i).getName(),
                listPro.get(i).getType(),
                listPro.get(i).getPrice(),
                listPro.get(i).getQuantity()
        });
    }
    /** Scroll Panes **/
    JScrollPane scrollInv = new JScrollPane(table1);
    JScrollPane scrollPro = new JScrollPane(table2);

    /** Add everything to the panel **/
    panel.add(labelInv);
    panel.add(labelPro, "wrap");
    panel.add(scrollInv);
    panel.add(scrollPro);

    return panel;
}
public JPanel tabInvoices(){
最终JPanel面板=新的JPanel(新的MIG布局(“,”20[grow,fill]10[grow,fill]20”,“20[]10[]20”);
最终模型1;
最终JTable表1、表2;
字符串数据[][]={};
字符串col1[]={“ID”,“Date”};
字符串col2[]={“ID”、“Name”、“Type”、“Price”、“Quantity”};
对象[][]selrowData={};
/**标签和按钮**/
JLabel labelInv=新的JLabel(“所有发票列表”);
JLabel labelPro=新JLabel(“本发票中所有产品的列表”);
/**表:发票**/
model1=新的DefaultTableModel(数据,col1);
invoiceInfo=新的DefaultTableModel(selrowData,col2);
/**从数据库加载发票**/
List listInv=is.getAllInvoices();
对于(int i=0;i
以及每次单击左表中的任何单元格时用于重新创建第二个表的方法:

public DefaultTableModel getInvoiceInfo(int id, DefaultTableModel model) {

    String data1[][] = {};
    String col1[] = {"ID", "Name", "Type", "Price", "Quantity"};
    DefaultTableModel info = new DefaultTableModel(data1,col1);

    /** Load products from DB **/
    List<Product> products = is.getInvoiceInfo(id);
    for (int i = 0; i < products.size(); i++) {
        info.insertRow(i, new Object[] {
                products.get(i).getID(),
                products.get(i).getName(),
                products.get(i).getType(),
                products.get(i).getPrice(),
                products.get(i).getQuantity()
        });
    }
    return info;
}
public DefaultTableModel getInvoiceInfo(int-id,DefaultTableModel-model){
字符串数据1[][]={};
字符串col1[]={“ID”、“Name”、“Type”、“Price”、“Quantity”};
DefaultTableModel info=新的DefaultTableModel(数据1,col1);
/**从数据库加载产品**/
列表产品=is.getInvoiceInfo(id);
对于(int i=0;i
刷新表不需要显式代码。insertRow()为您触发一个更改事件,表将侦听该事件并根据需要重新绘制自身

但是,您正在getInvoiceInfo方法中创建DefaultTableModel的新实例。您的JTable听不到这个新模型。因此,通过insertRow()fire进行的更新将变为“稀薄的空气”,并且您的JTable无论如何都没有对它的引用

快速修复方法是将代码更改为以下内容:

public void getInvoiceInfo(int id, DefaultTableModel model) {

    /** Load products from DB **/
    List<Product> products = is.getInvoiceInfo(id);
    for (int i = 0; i < products.size(); i++) {
        model.insertRow(i, new Object[] {
                products.get(i).getID(),
                products.get(i).getName(),
                products.get(i).getType(),
                products.get(i).getPrice(),
                products.get(i).getQuantity()
        });
    }
}
public void getInvoiceInfo(int-id,DefaultTableModel模型){
/**从数据库加载产品**/
列表产品=is.getInvoiceInfo(id);
对于(int i=0;i
刷新表不需要显式代码。insertRow()为您触发一个更改事件,表将侦听该事件并根据需要重新绘制自身

但是,您正在getInvoiceInfo方法中创建DefaultTableModel的新实例。您的JTable听不到这个新模型。因此,通过insertRow()fire进行的更新将变为“稀薄的空气”,并且您的JTable无论如何都没有对它的引用

快速修复方法是将代码更改为以下内容:

public void getInvoiceInfo(int id, DefaultTableModel model) {

    /** Load products from DB **/
    List<Product> products = is.getInvoiceInfo(id);
    for (int i = 0; i < products.size(); i++) {
        model.insertRow(i, new Object[] {
                products.get(i).getID(),
                products.get(i).getName(),
                products.get(i).getType(),
                products.get(i).getPrice(),
                products.get(i).getQuantity()
        });
    }
}
public void getInvoiceInfo(int-id,DefaultTableModel模型){
/**从数据库加载产品**/
列表产品=is.getInvoiceInfo(id);
对于(int i=0;iif (myTableModel.getRowCount() > 0) {
    for (int i = myTableModel.getRowCount() - 1; i > 0; i--) {
         myTableModel.removeRow(i);
    }
}