gpt4 book ai didi

java - 在 JTabbedPane 中聚焦 JTextArea

转载 作者:搜寻专家 更新时间:2023-11-01 02:49:09 24 4
gpt4 key购买 nike

我正在用 Java 编写一个聊天客户端程序,我想在其中为所有打开的聊天提供一个 JDialog。所以我决定使用 JTabbedPane,其中一个选项卡代表一个聊天。

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

为了更好的可用性,我实现了一个在以下情况下关注 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();
}

好了,tab切换时的焦点就到这里了。除此之外,我还实现了在创建新的聊天选项卡时聚焦 JTextArea。这是在 ChatWindowController 类中处理的。当我将新选项卡添加到 ChatWindow 类时,我调用了一个方法 setChatVisible():

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

chatWindow.focusInputField();
}
}

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

有人知道问题出在哪里吗?我真的没主意了。

最佳答案

间歇性失败可能是由于不正确的同步造成的。有几件事应该批判性地检查:

  • 确认您在 event dispatch thread 上构建了所​​有 GUI 元素(美国东部时间)。

  • 因为您确实在使用多线程,请验证所有更新都发生在 EDT 上,对于 example .

  • 您可以使用 invokeLater() 对 EDT 上的事件进行排序,如图所示 here .

  • 首选 requestFocusInWindow()requestFocus() 上,但不要同时使用两者。

关于java - 在 JTabbedPane 中聚焦 JTextArea,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14922691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com