Java阻止来自JComponent的焦点

我为我的申请做了一个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()

从文档中有两点要注意:

  1. Note: Disabling a lightweight component does not prevent it from receiving MouseEvents.

  2. 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.

isLightweight()

上一篇:从枚举中填充JavaFX ComboBox或ChoiceBox


下一篇:如何在PyQt4中创建自动完成组合框?