【问题标题】:Is it possible to create an Array of JTables in Java?是否可以在 Java 中创建 JTable 数组?
【发布时间】:2018-07-17 11:02:03
【问题描述】:

我要创建的是一个包含多个具有相同模型但这些模型的内容不同的 JTable 的 java 页面。 现在在编程时不知道所需的 jtables 总数,我想创建多个表实例, 我正在尝试创建一个 DefaultTableModel 数组,然后是一个 Jtable 数组,最后是一个 JScrollPane 数组。 当将模型附加到表格然后在滚动窗格中附加表格时,表格没有出现,也没有发生任何错误。

提前致谢!

private void showComponents() {

    lbl = new JLabel[users.size()];
    tbl = new JTable[users.size()];
    dtm = new DefaultTableModel[users.size()];
    sp = new JScrollPane[users.size()];

    for(int i =0;i<users.size();i++){
        lbl[i] = new JLabel(users.get(i));
        jPanel2.add(lbl[i]);
        dtm[i] = new DefaultTableModel(column,0){
                    @Override
                    public boolean isCellEditable(int row, int column) {
                    return false;
                    }
                };
        for(int j = 0;j<object.size();j++)
        {
            if(users.get(i).equals(object.get(j).getUser())){
                String code = object.get(j).getCompCode();
                String info = object.get(j).getInfo();
                Integer amount = object.get(j).getAmount();
                Boolean paid = object.get(j).getAmountPaid();

                Object[] data ={object.get(j).getUser(),code,info,amount,paid}; 
                System.out.println("data is :"+object.get(j).getService()+","+code+","+info+","+amount+","+paid+",::::"+object.get(j).getUser());

                dtm[i].addRow(data);
            }
        }
        tbl[i] = new JTable();
        tbl[i].setModel(dtm[i]);
        sp[i] = new JScrollPane();
        sp[i].setBackground(Color.red);
        sp[i].add(tbl[i]);
        jPanel2.add(sp[i]);
    }

    setVisible(true);        
}

这里的用户和对象是两个包含一些数据的arraylist。并且所有其他组件如JLabel,JPanel都已经定义了。

【问题讨论】:

  • 在你投反对票之前提供理由
  • 我同意,用户至少恐吓我为什么他/她投反对票
  • 我没有投反对票,但这个问题太宽泛了。首先对Is it possible to create an Array of JTables in Java? 的回答是肯定的,为什么不呢。但是您没有提供任何代码,因此从我们的角度来看,您的表格未显示的原因是无穷无尽的。请通过minimal reproducible example(stackoverflow.com/help/mcve)提问
  • 好的没问题,但您可以在评论部分请求代码..

标签: java arrays swing


【解决方案1】:

您定义了一个没有列的TableModel

dtm[i] = new DefaultTableModel(column,0)

constructor documentation状态参数顺序相反

public DefaultTableModel(int rowCount, int columnCount)

所以简单地使用:

dtm[i] = new DefaultTableModel(0,column)

这是经过一些更改后可以使用的方法,我只是使用了一些参数并更改了传递的数据(因为您没有提供任何东西来复制它)。

private void showComponents(List<String> users, Object[][] object) {

    lbl = new JLabel[users.size()];
    tbl = new JTable[users.size()];
    dtm = new DefaultTableModel[users.size()];
    sp = new JScrollPane[users.size()];

    for (int i = 0; i < users.size(); i++) {
        //Label
        lbl[i] = new JLabel(users.get(i));

        //Data
        dtm[i] = new DefaultTableModel(0, 2);
        for (int j = 0; j < object.length; j++) {
            Object[] data = object[j];
            dtm[i].addRow(data);
        }

        //Table
        tbl[i] = new JTable(dtm[i]);

        //Pane
        sp[i] = new JScrollPane(tbl[i]);
        sp[i].setBackground(Color.red);

        //Add components to panel
        jPanel2.add(lbl[i]);
        jPanel2.add(sp[i]);
    }

    setVisible(true);
}

对于具有相同数据的两个用户(“A”和“B”)的结果(使用基本的 JPanel):

另外,不要像这样将组件添加到 JScrollPane,用 JTable 实例化或将其添加到视口:

sp[i].getViewPort().add(tbl[i]);

来源:MadProgrammer - jScrollPane can't add component

【讨论】:

  • 让我尝试不使用滚动窗格。
  • @anshul 你有一个问题,因为我已经添加了我的代码显示的屏幕......如果你需要更多帮助,请提供minimal reproducible example
  • scrollpane 实际上允许我将表格包含在指定区域内。
  • @Anshul 检查我对滚动窗格的编辑。我在解决方案中使用了构造函数,所以这不是问题
  • @axelhhanks 提供有关新 JScrollPane(tbl[i]) 的建议,
【解决方案2】:

经过一番努力,我让你的代码工作了。

我试过你的:sp[i].getViewPort().add(tbl[i]);

并得到:未定义类型 JScrollPane。

我试过了:sp[i].getViewport().add(tbl[i]);

得到:NPE

当它工作时,每个 JTable 大约为 400x400 像素。 我指定了一个 600x300 JFrame,但只能看到 JLabel #1、JTable #1 的前 2/3 和 JLabel #2。 垂直拉伸窗口显示 JTable #2。 我没有红色像素。

感谢您展示 JTable 数组!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    相关资源
    最近更新 更多