Tôi gặp rắc rối với chiếc mặt nạ trong một JFormattedTextFieldrắc rối với xóa trong mặt nạ trong một JFormattedTextField
Tôi hiểu rằng nó sẽ thay thế ký tự không hợp lệ với một không gian, hoặc bất cứ điều gì bạn xác định qua setPlaceholderCharacter, nhưng những gì tôi cần nó để làm là cho phép xóa hoặc backspace, và KHÔNG chèn khoảng trắng vào vị trí của ký tự tôi đã xóa miễn là phần còn lại của chuỗi được cho phép trong mặt nạ. Ví dụ, với mặt nạ: *#*****
, chuỗi "12 abc"
là hợp lệ.
Nếu bạn đặt con trỏ giữa các ký tự b và c và nhấn nút backspace, tôi cần nó để xóa dấu b, dẫn đến "12 ac"
. Thay vào đó, nó xóa nó và thêm khoảng trắng, trở thành: "12 a c"
.
Ví dụ mã đơn giản bên dưới để minh họa.
Tôi sẽ đánh giá cao bất kỳ suy nghĩ hoặc ví dụ nào để giải quyết vấn đề này.
public class testFrame extends javax.swing.JFrame {
public testFrame() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
getContentPane().setLayout(new java.awt.FlowLayout());
setMinimumSize(new Dimension(300,150));
java.awt.Button closeButton = new java.awt.Button();
JFormattedTextField maskTextField = new JFormattedTextField();
maskTextField.setMinimumSize(new Dimension(100,30));
getContentPane().add(maskTextField);
closeButton.setLabel("close");
closeButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
});
getContentPane().add(closeButton);
try {
MaskFormatter someMask = new MaskFormatter("*#****");
DefaultFormatterFactory formatterFactory
= new DefaultFormatterFactory(someMask);
maskTextField.setFormatterFactory(formatterFactory);
} catch (ParseException ex) {
ex.printStackTrace();
}
maskTextField.setText("12 abc");
pack();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new testFrame().setVisible(true);
}
});
}
}
Đang cập nhật mã để phản ánh câu trả lời dưới đây. Tôi đã thêm một trường thứ hai để bạn có thể thấy hành vi có và không có bản sửa lỗi. Ngoài ra một sửa chữa nhỏ, tôi thay đổi kích thước các cửa sổ và tập trung nó vào màn hình để làm cho nó thân thiện hơn.
public class TestFrame kéo dài javax.swing.Jframe {
public testFrame() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setMinimumSize(new java.awt.Dimension(300, 200));
getContentPane().setLayout(new java.awt.FlowLayout());
JFormattedTextField maskTextField = new JFormattedTextField();
maskTextField.setMinimumSize(new Dimension(100,30));
getContentPane().add(maskTextField);
JFormattedTextField maskTextField2 = new JFormattedTextField();
maskTextField2.setMinimumSize(new Dimension(100,30));
getContentPane().add(maskTextField2);
java.awt.Button closeButton = new java.awt.Button();
closeButton.setLabel("close");
closeButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
});
getContentPane().add(closeButton);
try {
MaskFormatter someMask = new MaskFormatter("*#****");
DefaultFormatterFactory formatterFactory =
new DefaultFormatterFactory(someMask);
maskTextField.setFormatterFactory(formatterFactory);
MaskFormatter someMask2 = new MaskFormatter("*#****");
DefaultFormatterFactory formatterFactory2 =
new DefaultFormatterFactory(someMask2);
maskTextField2.setFormatterFactory(formatterFactory2);
} catch (ParseException ex) {
ex.printStackTrace();
}
maskTextField.setText("12 abc");
maskTextField2.setText("12 abc");
// added per suggestion below
if (maskTextField.getFormatter() instanceof DefaultFormatter) {
DefaultFormatter f = (DefaultFormatter) maskTextField.getFormatter();
f.setAllowsInvalid(true);
// options are:
// JFormattedTextField.COMMIT
// JFormattedTextField.COMMIT_OR_REVERT --> default
// JFormattedTextField.REVERT
// JFormattedTextField.PERSIST
maskTextField.setFocusLostBehavior(JFormattedTextField.PERSIST);
}
pack();
this.setLocationRelativeTo(null);
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new testFrame().setVisible(true);
}
});
}
}
âm thanh như một quan niệm sai lầm nhỏ: một mặt nạ là một cái gì đó với một lenght_ _fixed, mỗi vị trí điền hoặc bằng một ký tự hợp lệ hoặc một placeHolder. Khi xóa một char, nó được thay thế bởi placeHolder, trong ví dụ của bạn là mặc định là một khoảng trắng. Vì vậy, không gian đầu tiên là khác nhau từ thứ hai, ngữ nghĩa :-) Thay đổi placeHolder để cái gì khác, để thấy sự khác biệt đó.Khi yêu cầu của bạn có vẻ giống như bất kỳ thứ gì-char-up-to-a-max-of-4-sau-chữ số, bạn sẽ phải triển khai trình định dạng tùy chỉnh như @DuncanJones đã đề xuất – kleopatra
Tôi không quan tâm nó là chiều dài cố định, và tôi đoán tôi chỉ có một trường hợp sử dụng đặc biệt mà họ không phục vụ cho. Ví dụ: nếu mặt nạ của bạn là (###) ### - ### và bạn đang cố gắng nhập (123) 456-7890 và vô tình nhập vào hai 2 giây, nghĩa là (122) 345-6789, mặt nạ chuẩn hành vi dường như có nghĩa là nếu bạn xóa 2 đầu tiên, nó sẽ thay thế một không gian (trình giữ chỗ) cho bạn (12) 345-6789. Tôi cần nó để xóa ký tự và thêm phần giữ chỗ ở cuối chuỗi thay thế. Nhưng tôi đoán đây không phải là thứ mà người khác cần vì vậy tôi sẽ phải tạo một bộ định dạng tùy chỉnh: ( –
ahh ... Tôi hiểu, cảm ơn vì đã làm rõ số – kleopatra