Java JTabbedPane 获取组件
Java JTabbedPane get Components
我正在尝试更新我编写的程序的 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 工作正常。
但是现在,与选项卡窗格相同的方法我只收到第一个组件和很多 "null" 而不是其他组件。
这是 System.out.pritnln(comp) 的结果,在选项卡窗格中有一个 Jpanel
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
"old" GUI 和新的 GUI 都是使用 NetBeans 中嵌入的 GUI 创建器完成的,所以可能所有组件的设置都是相同的..
但是 TabbedPane 内的面板的处理方式是否不同于 JPanel 而不是 JFrame?
以防万一有人遇到同样的情况,我用这个解决了:
在 GUI 内部 class 创建了一个带有面板的容器:
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;
}
我正在尝试更新我编写的程序的 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 工作正常。 但是现在,与选项卡窗格相同的方法我只收到第一个组件和很多 "null" 而不是其他组件。
这是 System.out.pritnln(comp) 的结果,在选项卡窗格中有一个 Jpanel
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
"old" GUI 和新的 GUI 都是使用 NetBeans 中嵌入的 GUI 创建器完成的,所以可能所有组件的设置都是相同的..
但是 TabbedPane 内的面板的处理方式是否不同于 JPanel 而不是 JFrame?
以防万一有人遇到同样的情况,我用这个解决了:
在 GUI 内部 class 创建了一个带有面板的容器:
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;
}