在运行时获取jpanel的组件

时间:2016-02-10 16:37:09

标签: java swing jpanel runtime jcomponent

如何在Java中运行时获取jpanel的组件。我一直在尝试获取组件以便使用它们作为参数执行方法,但我意识到由于某种原因,我似乎无法在运行时获取组件。如果您需要更多细节让我知道,我只是不想让代码变得多余,因为我认为我可以在没有显示它的情况下得到答案。但是,如果需要,请告诉我。

public SetupFrame2(int flats, int floors ) {
    initComponents();
    //Construction of the JTABLE
    jPanel1.setLayout(new BorderLayout());
    int rows = flats*floors;
    JTable tbl = new JTable();
    DefaultTableModel dtm = new DefaultTableModel();

    String colomnName[] = {"Floor","Flat","Area","View","Vacant"};
    dtm.setColumnIdentifiers(colomnName);

    for (int count = 1; count <= rows; count++) {
    dtm.addRow(new Object[] {"", "", "","",""});
    }
    tbl.setModel(dtm);
    tbl.setPreferredScrollableViewportSize(new Dimension(100,250));
    tbl.setFillsViewportHeight(true);
    tbl.getTableHeader().setReorderingAllowed(false);

    jPanel1.add(new JScrollPane(tbl));     
}

*

private void submitButtonActionPerformed(java.awt.event.ActionEvent evt) {    
 for( Component f : jPanel1.getComponents() ) {          //It isnt getting the component on run time,
            if(f instanceof JTable){    
                if(isJTableEmpty((JTable)f) == false){  //isJtable is a function form setupFrame2's superclass and its job so far is to return false, however its not working...
                JOptionPane.showMessageDialog(null, "Empty", "Error", JOptionPane.ERROR_MESSAGE);
                break;
                }
}
}
}

1 个答案:

答案 0 :(得分:3)

我认为你的问题是XY problem的一个例子,你问如何解决特定的代码问题,如何在容器中获取组件,何时最佳解决方案可能是使用完全不同的方法。至于你的直接问题,这只需要通过调用容器上的getComponents()来完成,这是一个返回Component数组的方法,但是如果你嵌套容器,你需要深入到容器/组件树中去找到您感兴趣的组件。对于整体问题 - 如何获取interes的引用,通常有更好更清晰的解决方案,如创建ArrayList或HashMap来保存您感兴趣的引用,解决方案的细节虽然取决于您的问题和代码的详细信息,我们知之甚少。

与往常一样,尽量确保将GUI代码与逻辑代码分开,这通常最好通过类似M-V-C的程序结​​构来实现。

修改

  

我以为它持有JTable

看看你自己的代码;它不会说谎:

jPanel1.add(new JScrollPane(tbl));

您认为直接添加到jPanel1的内容是什么?答案:new JScrollPane(...)你的JTable在那里,但它是jPanel1的两个容器,因为它是由JScrollPane保存的滚动窗口的JViewport所持有的:

structure of a JScrollPane

是的,如果你递归地通过jPanel1的孩子,你可以得到它,但这是脆弱的代码。

  

...但我很好奇为什么你认为我在做kluges技术

因为您正在使用GUI结构来获取逻辑引用,所以当您执行此操作时,您将创建非常脆弱的代码。如果其他人必须维护此代码,然后对GUI结构进行更改,那么引用将被破坏,并且他们最终会不知道为什么您的代码现在抛出NullPointerExceptions。

相反,为什么不简单地将JTable(或者更好的,它的模型)变成变量或某种类型的集合以便于稳定地引用?