gpt4 book ai didi

java - 将某些字符/键的输入重新映射到 JTextComponent 的最佳方法?

转载 作者:行者123 更新时间:2023-11-30 04:26:15 25 4
gpt4 key购买 nike

我正在开发一个JTextPane,它的工作方式(几乎)与 stackoverflow 上的标签输入字段完全相同。为此,一旦用户点击 Enter、Tab 或 Space,我就会将文本转换为组件。当然,我不希望任何这些字符实际输入到文本 Pane 中。我找到了这个解决方案,SSCCE:

import java.awt.Color;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextPane;
import javax.swing.KeyStroke;
import javax.swing.text.BadLocationException;
import javax.swing.text.Element;
import javax.swing.text.StyledDocument;

@SuppressWarnings("serial")
public class TagTextPane extends JTextPane {

public TagTextPane() {
this.getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "finalizeTag");
this.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "finalizeTag");
this.getInputMap().put(KeyStroke.getKeyStroke("TAB"), "focusNext");
this.getActionMap().put("focusNext", new AbstractAction() {

@Override
public void actionPerformed(ActionEvent arg0) {
finalizeTag();
transferFocus();
}
});
this.getActionMap().put("finalizeTag", new AbstractAction() {

@Override
public void actionPerformed(ActionEvent e) {
finalizeTag();
}
});
}

private void finalizeTag() {
StyledDocument doc = (StyledDocument) getDocument();
Element element = doc.getCharacterElement(getCaretPosition() - 1);
int start = element.getStartOffset();
int len = element.getEndOffset() - start;
String tag = "";
try {
tag = this.getDocument().getText(start, len);
} catch (BadLocationException e) {
}
this.setSelectionStart(start);
this.setSelectionEnd(start + len);
JLabel label = new JLabel(tag);
label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
this.insertComponent(label);
}

public static void main(String[] args) {
JFrame frame = new JFrame("TagTextPaneTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TagTextPane tPane = new TagTextPane();
frame.setSize(400, 100);
frame.getContentPane().add(tPane);
frame.setVisible(true);
}
}

点击“tab”通常会导致插入制表符,点击“enter”通常会导致输入换行符,点击“space”则会导致输入空格。奇怪的是,我的代码停止输入换行符和制表符,但在执行预期操作时仍然允许正常输入空格。

  1. 为什么此方法对这些键的行为有所不同?

  2. 如何阻止该空间被输入? (也许我想稍后将这种行为扩展到逗号等。)

  3. 如何以最佳方式控制 JTextComponent 中某些字符和击键的行为?我见过this ,其中建议使用 KeyListener,但我也看到 this ,其中 Rob Camick 指出,为什么不应使用 KeyListener。那么我应该使用 DocumentFilter,还是会破坏轮子上的蝴蝶?

  4. 这是否是构建此类标签输入字段的最佳方式?

最佳答案

this.getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "finalizeTag");

这是处理空格字符的 keyPressed 事件。

您想要处理空格字符的 keyTyped 事件:

this.getInputMap().put(KeyStroke.getKeyStroke(' '), "finalizeTag");

关于java - 将某些字符/键的输入重新映射到 JTextComponent 的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15785107/

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