我正在尝试更新我编写的程序的GUI。在新的GUI上,我有一个JFrame,其中包含一个JPanel,它有一个JTabbedPane和两个上面的按钮。
在JTabbedPane内部,我有三个JPanel,里面有不同的组件。 (比如按钮,文本字段等)所以现在我必须让所有组件根据类型对它们执行相同的操作。
实施例。如果有一个文本字段我必须做一些事情,但如果有一个按钮我必须做其他事情。
所以以前我做过这样的事情:
Container focus = general_panel.getFocusCycleRootAncestor();
FocusTraversalPolicy ftp = focus.getFocusTraversalPolicy();
Component comp = ftp.getFirstComponent(general_panel);
Component first = comp;
while(comp != null){
if(comp instanceof JComboBox){
((JComboBox) comp).setSelectedIndex(0);
}
....
comp = ftp.getComponentAfter(focus, comp);
if(comp.equals(first)){
break;
}
}
使用以前GUI的JPanel工作正常。 但是现在,与tabbedpane相同的方法我只收到第一个组件和很多“null”而不是其他组件。
这是在tabbedpane中有一个Jpanel的System.out.pritnln(comp)的结果
javax.swing.JComboBox[,26,24,78x25,layout=javax.swing.plaf.basic.BasicComboBoxUI$Handler,alignmentX=0.0,alignmentY=0.0,border=com.bulenkov.darcula.ui.DarculaComboBoxUI@3b43d6ce,flags=328,maximumSize=,minimumSize=,preferredSize=,isEditable=false,lightWeightPopupEnabled=true,maximumRowCount=8,selectedItemReminder=Bianco]
null
null
null
null
null
null
null
null
null
null
null
null
null
null
“旧”GUI和新旧GUI都是使用NetBeans中嵌入的GUI创建者完成的,因此所有组件的设置可能都是相同的。
但TabbedPane中的Panel是否通过JFrame以不同的方式处理JPanel?
答案 0 :(得分:0)
为了防止有人在同样的情况下陷入困境,我解决了这个问题:
在GUI类中创建了一个带面板的容器:
Container focus = pnl_generali.getFocusCycleRootAncestor();
然后以下方法完成剩下的工作:
public static List<Component> getAllComponents(final Container c) {
Component[] comps = c.getComponents();
List<Component> compList = new ArrayList<Component>();
for (Component comp : comps) {
compList.add(comp);
if (comp instanceof Container) {
compList.addAll(getAllComponents((Container) comp));
}
if(comp instanceof JTextField){
System.out.println(comp);
}
}
return compList;
}