我已经为我的应用程序制作了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)无论在panel1和panel2的顺序是添加到JFrame,组合框都从焦点开始,而没有任何代码在整个应用程序中聚焦。

2)如果我在其构造函数中设置panel1.setFocusable(true);,它将以焦点开始

3)如果我设置了panel1.setFocusable(false);并要求将焦点对准它,它不会得到它。 (仅能按预期工作的东西)

4)如果我将panel2,subPanel1或subPanel2设置为无法单独或以任何组合方式无法对焦,则它们仍可以接收焦点(组合框,即唯一能够注册焦点的组件)。

5)如果我将组合框设置为无法对焦,则仍然可以使用框的itemListener在CardLayout中的卡之间滚动,但是焦点不会一直停留在它上面。实际上,panel1仍注册键盘输入

因此,我真的对整个“重点”事情感到非常困惑。也许不是我想的那样?我试图做的是完全阻止所有与panel2的交互,直到一个标志(每5毫秒评估一次)为真。我是否可以正确假设与JPanels不同,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启用/禁用。这还将递归地为setEnabled()中的每个Component调用Container

从文档中有两点需要注意:


  
  注意:禁用轻量级组件不会阻止其接收MouseEvent。
  注意:禁用重量级容器将阻止该容器中的所有组件接收任何输入事件。但是禁用轻量级容器只会影响此容器。
  


isLightweight()

关于java - Java阻止来自JComponent的关注,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19799451/

10-10 06:35