【问题标题】:Getting components of a jpanel while on runtime在运行时获取 jpanel 的组件
【发布时间】:2016-02-10 16:37:09
【问题描述】:

如何在 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;
                }
}
}
}

【问题讨论】:

  • 请详细说明您的问题并显示您的相关代码,以便我们为您提供更具体的建议。
  • 我知道我面临的问题是我没有在运行时创建 jtable...我想知道如何
  • 你需要认真思考。 jPanel1 持有什么?一个 JScrollPane,这就是你得到的。是的,如果您使用递归,您可以获得您的 JTable,但您不应该这样做,因为尝试获得 JTable 的引用是一种糟糕且脆弱的方式。将来对程序结构的一个小改动就会破坏它。同样,这只是一个 XY 问题,您应该使用 OOP 技术来解决这个问题,而不是像您正在做的那样使用 kluges。
  • 换句话说,这:jPanel1.getComponents() 返回一个数组,其中只有一个 JScrollPane —— 你为什么认为你会得到其他东西?您还直接向 jPanel1 添加了什么?
  • 我以为它拿着一个jtable。否则我会首先尝试搜索滚动窗格

标签: java swing jpanel runtime jcomponent


【解决方案1】:

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

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


编辑

我还以为是JTable呢

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

jPanel1.add(new JScrollPane(tbl));

你看到什么被直接添加到jPanel1?答案:new JScrollPane(...) 你的 JTable 在那里,但它距离 jPanel1 有两个容器,因为它由滚动窗格的 JViewport 持有,而滚动窗格的 JViewport 由 JScrollPane 持有:

是的,如果你递归地遍历 jPanel1 的孩子,你可以得到它,但那是脆弱的代码。

...但我很好奇你为什么认为我在做克鲁格技术

因为您使用 GUI 结构来获取逻辑引用,而当您这样做时,您会创建非常脆弱的代码。如果其他人必须维护此代码,然后对 GUI 结构进行更改,则引用将被破坏,他们最终会摸不着头脑,想知道为什么您的代码现在抛出 NullPointerExceptions。

为什么不简单地将 JTable(或者更好的是,它的模型)转换为变量或某种集合以便于轻松稳定地引用?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-27
    • 2012-08-18
    • 1970-01-01
    • 2011-03-27
    • 2014-01-28
    • 2016-11-19
    • 1970-01-01
    • 2021-10-26
    相关资源
    最近更新 更多