Row不会使用向量

时间:2016-05-27 17:47:51

标签: java swing vector jtable

我正在为工作创建Swing应用程序,而且我的JTable出现问题。

该过程是检查文件是否存在,如果存在,则从文件中检索信息并填充JTable。这很好。

我在我的文本字段中输入数据,从下拉框中选择,当我点击保存按钮时,我将信息写入文件(没有问题就完成了),文件创建后,我希望有该行添加到我的表格末尾。这是我遇到问题的地方。

我最终在OutputTable中调用addRow方法,传递用户输入的数据。正如您在此处所见,数据正确存储在向量中:

d1 is[999999999, 27-May-2016, asdfasdf, OCOB, UA2, 1, asdf,     sadsadfasdf, IU2, 1, 28-May-2016, In Progress]
d2 is[999999999, 27-May-2016, asdfasdf, OCOB, UA2, 1, asdf,     sadsadfasdf, IU2, 1, 28-May-2016, In Progress]

但我的dtm.addRow(data)不会将该行添加到表格中。

有人可以帮忙吗?

这是我的类,它从文件中检索数据以在我的应用程序开始时填充表。通过按钮执行操作。

我的addRow方法就在这个类中。

public class OutputTable {

    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static void populateTable(Vector data){

        Vector columnName = new Vector(12);

        columnName.addElement("ID");
        columnName.addElement("<HTML>DATE <BR/>Retrieve");
        columnName.addElement("<HTML>Name of <BR/>Module");
        columnName.addElement("<HTML>Type of <BR/>Module");
        columnName.addElement("<HTML>Environment <BR/>retrieve from");
        columnName.addElement("<HTML>Stage <BR/>retrieve from");
        columnName.addElement("<HTML>Working <BR/>location");
        columnName.addElement("<HTML>Description <BR/>of changes");
        columnName.addElement("<HTML>Environment <BR/>moved to");
        columnName.addElement("<HTML>Stage <BR/>move to");
        columnName.addElement("<HTML>Date of the <BR/>endevor");
        columnName.addElement("<HTML>Current <BR/>Work <BR/>Status");

        DefaultTableModel dtm = new DefaultTableModel(data, columnName);

        final JTable table = new JTable();

        table.setModel(dtm);
        table.setFillsViewportHeight(true);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());

        JScrollPane scrollPane = new JScrollPane(table);
        table.getTableHeader().setPreferredSize(new Dimension(scrollPane.getWidth(),60));
        scrollPane.setViewportBorder(UIManager.getBorder("Table.scrollPaneBorder"));
        scrollPane.setBounds(10, 425, 875, 195);

        EndevorChanges.frmEndevorChanges.getContentPane().add(scrollPane); 

}

    public static void addRow(String UserID, String DateRtrv, String ModRtrv, String ModType, String EnvFrom, String StgFrom, String WrkngLct, String Desc, String EnvTo, String StgTo, String DateTo, String WrkSts) {

        System.out.println("Im inside the addrow method.");

        Vector<Vector<String>> data = new Vector<Vector<String>>();
        Vector<String> d = new Vector<String>();
        Vector columnName = new Vector(12);
        String[] strngArray = {UserID, DateRtrv, ModRtrv, ModType, EnvFrom, StgFrom, WrkngLct, Desc, EnvTo, StgTo, DateTo, WrkSts};

    /*  columnName.addElement("ID");
        columnName.addElement("<HTML>DATE <BR/>Retrieve");
        columnName.addElement("<HTML>Name of <BR/>Module");
        columnName.addElement("<HTML>Type of <BR/>Module");
        columnName.addElement("<HTML>Environment <BR/>retrieve from");
        columnName.addElement("<HTML>Stage <BR/>retrieve from");
        columnName.addElement("<HTML>Working <BR/>location");
        columnName.addElement("<HTML>Description <BR/>of changes");
        columnName.addElement("<HTML>Environment <BR/>moved to");
        columnName.addElement("<HTML>Stage <BR/>move to");
        columnName.addElement("<HTML>Date of the <BR/>endevor");
        columnName.addElement("<HTML>Current <BR/>Work <BR/>Status");
        */
        DefaultTableModel dtm = new DefaultTableModel(data, columnName);

        JTable table = new JTable();

        //table.setModel(dtm);

        System.out.println("the data is: " + data.toString());

        for (int lmnts = 0; lmnts < 12; lmnts++){
            d.add(strngArray[lmnts]);
            System.out.println("element" + lmnts + " value is: " + strngArray[lmnts]);
            System.out.println("d1 is" + d);
        }
        data.add(d);

        System.out.println("d2 is" + d);

        dtm.addRow(data);
        //dtm.insertRow(4, data);

        dtm.fireTableDataChanged();

        table.repaint();

        System.out.println("at the end of the method");

    }

}

1 个答案:

答案 0 :(得分:2)

你的行实际上正好被添加到JTable的TableModel中,但问题是它被添加到错误的 JTable中。目前存在的问题很明显:

public class OutputTable {

    public static void populateTable(Vector data){

        // .... code removed for brevity's sake

        // you create a *local* DefaultTableModel variable here. It is only visible within this method
        DefaultTableModel dtm = new DefaultTableModel(data, columnName);

        // Likewise, this JTable variable is *local*
        final JTable table = new JTable();

        // .....
    }

    public static void addRow(String UserID, String DateRtrv, String ModRtrv, String ModType, String EnvFrom, String StgFrom, String WrkngLct, String Desc, String EnvTo, String StgTo, String DateTo, String WrkSts) {

        // .....

        // this guy is a completely new unique DefaultTableModel object, again placed
        // within a local variable, one only seen within this method.
        DefaultTableModel dtm = new DefaultTableModel(data, columnName);

        // and a new local JTable
        JTable table = new JTable();


        // here you "repaint" this JTable, and it's not even displayed in your GUI
        table.repaint();

    }
}
  • 您正在声明变量并在方法中分配tablemodel和JTable,这意味着这些变量在此方法中可见,而在其他任何地方都不可见。
  • 然后,您将在单独的方法中创建 new JTable和新表模型,更新模型,并期望可视化表(一个完全独立且唯一的对象)进行神奇更新 - 不会发生。
  • 在静态方法中执行任何此操作都会过度使用静态。

建议:

  • 创建私有实例JTable和DefaultTableModel变量。
  • 创建对象并将它们分配给这些变量,无论是在构造函数中还是在实例方法中。
  • 当您需要更新模型时,请使用上面的变量,然后添加一行。问题解决了!
  • 请注意, BAD 解决方案是尝试使用静态变量。说真的,不要去那里。

此外:

  • 尝试将所有代码从静态领域中移出并进入实例领域。
  • 主要方法应该简短,只应用于创建密钥对象,然后启动它们运行,就是这样。
  • 您似乎使用了空布局和setBounds(...)。虽然null布局和setBounds()似乎是Swing新手,比如创建复杂GUI的最简单和最好的方法,但是你创建的Swing GUI越多,在使用它们时会遇到更严重的困难。当GUI调整大小时,它们不会调整组件的大小,它们是增强或维护的皇室女巫,当它们被放置在滚动窗格中时它们完全失败,当它们在所有平台上观看时或者与原始平台不同的屏幕分辨率时它们看起来很糟糕
  • 您正在以危险和混乱的方式混合模型视图代码。如果你可以干净利落地分离这些人,你将更容易调试和增强你的程序。例如,表模型创建和修改代码应该与将JTable和JScrollPanes添加到GUI的代码分开。