在运行时获取 jpanel 的组件
Getting components of a jpanel while on runtime
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;
}
}
}
}
我认为你的问题是 XY problem 的一个例子,你问的是如何解决特定的代码问题,如何在容器中获取组件,而最佳解决方案可能是完全使用不同的方法。至于你的直接问题,这只需在容器上调用 getComponents()
即可完成,该方法 returns 一个组件数组,但如果嵌套容器,则需要深入研究 container/component树找到你感兴趣的组件。对于整体问题——如何获取兴趣引用,通常有更好、更清晰的解决方案,例如创建一个 ArrayList 或 HashMap 来保存您感兴趣的引用,但解决方案的细节将取决于您的问题和代码的细节,对此我们知之甚少。
一如既往,尽量确保将 GUI 代码与逻辑代码分开,这通常最好通过类似 M-V-C 的程序结构来实现。
编辑:
I thought it was holding a JTable
看看自己的代码;它不会说谎:
jPanel1.add(new JScrollPane(tbl));
您看到直接 添加到 jPanel1 的是什么?答案:new JScrollPane(...)
你的 JTable 在那里,但它是 jPanel1 深处的两个容器,因为它由 JScrollPane 持有的滚动窗格的 JViewport 持有:
是的,如果您递归遍历 jPanel1 的子项,您可以找到它,但那是脆弱的代码。
... but I'm curious as to why you think I'm doing kluges techniques
因为您正在使用 GUI 结构来获取逻辑引用,并且当您这样做时,您会创建非常脆弱的代码。如果其他人必须维护此代码,然后更改 GUI 结构,则引用将被破坏,他们最终会挠头想知道为什么您的代码现在抛出 NullPointerExceptions。
为什么不简单地将 JTable(或者更好的是,它的模型)放入变量或某种集合中以方便和稳定地引用?
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;
}
}
}
}
我认为你的问题是 XY problem 的一个例子,你问的是如何解决特定的代码问题,如何在容器中获取组件,而最佳解决方案可能是完全使用不同的方法。至于你的直接问题,这只需在容器上调用 getComponents()
即可完成,该方法 returns 一个组件数组,但如果嵌套容器,则需要深入研究 container/component树找到你感兴趣的组件。对于整体问题——如何获取兴趣引用,通常有更好、更清晰的解决方案,例如创建一个 ArrayList 或 HashMap 来保存您感兴趣的引用,但解决方案的细节将取决于您的问题和代码的细节,对此我们知之甚少。
一如既往,尽量确保将 GUI 代码与逻辑代码分开,这通常最好通过类似 M-V-C 的程序结构来实现。
编辑:
I thought it was holding a JTable
看看自己的代码;它不会说谎:
jPanel1.add(new JScrollPane(tbl));
您看到直接 添加到 jPanel1 的是什么?答案:new JScrollPane(...)
你的 JTable 在那里,但它是 jPanel1 深处的两个容器,因为它由 JScrollPane 持有的滚动窗格的 JViewport 持有:
是的,如果您递归遍历 jPanel1 的子项,您可以找到它,但那是脆弱的代码。
... but I'm curious as to why you think I'm doing kluges techniques
因为您正在使用 GUI 结构来获取逻辑引用,并且当您这样做时,您会创建非常脆弱的代码。如果其他人必须维护此代码,然后更改 GUI 结构,则引用将被破坏,他们最终会挠头想知道为什么您的代码现在抛出 NullPointerExceptions。
为什么不简单地将 JTable(或者更好的是,它的模型)放入变量或某种集合中以方便和稳定地引用?