我为我的申请做了一个gui. JFrame有2个JPanel,panel1&是Panel2. panel1就是这样,一个带有自定义绘画的JPanel,每5毫秒重绘一次.
panel2是我第一次尝试CardLayout:它包含JPanels subPanel1& subPanel2. subPanel1包含一个JComboBox并添加到panel2:panel2.add(subPanel1);.
subPanel2有.setLayout(new CardLayout());命令,我添加3个新的JPanels,适当的itemListener和所有.当然我也添加它:panel2.add(subPanel2);
现在问题是:在Java中集中组件.我知道方法setFocusable(boolean)和requestFocus().但我不能让它们以任何合理的方式表现出来.
首先,它们的根本问题是:当组合框获得焦点时,我根本无法完全聚焦它(尝试用光标到处点击).
以下是我进行的实验:
1)在整个应用程序中没有任何代码说话时,无论将哪个命令面板1和面板2添加到JFrame,组合框都从焦点开始.
2)如果我设置了panel1.setFocusable(true); (在它的构造函数中)它将从焦点开始
3)如果我设置了panel1.setFocusable(false);并且还要求关注它,它没有得到它. (只有按预期工作的东西)
4)如果我将panel2,subPanel1或subPanel2设置为单独或以任何组合不可聚焦,它们仍然可以获得焦点(组合框,即,这是唯一能够注册焦点的组件).
5)如果我将组合框设置为不可聚焦,我仍然可以使用框’itemListener在CardLayout中的卡之间滚动,但焦点不会粘在它上面.事实上,panel1仍然记录键盘输入
所以我真的很担心整个’焦点’的事情.也许这不是我认为的那样?我想要做的是完全阻止与panel2的所有交互,直到一个标志(每5毫秒评估一次)为真.我是否正确地认为,与JPanel不同,JComboBox会自动拥有一个mousebuttonListener,以便在点击时获得焦点?如果不是,那么如何完全禁用JComboBox和当前卡显示的所有组件?
不可聚焦组件中的组件仍然可以聚焦是否是正常行为?
解决方法:
听起来你真正想要使用的是.setEnabled(false)
如果您需要将面板中的所有组件都设置为禁用,那么您可以使用这样的方法来执行此操作:(可能不是JComponents的最佳方法,但如果需要可以轻松修改,但这确实有效)
public static void setContainerAndChildrenEnabled(Container c, boolean b)
{
Component[] allComps = c.getComponents();
for(Component com : allComps)
{
com.setEnabled(b);
if(com instanceof Container)
setContainerAndChildrenEnabled((Container) com, b);
}
}
然后使用您要设置的面板调用它,使用true或false调用它以启用/禁用.这也将递归调用Container中每个Component的setEnabled()
从文档中有两点要注意:
Note: Disabling a lightweight component does not prevent it from receiving MouseEvents.
Note: Disabling a heavyweight container prevents all components in this container from receiving any input events. But disabling a lightweight container affects only this container.