当前位置: 首页 > 知识库问答 >
问题:

在JTabbedPane中聚焦JTextArea

吕霖
2023-03-14

我正在用Java编程一个聊天客户机,在那里我希望有一个单独的JDialog用于所有打开的聊天。所以我决定使用一个JTabbedPane,其中一个选项卡代表一个单独的聊天。

我在每个选项卡中都放了一个JPanel,它只包含一个用于消息历史记录的JTextPane和一个用户输入消息的JTextArea。

为了更好的可用性,我实现了一个特性,当

  1. 打开新的ChatTab
  2. 用户在chattab之间进行更改(JTabbedPane的ChangeListener激发)

我有一个类ChatWindow,它扩展了JDialog并显示JTabbedPane。这就是我实现ChangeListener的地方。

private JTabbedPane chatTabPane;
private List<ChatTab> chatTabs;

public ChatWindow() {
    chatTabs = new ArrayList<ChatTab>();

    JPanel chatWindowPanel = new JPanel(new BorderLayout());

    chatTabPane = new JTabbedPane(JTabbedPane.TOP);
    chatWindowPanel.add(chatTabPane);

    this.add(chatWindowPanel, BorderLayout.CENTER);

    chatTabPane.addChangeListener(new ChangeListener() {

        @Override
        public void stateChanged(ChangeEvent arg0) {
            focusInputField();
        }
    });
}

public ChatTab addChatTab(Contact contact) {
    ChatTab newChatTab = new ChatTab();
    chatTabs.add(newChatTab);
    chatTabPane.addTab(contact.toString(), null, newChatTab.getPanel());
    return newChatTab;
}

public void focusInputField() {
    for (ChatTab chatTab : chatTabs) {
        if(chatTab.getPanel() == chatTabPane.getSelectedComponent()) {
            chatTab.focusInputField();
        }
    }
}

public JTabbedPane getChatTabs() {
    return chatTabPane;
}
}

ChatTab类中的方法focusInputField()简单地看起来如下所示:

public void focusInputField() {
    inputField.requestFocusInWindow();
    inputField.requestFocus();
}

好的,这是标签改变时的焦点。此外,我还实现了在创建新的聊天选项卡时聚焦JTextArea。在类ChatWindowController中处理的。有一个方法setChatVisible(),当我向ChatWindow类添加一个新选项卡时,我会调用它:

public void setChatVisible() {
    if(!chatWindow.isVisible()) {
        chatWindow.setVisible(true);

        chatWindow.focusInputField();
    }
}

所以我的问题是:当我打开一个新的chattab时,焦点就会起作用。在大多数情况下,当用户更改选项卡时,它也起作用,但当我打开多个新的聊天选项卡并第一次在选项卡之间切换时,它就不聚焦了。我切换到的选项卡的JTextArea没有聚焦。然而,当我再次切换时,它一直起作用。

有人知道问题是什么吗?我真的没主意了。

共有1个答案

包谭三
2023-03-14

不正确的同步可能导致间歇性故障。有几件事应该批判性地加以审查:

>

  • 验证您在事件调度线程(EDT)上构造了所有GUI元素。

    例如,由于您确实使用了多个线程,请验证所有更新都发生在EDT上。

    您可以使用invokelater()在EDT上排序事件,如下所示。

    首选RequestFocusInWindown()而不是RequestFocus(),但不要两者都使用。

  •  类似资料:
    • 我对此完全陌生..... 问题是,当我切换到任何选项卡时,我无法获得正常的jpanel效果。按钮不能用鼠标点击(可以通过按tab键选择按钮n然后按space键点击),文本字段不能在鼠标点击时选择(只能通过按tab键选择)等。 那么对此有什么解决办法吗??我希望jtabbedpane中的面板像普通jpanel一样工作:)谢谢:)

    • 我有一个JTabbed面板,它有4个选项卡。每个选项卡都有一个 JTable。我正在尝试为JTabbedPane设计一个自定义的焦点移动策略,这样当我专注于表格的最后一个单元格时,按Tab会将我带到下一个标签。我已经搜索了很多,但没有找到我可以使用的特定内容。 以下是我的自定义焦点遍历策略。 此外,这些JTables正在其他地方实例化,我已经覆盖了Tab键绑定,以便在最后一个单元格上专注于下一个组

    • 当用户点击某个元素或使用键盘上的 Tab 键选中时,该元素将会获得聚焦(focus)。还有一个 HTML 特性(attribute)autofocus 可以让焦点在网页加载时默认落在一个元素上,此外还有其它途径可以获得焦点。 聚焦到一个元素通常意味着:“准备在此处接受数据”,所以,这正是我们可以运行代码以初始化所需功能的时刻。 失去焦点的时刻(“blur”)可能更为重要。它可能发生在用户点击页面的

    • Focus聚焦社区是GoFrame社区项目,采用了简洁强大的GoFrame作为后端WEB框架, 由于前台系统需要SEO因此使用了GF自带template模板引擎,数据库用MySQL,前端使用jQuery/bootstrap框架。 一、源码地址 github:https://github.com/gogf/focus  gitee:https://gitee.com/johng/focus 二、演示

    • 问题内容: 我的项目包括Selenium Webdriver,JAVA,Maven,TestNG,Jenkins,Allure(报告)。我有几套包含100多个测试用例的测试,并通过3种不同的浏览器进行了迭代(测试使用TestNG并行运行)。 除非我实际上正在观察窗口并查看测试运行,否则无法通过一项测试。 我将解释: 我要测试什么? 我们的JS开发人员创建了一项功能,仅当用户将焦点放在窗口上时,图像

    • 问题内容: 有谁知道xlib函数可以在不失去原始焦点的情况下捕获按键事件?如何摆脱它? (或“使用XGrabKey()而不生成Grab样式的聚焦”?) (或“如何在系统级别摆脱NotifyGrab和NotifyUngrab焦点事件?) XGrabKey将失去对按键的关注,而将精力恢复于释放的键。 而且我想捕获按键而不泄漏到原始窗口(就像XGrabKey可以做到的一样)。 参考文献: … XGrab