我已经为我的应用程序制作了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/