问题:我想知道是否可以从DocumentFilter获取JTextfield类型
我读过java文档,搜索了很多,但没有找到任何信息。
需要:我在两个JTextfields上设置了相同的DocumentFilter。当事件发生时,在DocumentFilter的“replace”方法中,我想知道哪个textfield导致了事件。
用例:我有大约15个文本字段(未来可能会增加),我希望对所有这些字段进行单独检查:
-输入的最大文本长度
-只需输入某些字符(这对所有文本字段都是相同的)
例如:textfield1最多可以使用10个字符,而textfield2最多可以使用5个字符。
到目前为止,我所做的是:
我为每个文本字段创建了单独的过滤器,这会导致大量冗余代码并增加处理的复杂性,以供将来使用。
期待任何帮助。:-)
好的,现在您的需求更明确了,但是,再一次,您不能(也不应该)检查您从DocumentFilter
内部输入的文本字段来决定在您的中做什么替换()
方法。
可能的解决方案:创建自己的DocumentFilter
类,传递所有需要的参数(最大文本长度,可能还有一个禁止字符数组,或者其他任何参数)。所有文本字段都将有一个独特的DocumentFilter
实例,其参数设置将满足您的需要。这样,您将获得一个干净的解决方案,而不需要冗余代码。
例如:
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.DocumentFilter;
public class FilterTextField
{
public static void main (String [] a) {
SwingUtilities.invokeLater (new Runnable () {
@Override public void run () {
createAndShowGUI ();
}
});
}
private static void createAndShowGUI () {
JFrame frame = new JFrame ("Test");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.setContentPane (new MainPanel ());
frame.pack ();
frame.setLocationRelativeTo (null);
frame.setVisible (true);
}
}
class MainPanel extends JPanel
{
public MainPanel () {
super (new GridLayout (3, 1, 0, 20));
JTextField t1 = new JTextField (20);
JTextField t2 = new JTextField (20);
JTextField t3 = new JTextField (20);
((AbstractDocument) t1.getDocument ()).setDocumentFilter (new MyDocumentFilter (5));
((AbstractDocument) t2.getDocument ()).setDocumentFilter (new MyDocumentFilter (10, '!', '?'));
((AbstractDocument) t3.getDocument ()).setDocumentFilter (new MyDocumentFilter (15, new char [] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}));
add (t1);
add (t2);
add (t3);
setBorder (new EmptyBorder (20, 20, 20, 20));
}
}
class MyDocumentFilter extends DocumentFilter
{
private char [] forbiddenCharacters;
private int maximumLength;
public MyDocumentFilter (int maximumLength, char ... forbiddenCharacters) {
this.maximumLength = maximumLength;
this.forbiddenCharacters = forbiddenCharacters;
}
@Override public void replace (FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
// Get the full text you would have after replacement
Document document = fb.getDocument ();
String fullText = new StringBuilder (document.getText (0, document.getLength ())).replace (offset, offset + length, text).toString ();
// Check your requirements ...
if (fullText.length () <= maximumLength) {
if (forbiddenCharacters != null) {
for (char c : forbiddenCharacters) if (fullText.indexOf (c) > -1) return;
}
// Replace method is called only if your requirements are met.
super.replace (fb, offset, length, text, attrs);
}
}
}
我在做一个数独游戏,我有“cell”类型的9x9对象(类扩展了JTextField),我想防止在用户不符合游戏规则的情况下关注其他JTextField对象——他的输入(1-9)不会在同一行或同一个“块”。要做到这一点,我需要知道他关注的具体对象。 我正在考虑这样做的一种方法是使用DocumentFilter。我已经将输入过滤为数字和1长度,但我不知道如何获取他关注的“单元格”对象,我很确定Docu
假设我有一个Jextfield数组(例如JTextfield[10])。我将它们添加到框架中。现在用户在文本字段中随机输入文本,例如用户首先输入索引为5的文本字段,然后是9,然后是2,依此类推。不一定要填充所有的文本字段。 我的问题是,如何获取文本字段的索引,并在用户输入文本时同时打印索引,这意味着如果用户在文本字段中输入索引5,我应该能够获得索引5,然后如果填充了索引9的文本字段,则打印9,依此
问题内容: 在一个项目上,我通过一个类似于控制台的小窗口运行Java应用程序。由于这里有一个很棒的社区,我设法通过从流程输出数据来解决问题,但是由于没有输入流,我运行的命令行应用程序将不断出错。 基于该线程中最后一个有用的答复,我想我将以类似的方式实现该实现,但是在javadocs中以及整个google和互联网中寻找某个类,该类确实没有发现任何解释方法。 因此,我需要一些链接,示例,教程,示例代码
StackPane容器=fxmlLoader.load(getClass().getResource(“fxmlDocument.fxml”)等。 我如何在控制器传递中获得我的根节点或stackpane?
我正在与Avro合作,我有一个通用记录。我想从中提取clientId、deviceName、holder。在Avro模式中,
\这是JTextField的创建: 这是我的DocumentFilter: 这会自动从JTextField中删除所有字母和字符。 然而,我想知道是否有人知道有一个地方的所有命令都类似于“\D”。我花了一段时间才找到正确的信息。 另外,我现在的代码也可以防止。当我和替身一起工作时,我需要的那种类型。有什么想法吗? 谢谢!我今天学到了这么多,真是太神奇了。我已经连续编码了13个小时。