- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我扩展了 DocumentFilter 类,以将要输入的字符数限制为文本字段中的指定数量。这是我的 SSCE:
主类:
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.net.*;
import java.io.*;
import java.util.Date;
import java.util.StringTokenizer;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.text.PlainDocument;
public class Sandbox implements Runnable {
private JFrame frame;
private JTextField inputField;
private JButton searchButton;
private int MAX_CHAR_LIMIT = 1;
public Sandbox() {
inputField = new JTextField();
inputField.setColumns(10);
inputField.setFont(new Font(null, Font.BOLD, 20));
}
@Override
public void run() {
frame = new JFrame("SSCE");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(500, 300));
PlainDocument doc = (PlainDocument) inputField.getDocument();
doc.setDocumentFilter(new DocumentCharLimitFilter(MAX_CHAR_LIMIT));
frame.getContentPane().setLayout(new FlowLayout());
frame.getContentPane().add(inputField);
frame.pack();
frame.setVisible(true);
}
public static void main(String args[]) {
SwingUtilities.invokeLater(new Sandbox());
}
}
DocumentCharLimitFilter 类
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
public class DocumentCharLimitFilter extends DocumentFilter {
private int MAX_CHAR_LIMIT;
public DocumentCharLimitFilter(int maxChars) {
this.MAX_CHAR_LIMIT = maxChars;
}
// You don't need insertString() when entering text in JTextField.
@Override
public void replace(FilterBypass fb, int offset, int length, String newText, AttributeSet aSet) throws BadLocationException {
int oldTextLength = fb.getDocument().getLength();
String oldText = fb.getDocument().getText(0, oldTextLength);
String combinedText = oldText + newText;
if (combinedText.length() <= MAX_CHAR_LIMIT) {
super.replace(fb, offset, length, newText, aSet);
// paste characters upto maximum allowed limit
} else if (oldTextLength < MAX_CHAR_LIMIT) {
int cutPosition = MAX_CHAR_LIMIT - oldTextLength;
String cutToFit = newText.substring(0, cutPosition);
super.replace(fb, offset, length, cutToFit, aSet);
} else {
System.out.println("Character limit of " + MAX_CHAR_LIMIT + " exceeded.");
}
}
}
当我启动上述程序并尝试使用 Ctrl+V 将一些新字符粘贴到现有字符之上时,它会将我带到 DocumentCharLimitFilter 的 Replace() 方法的 else 循环,我得到:
Character limit of 1 exceeded.
根据我对这一切的理解,我使用鼠标和 Ctrl+V 粘贴的新字符被视为现有字符之上的附加字符,并且我收到上述消息。当我使用键盘输入字符时,它工作得很好。如果我将 MAX_CHAR_LIMIT 增加到 2,我可以粘贴文本,但现在当我从键盘输入时,我可以输入两个我不想要的字符。
如何使上述代码的工作方式类似于正常粘贴到现有文本之上并替换它,使用 Ctr + V 并将键盘字符限制为指定的限制?我是 Java 初学者。如果我需要提供任何信息,我会很乐意这样做。谢谢。
更新:@camickr、@VGR 非常感谢!我没有注意 replace()
方法中的 length
参数。这是我在 DocumentCharLimitFilter 类中所做的:
@Override
public void replace(FilterBypass fb, int offset, int length, String newText, AttributeSet aSet) throws BadLocationException {
System.out.println(fb.getClass());
int oldTextLength = fb.getDocument().getLength();
String oldText = fb.getDocument().getText(0, oldTextLength);
String combinedText = oldText + newText;
if (combinedText.length() <= MAX_CHAR_LIMIT) {
super.replace(fb, offset, length, newText, aSet);
// paste characters upto maximum allowed limit
} else if (oldTextLength < MAX_CHAR_LIMIT) {
int cutPosition = MAX_CHAR_LIMIT - oldTextLength;
String cutToFit = newText.substring(0, cutPosition);
super.replace(fb, offset, length, cutToFit, aSet);
// NEW CODE
// http://stackoverflow.com/questions/42512743/pasting-replacing-a-character-using-mouse-selection-in-java-textfield-with-spec
// length indicates number of characters highlighted using mouse or keyboard. This will work only when
// the entire text is highlighted (if entire text is not highlighted, it would get complicated)
// and when it is highlighted, I make sure that the new text to be pasted is within limits of the MAX_CHAR_LIMIT
} else if (length == MAX_CHAR_LIMIT) {
String correctedString = newText;
if (newText.length() > MAX_CHAR_LIMIT) {
correctedString = newText.substring(0, MAX_CHAR_LIMIT);
}
super.replace(fb, offset, length, correctedString, aSet);
} else {
System.out.println("Entered characters exceed specified limit of " + MAX_CHAR_LIMIT + "exceeded.");
}
}
最佳答案
您忽略了传递给替换方法的length
参数,该参数包含要替换的现有字符数。
如果您在 JTextField 中突出显示一个或多个字符,然后键入或粘贴一些新文本,length
将包含一个正值。 JTextField 内容的新长度将为 oldTextLength - length + newText.length()
(除非您更改它)。
关于java - 在 Java 文本字段中使用鼠标选择粘贴/替换字符(具有指定的字符限制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42512743/
我正在遵循一个教程,老师通过以下方式将 html 粘贴到我们的 scrappy shell 中:%paste (下面的 html) html_doc = " " Title of hte page
例如 1.1.1.1 a.com 2.1.1.1 b.com 1.3.1.1 c.com 1.1.5.1 d.com 1.2.1.1 e.com 现在我想从另一个文本中替换这个 ip,不一样
是否有机会在 Angular 中实现粘贴按钮。 FE:用户复制网站的链接,当他或她点击按钮时,在我的页面上复制的链接应该出现在文本框中。 谢谢! 最佳答案 您只能以编程方式从网页复制。您不能以编程方式
我正在尝试提高 Vim 中粘贴功能的可用性,因为太多不同的删除操作(实际上我认为它们都是这样)也会拉到粘贴缓冲区。 这意味着我不再能够删除一些我想粘贴到某处的文本,清理一些东西,以及。然后 做我的粘贴
我正在构建一个简单的 Electron 应用程序,以在屏幕上的其他所有内容上显示一些文本。 有一个键盘快捷键可以打开带有文本的弹出窗口。 我想添加一个小功能。 最好的情况是:在计算机上的任意位置选择一
我有一个双击事件,我希望它保存特定范围的副本。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boo
我已经为这个烦人的问题苦苦挣扎了一段时间,但没有找到一个优雅的解决方案。 假设我有这样一个类层次结构: class StatWithBounds[A](val min: A, val max: A,
现在我有一个 Word 宏,可以通过将图像复制并粘贴到该位置来将图像移动到特定文本前面。这种方法效果很好,但成本很高。如果我的 Word 文档中有 1,000 张图像,则运行宏可能需要 30 分钟。
让我以我是自学成才的事实作为我的问题的开头,所以请提供尽可能详细的信息,如果我需要您以不同的方式或多次解释,请耐心等待。 我使用 Microsoft Visual Basic 7.0 为我的团队创建了
我已经为这个烦人的问题苦苦挣扎了一段时间,但没有找到一个优雅的解决方案。 假设我有这样一个类层次结构: class StatWithBounds[A](val min: A, val max: A,
我正在使用 Meteor 开发一个聊天应用程序,我不希望用户能够出于明显的垃圾邮件原因将内容复制/粘贴到表单中。这可能吗?这是我用来运行聊天应用程序的代码: Javascript: // render
我已经为此搜索了很多,但找不到任何建议...我提供了我自己的经典操作栏实现,所以我在所有 Activity 中声明粘贴/等..有谁知道如何做到这一点? 此外,我将提供我自己的复制/粘贴功能,并且仅在需
Windows 中 SWT Text 的默认上下文菜单有几个我们不想要的选项。由于操作系统提供的默认上下文菜单无法修改,因此我创建了一个自定义上下文菜单,其中只有基本的文本操作,例如文本框的删除、剪切
我最后的问题不是很清楚,我再试一次。 在我的 Tumblr 博客 (http://anti-standard.tumblr.com) 上,您可以看到一张图片(图片上写着“ANTI STANDARD”)
我必须编写一个脚本文件来剪切以下列并将其粘贴到新 .arff 文件中同一行的末尾。我想文件类型无关紧要。 当前文件: 63,male,typ_angina,145,233,t,left_vent_hy
是否可以发送过去的命令,以便将文本粘贴到当前聚焦的编辑文本中。场景: 后台服务监听通知(完成) 收到通知后,需要将文本复制到剪贴板(完成) 将文本粘贴到任何当前聚焦的字段,如果不可能则放弃粘贴命令。
我想用 PIL 粘贴一堆图片。出于某种原因,当我运行 blank.paste(img,(i*128,j*128)) 行时,出现以下错误:ValueError: cannot determine reg
如何在我的网页中禁用复制粘贴功能。准确地说,我不希望我的用户从我的网站上复制任何信息并将其用于个人目的。上一个关于同一主题的问题没有给出足够的解释。 onselect 和 ondrag 不起作用。请帮
废话不多说,直接上代码,小伙伴们仔细看下注释吧。 复制代码代码如下: /*简单的 复制 剪切 粘贴 功能 操作:
我应该在 vimrc 中添加哪一行以便在终端之间或不同文件/选项卡之间轻松复制/粘贴? 我现在有: " Better copy & paste set pastetoggle= set clipboa
我是一名优秀的程序员,十分优秀!