当前位置: 首页 > 面试题库 >

Java阻止来自JComponent的关注

郭辉
2023-03-14
问题内容

我已经为我的应用程序制作了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()每一个ComponentContainer

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

  1. 注意:禁用轻量级组件不会阻止其接收MouseEvent。

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

看到
isLightweight()



 类似资料:
  • 我试图部署一个API用于前端。当单独测试API时,它是工作的,但当集成到Vue应用程序中时,它返回CORS错误,错误返回是: CORS策略阻止从来源“http://localhost:8080”访问位于“https://apidomain/development/pin”的XMLHttpRequest:请求的资源上没有“Access-Control-Allow-Origin”标头。 我使用serv

  • 我正在尝试使用keycloak从现有的localhost(localhost:3000)登录页面进行登录。Keycloak在另一台主机上运行(http://kchost:38080)。我知道这不是推荐的登录方式,但我需要尽快适应现有的系统。 尝试卷曲: 错误是:CORS策略阻止了从来源“http://localhost:3000”访问位于“http://kchost:38080/auth/real

  • 主要内容:1 Java JComponent的介绍,2 Java JComponent的字段,3 Java JComponent的构造方法,4 Java JComponent的方法,5 Java JComponent的案例1 Java JComponent的介绍 JComponent类是除顶层容器之外的所有Swing组件的基类。名称以“ J”开头的Swing组件是JComponent类的后代。例如,JButton,JScrollPane,JPanel,JTable等。但是,JFrame和JDia

  • 问题内容: 我想在finally块中关闭流,但是它抛出一个,因此看来我必须在块中嵌套另一个块才能关闭流。这是正确的方法吗?似乎有点笨拙。 这是代码: 问题答案: 似乎有点笨拙。 它是。至少java7尝试使用资源可以解决该问题。 在java7之前,您可以创建一个吞咽它的函数: 或将try …最终放入try catch中: 它比较冗长,并且finally中的异常会在try中隐藏一个,但从语义上讲它更接

  • 问题内容: 这个问题解决了。 我正在开发一个基于Java Swing的项目,并且该应用程序的外观是完全自定义的。我们试图在整个程序中保持一致的外观,并且默认的Java对话框窗口不同。 当前问题要求控件禁止调用用户提示。与JOptionPane.showConfirmDialog()相似,在这种情况下,静态调用将产生一个窗口,并暂停程序的流程,直到用户选择一个选项为止。它还返回选项的值。请注意,GU

  • 我在Axios Laravel crossite中遇到问题,它返回以下erorr: CORS 策略阻止了从源“http://localhost:8000”在“http://localhost/moddle/moodle/login/index.php”处访问 XMLHttpRequest:对预检请求的响应未通过访问控制检查:请求的资源上不存在“访问控制-允许-源”标头。 我在stackoverfl